Какие 10 слов имеют наибольшее значение TF-IDF в каждом документе / всего?

#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:

матрица 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 Я советую вам задать это как вопрос и закрепить меня