Python sklearn:TFIDF Transformer:如何获取文档中给定单词的tf-idf值

Python sklearn:TFIDF Transformer:如何获取文档中给定单词的tf-idf值,python,scikit-learn,Python,Scikit Learn,我使用sklearn计算文档的TFIDF(术语频率逆文档频率)值,命令如下: from sklearn.feature_extraction.text import CountVectorizer count_vect = CountVectorizer() X_train_counts = count_vect.fit_transform(documents) from sklearn.feature_extraction.text import TfidfTransformer tf_tra

我使用sklearn计算文档的TFIDF(术语频率逆文档频率)值,命令如下:

from sklearn.feature_extraction.text import CountVectorizer
count_vect = CountVectorizer()
X_train_counts = count_vect.fit_transform(documents)
from sklearn.feature_extraction.text import TfidfTransformer
tf_transformer = TfidfTransformer(use_idf=False).fit(X_train_counts)
X_train_tf = tf_transformer.transform(X_train_counts)
X\u train\u tf
是一个
scipy.sparse
形状矩阵
(22573578)


如何获取特定文档中单词的TF-IDF?更具体地说,如何在给定文档中获取具有最大TF-IDF值的单词?

您可以使用sklean的TfidfVectorizer

from sklearn.feature_extraction.text import TfidfVectorizer
import numpy as np
from scipy.sparse.csr import csr_matrix #need this if you want to save tfidf_matrix

tf = TfidfVectorizer(input='filename', analyzer='word', ngram_range=(1,6),
                     min_df = 0, stop_words = 'english', sublinear_tf=True)
tfidf_matrix =  tf.fit_transform(corpus)
上述tfidf矩阵具有语料库中所有文档的TF-IDF值。这是一个大的稀疏矩阵。现在,

feature_names = tf.get_feature_names()
这将为您提供所有标记或n-gram或单词的列表。 对于语料库中的第一个文档

doc = 0
feature_index = tfidf_matrix[doc,:].nonzero()[1]
tfidf_scores = zip(feature_index, [tfidf_matrix[doc, x] for x in feature_index])
让我们把它们打印出来

for w, s in [(feature_names[i], s) for (i, s) in tfidf_scores]:
  print w, s

下面是Python 3中另一个使用pandas库的简单解决方案

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

vect = TfidfVectorizer()
tfidf_matrix = vect.fit_transform(documents)
df = pd.DataFrame(tfidf_matrix.toarray(), columns = vect.get_feature_names())
print(df)

查找句子中每个单词的tfidf分数有助于执行搜索和语义匹配等下游任务

我们可以得到字典,其中单词作为键,tfidf_分数作为值

from sklearn.feature_extraction.text import TfidfVectorizer

tfidf = TfidfVectorizer(min_df=3)
tfidf.fit(list(subject_sentences.values()))
feature_names = tfidf.get_feature_names()
现在我们可以这样编写转换逻辑

def get_ifidf_for_words(text):
    tfidf_matrix= tfidf.transform([text]).todense()
    feature_index = tfidf_matrix[0,:].nonzero()[1]
    tfidf_scores = zip([feature_names[i] for i in feature_index], [tfidf_matrix[0, x] for x in feature_index])
    return dict(tfidf_scores)
例如,对于输入

text = "increase post character limit"
get_ifidf_for_words(text)
产出将是

{
'character': 0.5478868741621505,
'increase': 0.5487092618866405,
'limit': 0.5329156819959756,
'post': 0.33873144956352985
}

如何获得tf idf得分最高的单词?这对我来说是可行的,但我不完全理解最后一行的内容。[tfidf_矩阵[doc,x]for x in feature_index]为您提供了分数列表。我已经用它的索引压缩了它们,这样你就可以提取功能名称(或单词)。您可以根据第二个元素(此处为分数)对tfidf_分数进行排序,以首先获得最大元素。我可以知道如何打印相应的文件名吗?tfidf_矩阵是一个稀疏矩阵,每行都是一个文档,例如,在回答中,我打印了第0个文档的tf idf值。如果保留一个文档名数组,则可以通过相同的索引访问它。为什么是[doc,:],而不仅仅是[doc]?它不仅仅是在索引文档中切片整行吗?我喜欢它。比记住Python的无数“1行神奇快捷方式”直观得多