我想实现一个聚类算法并在Lucene中实现它 . 为此,我需要表示文档的tf-idf术语向量,因此我可以用与表示文档相同的方式表示质心,找到文档和聚类之间的相似性,并通过计算其新特征值来更新质心 . 但是我怎么能在Lucene之上做到这一点?
我甚至可以获得tf-idf吗?
我知道每个文档中的术语频率都会被保存,但这是否意味着我需要为每个术语“手动”计算idf?以及如何使矢量然后使用它们进行聚类 .
谢谢
您可以存储该字段的术语向量 . 然后对于特定文档,您可以获得术语向量:
Terms termFreqVector = indexReader.getTermVector(doc, field); TermsEnum te = termFreqVector.iterator(null);
然后迭代每个术语的枚举,你可以使用方法:
long df = te.docFreq(); // df of the term long tf = te.totalTermFreq(); // tf of the term
要获得idf,您可以通过indexReader.numDocs()划分df并应用Math.log
当然,您也可以使用Mahout工具来矢量化lucene文档:http://mahout.apache.org/users/basics/creating-vectors-from-text.html
请注意,lucene使用TF-IDF的变体,就像在教科书中找到的那样 .
你可以在这里看到细节:
http://lucene.apache.org/core/4_0_0/core/org/apache/lucene/search/similarities/TFIDFSimilarity.html
特别是,只访问查询中使用的术语 . 这主要是为了Lucene的性能:根据需要从索引中读取少量数据 .
如果要访问确切的相似性值,可能需要使用Collector或某些其他专家级API .
2 回答
您可以存储该字段的术语向量 . 然后对于特定文档,您可以获得术语向量:
然后迭代每个术语的枚举,你可以使用方法:
要获得idf,您可以通过indexReader.numDocs()划分df并应用Math.log
当然,您也可以使用Mahout工具来矢量化lucene文档:http://mahout.apache.org/users/basics/creating-vectors-from-text.html
请注意,lucene使用TF-IDF的变体,就像在教科书中找到的那样 .
你可以在这里看到细节:
http://lucene.apache.org/core/4_0_0/core/org/apache/lucene/search/similarities/TFIDFSimilarity.html
特别是,只访问查询中使用的术语 . 这主要是为了Lucene的性能:根据需要从索引中读取少量数据 .
如果要访问确切的相似性值,可能需要使用Collector或某些其他专家级API .