如何计算文档集的术语频率?

时间:2010-05-27 19:08:39

标签: java lucene

我有一个带有以下文件的Lucene-Index:

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 ]

注意,结果vetor仅包含该组的术语频率 文档。不是整个索引的整体频率! 术语“行星”在整个索引中存在4次但是源集合 文件只包含2次。

一个天真的实现就是迭代所有文档 docs设置,创建地图并计算每个字词。 但我需要一个解决方案,也适用于文档集大小 100.000或500.000。

Lucene中是否有可用于获取此术语向量的功能? 如果没有这样的功能,数据结构将如何 某人可以在索引时创建以获得这样的术语向量 容易又快速?

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

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

2 个答案:

答案 0 :(得分:5)

转到此处: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有类似的方法

答案 1 :(得分:0)

然而,我不知道Lucene;如果你没有一次将整个文档读入内存(即使用在线解析器),你的天真实现将扩展。英文文本大约有83%的冗余,因此您最大的文档将包含一个包含85000个条目的地图。每个线程使用一个映射(每个文件使用一个线程,显然可以合并),你可以很好地扩展。

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