【问题标题】:Sklearn and gensim's TF-IDF implementationSklearn 和 gensim 的 TF-IDF 实现
【发布时间】:2023-04-06 20:41:01
【问题描述】:

我一直在尝试确定一组文档之间的相似度,我使用的一种方法是与 TF-IDF 结果的余弦相似度。

我尝试同时使用 sklearn 和 gensim 的实现,这给了我相似的结果,但我自己的实现导致不同的矩阵。

经过分析,我注意到它们的实现与我研究和遇到的不同:

Sklearn 和 gensim 使用原始计数作为 TF,并应用 L2 范数 在结果向量上。

另一方面,我发现的实现将使术语计数正常化, 喜欢

TF = term count / sum of all term counts in the document

我的问题是,它们的实现有什么区别?对于聚类或其他目的,它们最终会给出更好的结果吗?

编辑(所以问题更清楚了): 标准化最终结果与标准化开始时的术语计数有什么区别?

【问题讨论】:

    标签: scikit-learn tf-idf gensim


    【解决方案1】:

    我最终理解了为什么在 tf-idf 计算结束时进行归一化,而不是在词频上进行。

    四处搜索后,我注意到他们使用 L2 归一化来促进余弦相似度计算。

    因此,我们可以直接使用fit_transform 函数的结果:tfidf * tfidf.T,而不是使用公式dot(vector1, vector2) / (norm(vector1) * norm(vector2)) 来获取两个向量之间的相似性,而无需归一化,因为向量的范数已经是 1。

    我尝试在词频上添加归一化,但在归一化整个向量时,它最终给出了相同的结果,最终浪费了时间。

    【讨论】:

      【解决方案2】:

      使用 scikit-learn,您可以在调用 TfidfTransformer() 时根据需要设置规范化,方法是将 norm 设置为 l1l2none

      如果您使用 none 尝试此操作,您可能会得到与您自己的手动 tf-idf 实现类似的结果。

      规范化通常用于减少文档长度对特定 tf-idf 权重的影响,以便将出现在短文档中的单词与出现在更长文档中的单词同等对待。

      【讨论】:

      • 是的,当我检查它们的实现时,我已经手动得到了类似的结果。我想我的问题并没有明确,我问的是规范化最终结果与规范化开始时的词频有什么区别,因为这两种方法都将用于抵消文档长度。
      猜你喜欢
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      • 2019-05-24
      • 2017-11-14
      • 2019-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多