Объедините Sklearn TFIDF с дополнительными данными

Я пытаюсь подготовить данные для контролируемого обучения. У меня есть данные Tfidf, которые были сгенерированы из столбца в моем фрейме данных под названием «объединенный».

vect = TfidfVectorizer(stop_words='english', use_idf=True, min_df=50, ngram_range=(1,2))
X = vect.fit_transform(merged['kws_name_desc'])
print X.shape
print type(X)

(57629, 11947)
<class 'scipy.sparse.csr.csr_matrix'>

Но мне также нужно добавить в эту матрицу дополнительные столбцы. Для каждого документа в матрице TFIDF у меня есть список дополнительных числовых характеристик. Каждый список имеет длину 40 и состоит из поплавков.

Итак, для уточнения, у меня есть 57 629 списков длиной 40, которые я хотел бы добавить к моему результату TDIDF.

В настоящее время у меня есть это в DataFrame, пример данных: merged["other_data"]. Ниже приведен пример строки из файла merged["other_data"]

0.4329597715,0.3637511039,0.4893141843,0.35840...   

Как я могу добавить 57 629 строк моего столбца данных с матрицей TF-IDF? Честно говоря, я не знаю, с чего начать, и был бы признателен за любые указатели/рекомендации.


person jrjames83    schedule 13.11.2016    source источник
comment
Отвечает ли это на ваш вопрос? используйте Featureunion в scikit-learn для объединения два столбца pandas для tfidf   -  person louis_guitton    schedule 19.04.2020


Ответы (3)


Это сделает работу.

`df1 = pd.DataFrame(X.toarray())   //Convert sparse matrix to array
 df2 = YOUR_DF of size 57k x 40

 newDf = pd.concat([df1, df2], axis = 1)`//newDf is the required dataframe
person eshb    schedule 25.11.2016

Я понял:

Во-первых: перебрать мой столбец pandas и создать список списков

for_np = []

for x in merged['other_data']:
    row = x.split(",")
    row2 = map(float, row)
    for_np.append(row2)

Затем создайте массив np:

n = np.array(for_np)

Затем используйте scipy.sparse.hstack на X (моя исходная разреженная матрица tfidf и моя новая матрица. Я, вероятно, в конечном итоге перевзвешиваю эти 40-мерные векторы, если они не улучшат результаты классификации, но этот подход сработал!

import scipy.sparse

X = scipy.sparse.hstack([X, n])
person jrjames83    schedule 13.11.2016
comment
Я уверен, что огляделся и упустил из виду то, что мне не хватало, пытаясь добавить столбец. Кто-то по другому вопросу дал понять, но просто щелкнул по этой строке выше. - person pierre; 28.06.2018
comment
oups нажал return, hstack(X_train_tfidf,X_shp) не сработал, но hstack([X_train_tfidf,X_shp]) сработал, и разница в [ ]. - person pierre; 28.06.2018
comment
Это был действительно интересный вопрос и решение. Можете ли вы добавить некоторые идеи о том, масштабировали ли вы дополнительные столбцы или использовали их как есть? - person lu5er; 22.01.2019
comment
@ IU5er IU5er - если я правильно помню, я экспериментировал с различными весами для функций tfidf, но они не сильно улучшили мои результаты, поэтому я отказался от них. Я мог бы, возможно, добавить версию результатов PCA, но результат, вероятно, был бы таким же. Я думаю, что объединение функций стиля НЛП с более общими функциями по-прежнему остается довольно открытой проблемой / проблемой. В более поздней задаче я создал бинарные признаки, основанные на том, содержит ли тренировочное наблюдение слово или одно из многих слов, таким образом избегая множества новых признаков. - person jrjames83; 22.01.2019

Вы можете посмотреть ответ на этот вопрос:

используйте Featureunion в scikit-learn для объединения два столбца pandas для tfidf

Очевидно, что данные ответы должны работать, но как только вы хотите, чтобы ваш классификатор делал прогнозы, вы определенно хотите работать с конвейерами и объединениями функций.

person thomi    schedule 17.01.2017