【问题标题】:Weighted cosine similarity calculation using Lucene使用 Lucene 进行加权余弦相似度计算
【发布时间】:2012-04-19 16:44:23
【问题描述】:

这个问题与使用 Lucene 计算文档之间的 CosineSimilarity 有关

文档分别用分类和本体术语进行标记。当我计算文档之间的文档相似度时,我想给那些分类术语和本体术语赋予更高的权重。

当我索引文档时,我在我的程序中将文档内容、分类和本体术语定义为每个文档的字段。

Field ontologyTerm= new Field("fiboterms", fiboTermList[curDocNo], Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.YES);
Field taxonomyTerm = new Field("taxoterms", taxoTermList[curDocNo], Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.YES);
Field document = new Field(docNames[curDocNo], strRdElt, Field.TermVector.YES);

我正在使用 Lucene 索引 .TermFreqVector 函数来计算 TFIDF 值,然后使用 TFIDF 值计算两个文档之间的余弦相似度。

我可以使用 Lucene 的 field.setBoost() 函数在索引之前为字段赋予更高的权重。在看到提升值后,我使用调试器查看分类术语的频率值,但它不会改变术语频率。所以这意味着 setboost() 函数不会对 TermFreVector 或 TFIDF 值产生任何影响? setboost() 函数是否增加了权重,只能用于文档搜索?

我可以做的另一件事是,在计算 TFIDF 分数之前,以编程方式将分类和本体术语频率与定义的权重因子相乘。这会在文档相似度计算中赋予分类和本体术语更高的权重吗?

在使用 TermFreqVector 计算 TFIDF 值时,是否有任何其他 Lucene 函数可用于为某些字段赋予更高的权重?或者我可以只使用 setboost() 函数来达到这个目的,那么如何?

【问题讨论】:

  • 到目前为止,您已经发布了 8 个问题并且没有接受任何答案。你有不好的业力,人们会不乐意帮助你。回到您的问题并接受答案。如果你对你得到的答案不满意,你应该和回答者一起努力,直到你满意为止。在有人麻烦帮助你之后放弃问题是不好的。

标签: apache lucene


【解决方案1】:

TermFreqVector 就是这样 - 术语频率。没有重量。它在文档中说“数组中的每个位置都包含该术语在文档或文档字段中出现的次数。”

您可以从Lucene's algorithm 看到,使用提升的方式是一个乘法因子。因此,如果您想复制它,那么是的,这将使您的术语具有更高的权重。

我不确定您的用例是什么,但您可能想考虑只使用 Lucene 的 Scorer 类。这样您就不必自己动手制作了。

【讨论】:

  • 我使用 TermFreqVector 值计算 TFIDF 值,然后使用 TFIDF 值计算文档之间的余弦相似度。在计算 TFIDF 值时,是否有 Lucene 函数可以为某些术语赋予更高的权重,它会提高两个文档之间的余弦相似度吗?
  • @Kasun:是的,从我的回答中可以看出,您可以使用 boosting 或 Scorer 类。
猜你喜欢
  • 2015-05-24
  • 1970-01-01
  • 1970-01-01
  • 2012-04-27
  • 2017-07-07
  • 2018-04-11
  • 2011-07-24
  • 2022-07-07
相关资源
最近更新 更多