Получите веса слов tf-idf с помощью sklearn

У меня есть набор текстов из википедии.
Используя tf-idf, я могу определить вес каждого слова. Ниже приведен код:

import pandas as pd                                             
from sklearn.feature_extraction.text import TfidfVectorizer

wiki = pd.read_csv('people_wiki.csv')

tfidf_vectorizer = TfidfVectorizer(max_features= 1000000)
tfidf = tfidf_vectorizer.fit_transform(wiki['text'])

Цель состоит в том, чтобы увидеть веса, как показано в столбце tf-idf:

введите здесь описание изображения

Файл «people_wiki.csv» находится здесь:

https://ufile.io/udg1y


person nunodsousa    schedule 21.07.2017    source источник


Ответы (1)


TfidfVectorizer имеет атрибут vocabulary_, который очень полезен для ваших целей. Этот атрибут представляет собой словарь со словами в качестве ключей и соответствующим индексом столбца, который имеет это слово в качестве значения.

В приведенном ниже примере мне нужен обратный словарь, для которого я использую понимание словаря.

tfidf_vec = TfidfVectorizer()
transformed = tfidf_vec.fit_transform(raw_documents=['this is a quick example','just to show off'])
index_value={i[1]:i[0] for i in tfidf_vec.vocabulary_.items()}

index_value в дальнейшем будет использоваться как таблица поиска.

fit_transform возвращает матрицу формата Compressed Sparse Row. Атрибуты, которые полезны для того, чего вы хотите достичь, это indices и data. indices возвращает все индексы, которые фактически содержат данные, а data возвращает все данные в этих индексах.

Перебираем возвращенную разреженную матрицу transformed следующим образом.

fully_indexed = []
for row in transformed:
    fully_indexed.append({index_value[column]:value for (column,value) in zip(row.indices,row.data)})

возвращает список словарей со следующим содержимым.

[{'example': 0.5, 'is': 0.5, 'quick': 0.5, 'this': 0.5},
 {'just': 0.5, 'off': 0.5, 'show': 0.5, 'to': 0.5}]

Обратите внимание, что при таком способе возвращаются только слова, которые имеют ненулевое значение для определенного документа. Глядя на первый документ в моем примере, в словаре нет пары ключ-значение 'just', 0.0. Если вы хотите включить их, вам нужно немного настроить окончательное понимание словаря.

Вот так

fully_indexed = []
transformed = np.array(transformed.todense())
for row in transformed:
    fully_indexed.append({index_value[column]:value for (column,value) in enumerate(row)})

Мы создаем плотную версию матрицы, поскольку цикл массива numpy по каждой строке массива numpy перечисляет содержимое, а затем заполняет список словарей. В результате на выходе будут включены все слова, отсутствующие в документе.

[{'example': 0.5,'is': 0.5,'just': 0.0,'off': 0.0,'quick': 0.5,'show': 0.0,'this': 0.5,'to': 0.0},
 {'example': 0.0,'is': 0.0,'just': 0.5,'off': 0.5,'quick': 0.0,'show': 0.5,'this': 0.0,'to': 0.5}]

Затем вы можете добавить словари в свой фрейм данных.

df['tf_idf'] = fully_indexed
person error    schedule 21.07.2017