TF-IDF 简单使用 - NLTK/Scikit 学习

Posted

技术标签:

【中文标题】TF-IDF 简单使用 - NLTK/Scikit 学习【英文标题】:TF-IDF Simple Use - NLTK/Scikit Learn 【发布时间】:2012-08-05 21:34:39 【问题描述】:

好的,所以我有点困惑。然而,这应该是一个简单直接的问题。

在针对整个语料库计算文档的 TF-IDF 矩阵后,我得到的结果与此非常相似:

array([[ 0.85...,  0.  ...,  0.52...],
       [ 1.  ...,  0.  ...,  0.  ...],
       [ 1.  ...,  0.  ...,  0.  ...],
       [ 1.  ...,  0.  ...,  0.  ...],
       [ 0.55...,  0.83...,  0.  ...],
       [ 0.63...,  0.  ...,  0.77...]])

如何使用此结果来获取与搜索查询最相似的文档?基本上我正在尝试为***重新创建一个搜索栏。基于搜索查询,我想从 Wikipedia 返回最相关的文章。在这种情况下,有 6 篇文章(行),搜索查询包含 3 个词(列)。

我是将列中的所有结果相加还是将所有行相加?较大的值是最相关的还是最低的值是最相关的?

【问题讨论】:

【参考方案1】:

你熟悉cosine similarity吗?对于每篇文章(向量 A),计算其与查询(向量 B)的相似度。然后按降序排列并选择最高的结果。如果你愿意重构,gensim 库非常好。

【讨论】:

好吧,我实际上正在关注本教程:pyevolve.sourceforge.net/wordpress/?p=1589... 没有意义的是如何在原始文章和搜索查询之间使用 TF-IDF 向量。 如果你使用 tf-idf 作为你的权重方案,你仍然想要标准化你的查询。您的矩阵包含三个术语,所有这些都在查询中表示;因此查询的原始频率向量是(1,1,1)。 sqrt((1^2)+(1^2)+(1^2)) = 1.73,1/1.73 = 0.57。所以你的查询向量是(0.57,0.57,0.57)。现在您可以将查询视为另一个文档。这个查询向量和其他一些文档向量的余弦相似度是它的点积。第一篇文章:((.57*.85)+(.57*0)+(.57*.52)) = 0.2964。对所有文章重复此操作,得分最高的获胜。 所以我不必训练某种分类器? 如果我正确理解了您的教程链接,现在不是。我建议回顾link 中的第 6.2 节,以首先了解 tf-idf 等,然后将其应用于机器学习主题。我不确定你是否同时学习信息检索和机器学习。 手头没有我的代码。但说真的,看看那个 gensim 库。看教程和源代码;你可能会找到你要找的东西。

以上是关于TF-IDF 简单使用 - NLTK/Scikit 学习的主要内容,如果未能解决你的问题,请参考以下文章

Python中N-Gram、tf-idf和余弦相似度的简单实现

TF-IDF算法介绍,简单模拟,以及在图数据中应用

TF-IDF算法介绍,简单模拟,以及在图数据中应用

TF-IDF算法介绍,简单模拟,以及在图数据中应用

TF-IDF算法介绍,简单模拟,以及在图数据中应用

推荐系统学习——基于TF-IDF的改进