假设我有一个用户搜索查询,如下所示:
"the happy bunny"
我已经为我正在搜索的每个文档计算了tf-idf并且有类似的东西(以下是组成示例值)(其中idf始终是相同的):
tf idf score
the 0.06 1 0.06 * 1 = 0.06
happy 0.002 20 0.002 * 20 = 0.04
bunny 0.0005 60 0.0005 * 60 = 0.03
关于下一步该怎么做,我有两个问题。
首先,the
仍然具有最高分,即使它被idf调整为稀有,但仍然不是很重要 - 你认为我应该将idf
值与权重进行对比难得的话,还是会给出不好的结果呢?否则,我担心the
与happy
和bunny
同等重要,显而易见bunny
是搜索中最重要的词。只要稀有总是等于重要,那么在稀有性方面加权总是一个好主意,但如果情况并非总是如此,那么这样做可能会使结果陷入混乱。
其次,更重要的是:将每个单词的分数组合在一起的最佳/首选方法是什么,为每个文档提供一个单独的分数,表示它反映整个搜索查询的程度?我正在考虑添加它们,但很明显,这将优先考虑包含10,000 happy
但只有1 bunny
的文档,而不是另一个500
符合bunny
的文档。 500 void fillData() {
products.add(new Product("1",false));
products.add(new Product("2",false));
products.add(new Product("3",false));
}
(这将是一个更好的匹配)。
答案 0 :(得分:0)
您应该重新考虑您的TF和IDF值,它们看起来不正确。 TF值通常是单词出现的频率,因此如果单词“the”出现20次,则tf值为20.像“the”这样的单词应该具有非常低的IDF值(可能大约4位小数,0.000 ...)。 你可以使用停用词删除,如果不需要这样的词,它们将被移除而不是仅仅给予低分。
可以使用vector space model。
答案 1 :(得分:0)
首先,确保您正在计算正确的TF-IDF值。正如其他人指出的那样,他们看起来不对。 TF与特定文档相关,我们通常不需要为查询计算它们(因为在查询中原始术语频率几乎总是1)。有不同类型的TF函数可供选择(查看tf-idf上的维基百科页面,它具有良好的覆盖范围)。日志标准化是常见且最有效的方案,因为它节省了额外的磁盘访问权限,以获得双重标准化之类的相应文档的总频率 maxF 。当您处理大量文档时,这可能会很昂贵,尤其是如果您无法将这些内容带入内存中。对倒置文件的一些了解可以在理解一些潜在的复杂性方面发挥很大作用。对数归一化是有效的,并且是非线性函数,因此优于原始频率。
一旦你确定了你的加权方案,那么你可能需要考虑一个停止列表来摆脱非常常见/嘈杂的单词。这些对文档的排名没有贡献。通常建议使用高频率,非常常见的单词的停止列表。进行搜索,你会发现许多可用的,包括Lucene使用的那个。
剩下的就在于您的排名策略,这取决于您的实施/模型。矢量空间模型(VSM)很简单,并且可以像Lucene,Lemur等库那样随时可用.VSS计算查询和文档之间常用术语的权重的Dot积或标量。通过向量长度归一化(这解决了第二个问题)对术语权重进行归一化,应用模型的结果是0到1之间的值。这也被证明/解释为平面图中两个向量之间角度的余弦,或欧几里德距离除以两个向量的欧氏矢量长度。
最早的关于加权方案和VSM排名的综合性研究之一是article by Salton (pdf),如果您对信息检索感兴趣,那么这是一个很好的阅读。有点过时(注意文章中没有提到日志规范化)。
我认为最好的读物是 Christopher Manning的信息检索简介。它将引导您完成您需要了解的所有内容,从索引到排名方案等。有点缺乏排名模型(不包括一些更复杂的概率方法)。
答案 2 :(得分:-1)
你可以计算合并条款的tf-idf吗?也就是说,您首先生成一种情绪,在将情绪视为您现在计算tf-idf
的单个术语之前,将其每个组成部分视为相等。