如何在Lucene中获取多词术语的频率?

5
我正在使用Lucene来获取文档中词项的频率,即某个词在每个文档中出现的次数。我使用IndexReader.termDocs()来实现这一目的,对于单词,它可以正常工作,但由于所有单词都是分别存储在索引中的,所以对于多个单词,它无法正常工作。
例如(摘自问题):我想知道“篮球”(甚至是“篮球”)一词的频率,但是在进行分词后,会得到两个单词,“篮球”和“球”,但无法得到“篮球”一词的频率。
我知道我想要获取频率的所有多个单词,而且我不关心存储原始文本 - 只关心获取统计信息。因此,我的第一个方法是简单地将术语中的单词连接起来。例如,“我昨天打了篮球”变成“I played basketball yesterday”,“我最喜欢的作家是Kurt Vonnegut”变成“My favorite writer is KurtVonnegut”。这种方法可以正常工作:连接的术语被视为任何其他单词,因此我可以轻松地获取频率。但是这种方法很丑陋,更重要的是非常慢。因此,我想到了另一种方法。
我的第二个方法是编写特殊的标记过滤器,它将捕获标记并检查它们是否是要替换的术语的一部分(类似于Lucene in Action中的SynonymFilter)。在我们的情况下,当过滤器看到单词“篮球”时,它将读取另一个标记,并且如果它是“球”,则过滤器将在输出标记流中放置一个术语(“篮球”)而不是两个术语(“篮球”和“球”)。与前面的方法相比,这种方法的优点在于它搜索完整的单词匹配,而不是在子字符串中扫描完整文本。事实上,大多数标记的长度都不同,因此甚至不会检查它们中的任何字母的对应关系就被丢弃了。但是编写这样的过滤器并不容易,而且我不确定它是否足够快以适应我的需求。
我能想到的第三个方法是在同一文档中两个单词的位置进行操作。但最可能涉及迭代TermDocs以获取频率时间,这比索引时间要花费更多。因此,我的问题是:Lucene中是否有一种有效地索引和获取多个单词术语的频率的方法?
1个回答

6
请查阅shingling。它可以索引术语组。您可以在solr 1.4书中找到。以及这里
因此,如果您有字符串:“篮球始于20世纪初。”
您将获得所有已索引的单个术语,还包括
“basket ball” “ball started” “started in” “early 1900's”等等...
并通过配置,还有
“basket ball started” “ball started in” “the early 1900's”等等...

我找到了Lucene的ShingleFilterShingleAnalyzerWrapper,它们正是我需要的,谢谢! - ffriend

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接