【发布时间】:2011-02-15 23:04:20
【问题描述】:
我正在使用 Lucene 来获取文档中术语的频率,即每个文档中某个术语的出现次数。我为此使用IndexReader.termDocs(),它适用于单字词,但由于所有词都单独存储在索引中,因此不适用于多词词。
示例(取自this 问题):我对术语“basket-ball”(甚至“basket ball”)的频率感兴趣,但在标记化之后会有两个词,我将能够得到术语“basket”和术语“ball”的频率,但不能得到术语“basket-ball”的频率。
我知道我想要获得频率的所有多词术语,而且我对存储原始文本不感兴趣 - 只对获取统计数据感兴趣。所以,我的第一个方法是在一个术语中连接单词。例如。 “我昨天打了篮球”变成了“我昨天打了篮球”和“我最喜欢的作家是库尔特·冯内古特”变成了“我最喜欢的作家是库尔特冯内古特”。这个可行:连接的术语被视为任何其他单个单词,因此我可以轻松获得频率。但是这种方法很丑陋,更重要的是,速度很慢。所以我来到了另一个。
我的第二种方法是编写特殊标记过滤器,它将捕获标记并检查它们是否是要替换的术语的一部分(类似于SynonymFilter from @ 987654323@)。在我们的例子中,当过滤器将看到单词“basket”时,它会再读取一个标记,如果它是“ball”,过滤器将放置一个术语(“basketball”)而不是两个(“basket”和“ball”)输出令牌流。与前一种方法相比,这种方法的优点是它搜索完整单词之间的匹配,并且不扫描全文以查找子字符串。事实上,大多数令牌将具有不同的长度,因此将被丢弃,甚至不检查其中任何字母的对应关系。但是这样的过滤器并不容易编写,而且我不确定它是否足够快以满足我的需求。
第三种我能想到的方法是在同一文档中使用两个单词的位置。但很可能它会涉及在获取频率时间期间遍历TermDocs,这比索引时间要花费更多。
所以,最后,我的问题是:有没有办法在 Lucene 中有效地索引和获取多词术语的频率?
【问题讨论】: