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