我想实现一个聚类算法并在Lucene中实现它。为此,我需要表示文档的tf-idf术语向量,因此我可以用与表示文档相同的方式表示质心,找到文档和聚类之间的相似性,并通过计算其新特征值来更新质心。但是我怎么能在Lucene之上做到这一点?
我甚至可以获得tf-idf吗?
我知道每个文档中的术语频率都会被保存,但这是否意味着我需要手动计算idf'每个学期?然后如何使矢量用于聚类。
谢谢
答案 0 :(得分:0)
您可以存储该字段的术语向量。然后,对于特定文档,您可以获得术语vector:
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
答案 1 :(得分:0)
请注意,lucene使用TF-IDF的变体,就像在教科书中找到它一样。
您可以在此处查看详细信息:
http://lucene.apache.org/core/4_0_0/core/org/apache/lucene/search/similarities/TFIDFSimilarity.html
特别是,仅访问查询中使用的术语。这主要是为了Lucene的性能:根据需要从索引中读取少量数据。
如果您想要访问确切的相似性值,您可能需要使用Collector
或其他一些专家级API。