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

Posted

技术标签:

【中文标题】sklearn : TFIDF Transformer : 如何获取文档中给定单词的 tf-idf 值【英文标题】:sklearn : TFIDF Transformer : How to get tf-idf values of given words in document 【发布时间】:2016-03-30 16:22:36 【问题描述】:

我使用 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_train_tf 是一个scipy.sparse 形状为(2257, 35788) 的矩阵。

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

【问题讨论】:

【参考方案1】:

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

我们可以得到字典,其中 word 为 key,tfidf_score 为 value。

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

【讨论】:

【参考方案2】:

这是 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)

【讨论】:

我喜欢。比必须记住 Python 的无数“1 行神奇快捷方式”要直观得多【参考方案3】:

您可以使用来自 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_matix有语料库中所有文档的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

【讨论】:

如何获取 tf-idf 分数最高的单词?这对我有用,但我不完全理解最后一行发生了什么。 [tfidf_matrix[doc, x] for x in feature_index] 为您提供分数列表。我已经用它的索引压缩了它们,这样你就可以提取 feature_name(或单词)。您可以根据第二个元素(这里是分数)对 tfidf_scores 进行排序,以首先获得最大元素。 我可以知道如何打印对应的文件名吗? tfidf_matrix 是一个稀疏矩阵,每一行都是一个文档,例如,在答案中,我打印了第 0 个文档的 tf-idf 值。如果您保留一个文档名称数组,则可以通过相同的索引访问它。 为什么是 [doc,:] 而不仅仅是 [doc] ?它不只是在索引文档中切片整行吗?

以上是关于sklearn : TFIDF Transformer : 如何获取文档中给定单词的 tf-idf 值的主要内容,如果未能解决你的问题,请参考以下文章

TfidfVectorizer.fit_transfrom 和 tfidf.transform 有啥区别?

Tfidf 转换器(sklearn)导致:“类型不支持转换:(dtype('O'),)”

如何分析sklearn中tfidf矩阵的值?

使用 sklearn 计算两个不同列的单独 tfidf 分数

如何从管道中的 sklearn TFIDF Vectorizer 返回数据帧?

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