使用Lucene计算加权余弦相似度

时间:2012-04-19 16:44:24

标签: apache lucene

此问题与使用Lucene

计算文档之间的CosineSimilarity有关

文档分别标有Taxonomy和Ontology术语。当我计算文档之间的文档相似性时,我想对那些分类术语和本体术语赋予更高的权重。

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

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分数之前,以编程方式将Taxonomy和Ontology术语频率与定义的权重因子相乘。这会在文档相似度计算中对分类法和本体论术语给予更高的权重吗?

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

1 个答案:

答案 0 :(得分:1)

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

你可以从Lucene's algorithm看到增强的使用方式是一个乘法因素。因此,如果您想要复制那么是,这将使您的条款具有更高的权重。

我不确定你的用例是什么,但你可能想考虑使用Lucene的Scorer类。那么你就不必自己动手了。