我有一个带有以下文件的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应用程序,应用于客户端搜索查询.
请访问: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有类似的方法