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

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

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

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

谢谢

【问题讨论】:

    标签: lucene cluster-analysis


    【解决方案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。

    【讨论】:

      猜你喜欢
      • 2018-08-29
      • 2018-11-22
      • 2016-05-11
      • 1970-01-01
      • 2011-02-15
      • 2013-04-26
      • 2013-03-26
      • 2014-01-27
      • 2011-12-03
      相关资源
      最近更新 更多