nlp - scikit-learn TfidfVectorizer 是如何计算 TF-IDF 的

标签 nlp scikit-learn tf-idf

我运行以下代码将文本矩阵转换为 TF-IDF 矩阵。

text = ['This is a string','This is another string','TFIDF computation calculation','TfIDF is the product of TF and IDF']

from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(max_df=1.0, min_df=1, stop_words='english',norm = None)

X = vectorizer.fit_transform(text)
X_vovab = vectorizer.get_feature_names()
X_mat = X.todense()
X_idf = vectorizer.idf_

我得到以下输出

X_vovab =

[u'calculation',
 u'computation',
 u'idf',
 u'product',
 u'string',
 u'tf',
 u'tfidf']

和 X_mat =

  ([[ 0.        ,  0.        ,  0.        ,  0.        ,  1.51082562,
      0.        ,  0.        ],
    [ 0.        ,  0.        ,  0.        ,  0.        ,  1.51082562,
      0.        ,  0.        ],
    [ 1.91629073,  1.91629073,  0.        ,  0.        ,  0.        ,
      0.        ,  1.51082562],
    [ 0.        ,  0.        ,  1.91629073,  1.91629073,  0.        ,
      1.91629073,  1.51082562]])

现在我不明白这些分数是如何计算的。我的想法是,对于文本[0],仅计算“字符串”的分数,并且第五列中有一个分数。但由于 TF_IDF 是词频 2 和 IDF log(4/2) 的乘积,因此是 1.39 而不是矩阵所示的 1.51。 scikit-learn 中的 TF-IDF 分数是如何计算的。

最佳答案

TF-IDF 是由 Scikit Learn 的 TfidfVectorizer 分多个步骤完成的,它实际上使用了 TfidfTransformer 并继承了 CountVectorizer。

让我总结一下它所执行的步骤,以使其更加简单:

  1. tfs由CountVectorizer的fit_transform()计算
  2. idfs由TfidfTransformer的fit()计算
  3. tfidfs由TfidfTransformer的transform()计算

可以查看源码here .

回到你的例子。以下是对词汇表第 5 个术语、第一个文档 (X_mat[0,4]) 的 tfidf 权重进行的计算:

首先,第一个文档中“字符串”的 tf:

tf = 1

第二,“字符串”的 idf,启用平滑(默认行为):

df = 2
N = 4
idf = ln(N + 1 / df + 1) + 1 = ln (5 / 3) + 1 = 1.5108256238

最后,(文档 0,特征 4)的 tfidf 权重:

tfidf(0,4) = tf * idf = 1 * 1.5108256238 = 1.5108256238

我注意到您选择不标准化 tfidf 矩阵。请记住,标准化 tfidf 矩阵是一种常见且通常推荐的方法,因为大多数模型都需要对特征矩阵(或设计矩阵)进行标准化。

TfidfVectorizer 默认情况下会对输出矩阵进行 L-2 归一化,作为计算的最后一步。对其进行归一化意味着其权重将仅在 0 到 1 之间。

关于nlp - scikit-learn TfidfVectorizer 是如何计算 TF-IDF 的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36966019/

相关文章:

python - 图形连接句子

search - 设置 df 阈值,超过该阈值,应忽略查询术语

machine-learning - sklearn oneclass svm KeyError

python - k-means 中特征的权重

python - 在 spaCy 中使用正则表达式 : matching various (different cased) words

python - 为什么 sklearn MinMaxScaler() 返回超出范围的值而不是错误?

python - scikit-learn 中递归特征消除 (RFE) 的排名和分数

python - 使用自定义变压器时如何正确pickle sklearn管道

java - 用于 LogisticRegression 的 Spark MLLib TFIDF 实现

python - 非常规命名实体识别