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