【问题标题】:How to count term frequency for set of documents?如何计算一组文档的词频?
【发布时间】:2011-02-24 19:54:22
【问题描述】:

我有一个包含以下文档的 Lucene 索引:

doc1 := { caldari, jita, shield, planet }
doc2 := { gallente, dodixie, armor, planet }
doc3 := { amarr, laser, armor, planet }
doc4 := { minmatar, rens, space }
doc5 := { jove, space, secret, planet }

所以这 5 个文档使用了 14 个不同的术语:

[ caldari, jita, shield, planet, gallente, dodixie, armor, amarr, laser, minmatar, rens, jove, space, secret ]

每个词的频率:

[ 1, 1, 1, 4, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1 ]

为了方便阅读:

[ caldari:1, jita:1, shield:1, planet:4, gallente:1, dodixie:1, 
armor:2, amarr:1, laser:1, minmatar:1, rens:1, jove:1, space:2, secret:1 ]

我现在想知道的是,如何获得一组词频向量 文件?

例如:

Set<Documents> docs := [ doc2, doc3 ]

termFrequencies = magicFunction(docs); 

System.out.pring( termFrequencies );

将导致输出:

[ caldari:0, jita:0, shield:0, planet:2, gallente:1, dodixie:1, 
armor:2, amarr:1, laser:1, minmatar:0, rens:0, jove:0, space:0, secret:0 ]

删除所有零:

[ planet:2, gallente:1, dodixie:1, armor:2, amarr:1, laser:1 ]

注意,结果向量仅包含 文件。不是整个指数的整体频率! 术语“行星”在整个索引中出现 4 次,但源集 of 文档仅包含 2 次。

一个简单的实现是只遍历 docs 设置,创建地图并计算每个术语。 但我需要一个也适用于文档集大小的解决方案 100.000 或 500.000。

我可以使用 Lucene 中的某个功能来获取此术语向量吗? 如果没有这样的功能,数据结构会是什么样子 有人可以在索引时创建以获得这样的术语向量 方便快捷?

我不是 Lucene 专家,所以如果解决方案是显而易见的或微不足道的,我很抱歉。

也许值得一提:该解决方案应该足够快地运行在 Web 应用程序中,应用于客户端搜索查询。

【问题讨论】:

  • 那么您有 500K 文档,您的术语列表有多大?
  • 我确切地知道你想要完成什么,太糟糕了我没有你的问题的答案:)
  • @Justin:我有大约 2.000 个不同的术语,几年内的绝对最大值可能是 10.000,但肯定不会更多。
  • 嗨 ManBugra,我也有类似的要求。您是否找到任何方法来解决对一组文档进行计数的问题?
  • @ManBugra : 你能分享一下,如何计算词频?

标签: java lucene


【解决方案1】:

不过,我不知道 Lucene;只要您不一次将整个文档读入内存(即使用在线解析器),您的幼稚实现就会扩展。英文文本大约有 83% 的冗余,因此您最大的文档将包含一个包含 85000 个条目的地图。每个线程使用一个映射(每个文件一个线程,显然是池化的),你会很好地扩展。

更新:如果您的术语列表不经常更改;您可以尝试使用术语列表中的字符构建搜索树,或构建完美的哈希函数 (http://www.gnu.org/software/gperf/) 以加快文件解析(从搜索术语映射到目标字符串)。可能只是一个大的 HashMap 也可以执行。

【讨论】:

    【解决方案2】:

    去这里:http://lucene.apache.org/java/3_0_1/api/core/index.html 并检查这个方法

    org.apache.lucene.index.IndexReader.getTermFreqVectors(int docno);
    

    您必须知道文档 ID。这是一个内部 lucene id,它通常会在每次索引更新时更改(具有删除 :-))。

    相信lucene 2.x.x也有类似的方法

    【讨论】:

    • 我们怎样才能得到这个内部ID?不知道id的时候,怎么用getTermFreqVectors???
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    • 2021-02-28
    • 2011-02-22
    相关资源
    最近更新 更多