Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何计算一组文档的术语频率?_Java_Lucene - Fatal编程技术网

Java 如何计算一组文档的术语频率?

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

我有一个包含以下文档的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 );
删除所有零:

[ 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);