集群文档 Lucene

Posted

技术标签:

【中文标题】集群文档 Lucene【英文标题】:Clustering documents Lucene 【发布时间】:2014-10-20 08:57:37 【问题描述】:

我想实现一个聚类算法并在 Lucene 中实现它。为此,我需要表示文档的 tf-idf 术语向量,因此我可以像表示文档一样表示质心,找到文档和集群之间的相似性,并通过计算其新特征值来更新质心。但是我怎样才能在 Lucene 之上做到这一点呢?

我什至可以得到 tf-idf 吗?

我知道每个文档中的词频都已保存,但这是否意味着我需要为每个词“手动”计算 idf?以及如何制作向量然后将它们用于聚类。

谢谢

【问题讨论】:

【参考方案1】:

您可以存储该字段的术语向量。然后对于特定文档,您可以获得术语向量:

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,您可以将 df 除以 indexReader.numDocs() 并应用 Math.log

当然,您也可以使用 Mahout 工具对 lucene 文档进行矢量化:http://mahout.apache.org/users/basics/creating-vectors-from-text.html

【讨论】:

但是如果我想实现聚类算法,即取词向量的值并计算它们之间的距离,我需要自己创建向量,没有别的办法吗? 如果你想将lucene索引的每个文档表示为一个向量,然后对这些向量应用一些聚类算法,那么你可以使用我上面描述的方法来实现这种“文档到向量”的转换。在 lucene 中没有为此的标准方法。 好的,谢谢,这就是我需要听到的,因为我不确定是否已经有一些我缺少的东西可以使用。【参考方案2】:

请注意,lucene 使用了 TF-IDF 的变体,您可以在教科书中找到它。

您可以在此处查看详细信息:

http://lucene.apache.org/core/4_0_0/core/org/apache/lucene/search/similarities/TFIDFSimilarity.html

特别是,只访问查询中使用的术语。这本质上是为了 Lucene 的性能:根据需要从索引中读取尽可能少的数据

如果您想访问确切的相似度值,您可能需要使用 Collector 或其他一些专家级 API。

【讨论】:

以上是关于集群文档 Lucene的主要内容,如果未能解决你的问题,请参考以下文章

Lucene快速入门

LuceneElasticsearchKibana 入门教程和环境搭建

ES功能浅析

lucene

集群文档 Lucene

将新文档添加到现有集群中