与Lucene的余弦相似度仅适用于匹配

时间:2015-09-07 17:18:53

标签: java solr lucene cosine-similarity

Lucene是一个反向索引系统,据我所知,它的强大之处在于它只会将查询与至少与令牌匹配的文档进行比较。

与将查询与每个文档进行比较的天真方法(即使那些不提及查询中存在的任何标记的方法)相比,这是一个很大的好处。

例如,如果我有索引文档:

D1: "Hello world said the guy"
D2: "Hello, what a beautiful world"
D3: "random text"

我认为,搜索查询:" Hello world ",只会查看索引文档D1和D2并跳过在D3上,这可以节省时间。

这是对的吗?

现在,我试图计算文档之间的余弦相似度。输入查询将是一个文档,输出应该是余弦分数。这是介于0和1之间的数字。

我已经阅读了一些计算余弦相似度的方法,但它们都通过比较每个文档的术语向量来做到这一点。例如,this博客提到了以下内容:

  

如果您确实需要文档之间的余弦相似性,则必须这样做   为源字段启用术语向量,并使用它们进行计算   角度。问题是这不能很好地扩展,你会的   需要使用几乎所有其他文档计算角度

这个SO answers似乎也是这样说的:

  
      
  1. 遍历所有文档ID ,0到maxDoc();
  2.   

有没有办法只计算与查询匹配的文档的余弦相似度,并将其作为文档的分数返回?

作为旁注, 我确实读过TFIDFSimilarity接近,我相信VSM部分正是我所需要的,但是这部分似乎已经在Lucene实用评分函数中消失了。我不知道我怎么能"变换"这个相似性类最终只得到纯余弦相似性。

回顾一下我的问题:

  1. 我对反向索引如何节省时间的看法是正确的吗?

  2. 有没有办法只计算文件的余弦相似度 实际匹配其中一个令牌,而不是所有文件?

  3. 我可以使用/转换TFIDFSimilarity类来结束 纯余弦相似度?

0 个答案:

没有答案