#python #pandas #scikit-learn #tf-idf #tfidfvectorizer
#python #панды #scikit-learn #tf-idf #tfidfvectorizer
Вопрос:
Я пытаюсь получить слова с 10 наивысшими оценками TF-IDF для каждого документа.
У меня есть столбец в моем фрейме данных, который содержит предварительно обработанный текст (без знаков препинания, стоп-слов и т.д.) Из моих различных документов. В этом примере одна строка означает один документ.
В нем более 500 строк, и мне интересно узнать о самых важных словах в каждой строке.
Итак, я выполнил следующий код:
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer()
vectors = vectorizer.fit_transform(df['liststring'])
feature_names = vectorizer.get_feature_names()
dense = vectors.todense()
denselist = dense.tolist()
df2 = pd.DataFrame(denselist, columns=feature_names)
Что дает мне матрицу TF-IDF:
Мой вопрос в том, как я могу собрать 10 лучших слов с наибольшим значением TF-IDF? Было бы неплохо создать столбец в моем исходном фрейме данных (df), который содержит 10 лучших слов для каждой строки, но также знает, какие слова являются наиболее важными в целом.
Ответ №1:
Минимальный воспроизводимый пример для 20newsgroups
набора данных:
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
X,y = fetch_20newsgroups(return_X_y = True)
tfidf = TfidfVectorizer()
X_tfidf = tfidf.fit_transform(X).toarray()
vocab = tfidf.vocabulary_
reverse_vocab = {v:k for k,v in vocab.items()}
feature_names = tfidf.get_feature_names()
df_tfidf = pd.DataFrame(X_tfidf, columns = feature_names)
idx = X_tfidf.argsort(axis=1)
tfidf_max10 = idx[:,-10:]
df_tfidf['top10'] = [[reverse_vocab.get(item) for item in row] for row in tfidf_max10 ]
df_tfidf['top10']
0 [this, was, funky, rac3, bricklin, tellme, umd...
1 [1qvfo9innc3s, upgrade, experiences, carson, k...
2 [heard, anybody, 160, display, willis, powerbo...
3 [joe, green, csd, iastate, jgreen, amber, p900...
4 [tom, n3p, c5owcb, expected, std, launch, jona...
...
11309 [millie, diagnosis, headache, factory, scan, j...
11310 [plus, jiggling, screen, bodin, blank, mac, wi...
11311 [weight, ended, vertical, socket, the, westes,...
11312 [central, steven, steve, collins, bolson, hcrl...
11313 [california, kjg, 2101240, willow, jh2sc281xpm...
Name: top10, Length: 11314, dtype: object
Чтобы получить 10 лучших функций с самым высоким значением TfIdf, пожалуйста, используйте:
global_top10_idx = X_tfidf.max(axis=0).argsort()[-10:]
np.asarray(feature_names)[global_top10_idx]
Пожалуйста, спросите, если что-то непонятно.
Комментарии:
1. Большое вам спасибо, Сергей, я действительно ценю ваше подробное решение! Это очень хорошо работает с моими данными, за исключением того, что в итоге глобальные 10 лучших слов, к сожалению, не дают правильных результатов. Я проверил, что экспортировал df_tfidf[‘top10’] в excel, затем я сделал сводку и получил разные результаты, но я уверен, что df_tfidf [‘top10’] верен. Похоже, если бы это было в алфавитном порядке, потому что все слова начинаются с буквы «a» в моем наборе данных, а в вашем наборе данных 20newsgroups все слова являются числами.
2. Можете ли вы попробовать
global_top10_idx = X_tfidf.max(axis=0).argsort()[-10:]
, пожалуйста?3. К сожалению, это тоже не работает должным образом, но я получил правильный результат со следующим кодом:
import collections slist = [] for x in df_tfidf ['top10']: slist.extend (x) counter = collections.Counter (slist) print (counter.most_common (n = 10))
4. Я подозреваю, что у нас разные определения того, что такое top10 слов во всем мире. Мои — это те, у которых самый высокий столбец tfidf. Вам решать выбрать тот, который вам удобен. В любом случае мой оригинал был неправильным из любого определения. Спасибо, что указали на это!
5. @VenkateshGandi Я советую вам задать это как вопрос и закрепить меня