Java 如何计算一组文档的术语频率?
我有一个包含以下文档的Lucene索引:Java 如何计算一组文档的术语频率?,java,lucene,Java,Lucene,我有一个包含以下文档的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个不同的术语: [ cald
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 );
删除所有零:
[ planet:2, gallente:1, dodixie:1, armor:2, amarr:1, laser:1 ]
请注意,result vetor只包含一组
文件。不是整个索引的总频率!
“行星”一词在整个索引中出现了4次,但源集合
的文档只包含它2次
一个幼稚的实现将是只迭代数据库中的所有文档
docs
设置、创建地图并计算每个术语。
但我需要一个解决方案,该解决方案还可以处理大小为的文档集
10万或50万
Lucene中是否有我可以用来获得这个术语向量的特征?
如果没有这样的特性,数据结构会是什么样子
有人可以在索引时创建这样一个术语向量
轻松快速
我不是Lucene的专家,所以如果解决方案是显而易见的或琐碎的,我很抱歉
也许值得一提的是:对于应用于客户端搜索查询的web应用程序,该解决方案的运行速度应该足够快;如果您不一次性将整个文档读入内存(即使用在线解析器),您的天真实现将可以扩展。英文文本大约有83%的冗余,因此您最大的文档将有一个包含85000个条目的地图。每个线程使用一个映射(每个文件使用一个线程,显然是池化的),您将可以很好地进行缩放 更新:如果您的术语表没有频繁更改;您可以尝试用术语列表中的字符构建一个搜索树,或者构建一个完美的哈希函数()来加速文件解析(从搜索术语到目标字符串的映射)。可能只是一个大的HashMap也可以执行。转到这里:检查这个方法
org.apache.lucene.index.IndexReader.getTermFreqVectors(int docno);
您必须知道文档id。这是一个内部lucene id,通常在每次索引更新时都会更改(删除:-))
我相信lucene 2.x.x也有类似的方法,所以你有50万个文档,你的术语表有多大?我完全知道你想要完成什么,可惜我没有答案:)@Justin:我有大约2000个不同的术语,几年内绝对最大值可能是10.000,但肯定不会更多。嗨,ManBugra,我也有类似的要求。你有没有找到解决一组文档计数问题的方法?@ManBugra:你能分享一下吗,如何计算术语频率?我们如何获得这个内部id?当我们不知道id时,如何使用
getTermFreqVectors
???
org.apache.lucene.index.IndexReader.getTermFreqVectors(int docno);