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

Man*_*gra 6 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 }
Run Code Online (Sandbox Code Playgroud)

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

[ caldari, jita, shield, planet, gallente, dodixie, armor, amarr, laser, minmatar, rens, jove, space, secret ]
Run Code Online (Sandbox Code Playgroud)

每个学期的频率:

[ 1, 1, 1, 4, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1 ]
Run Code Online (Sandbox Code Playgroud)

方便阅读:

[ 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 ]
Run Code Online (Sandbox Code Playgroud)

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

例如:

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

termFrequencies = magicFunction(docs); 

System.out.pring( termFrequencies );
Run Code Online (Sandbox Code Playgroud)

会导致输出:

[ 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 ]
Run Code Online (Sandbox Code Playgroud)

删除全零:

[ planet:2, gallente:1, dodixie:1, armor:2, amarr:1, laser:1 ]
Run Code Online (Sandbox Code Playgroud)

请注意,结果vetor仅包含文档集的术语频率.不是整个索引的整体频率!术语"行星"在整个索引中存在4次,但源文档集只包含2次.

一个简单的实现是迭代docs集合中的所有文档 ,创建一个映射并计算每个术语.但我需要一个解决方案,也可以使用文件集大小100.000或500.000.

Lucene中是否有一个功能可以用来获取这个术语向量?如果没有这样的功能,数据结构将如何在索引时创建,以便轻松快速地获得这样的术语向量?

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

也许值得一提的是:该解决方案应该足够快地用于Web应用程序,应用于客户端搜索查询.

Mih*_*der 5

请访问:http://lucene.apache.org/java/3_0_1/api/core/index.html并检查此方法

org.apache.lucene.index.IndexReader.getTermFreqVectors(int docno);
Run Code Online (Sandbox Code Playgroud)

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

我相信lucene 2.xx有类似的方法