是否可以通过词性搜索Lucene索引中的单词

时间:2013-04-13 13:53:20

标签: java solr lucene nlp tokenize

我在Lucene索引中存储了大量文档,我使用的是customAnalyzer,它基本上为文档内容进行了标记化和源代码。

现在,如果我在文档中搜索单词" love",我得到的结果是爱被用作名词或动词,而我只想要那些仅使用爱的文档一个动词。

如何实现这样的功能,我还可以提到单词的词性以及单词,这样结果只能用作动词而不是名词?

我可以想出一种方法,最初对文档中的每个单词进行词性标记,并通过在单词上添加带有' _'的单词来存储它。或者其他什么,然后相应地搜索,但想知道在Lucene中是否有更聪明的方法来做到这一点。

1 个答案:

答案 0 :(得分:1)

我可以想到以下方法。

方法1

就像你提到的那样:在索引时识别并将词性标记附加到实际术语。查询时也一样。

我想讨论相关的利弊。

缺点:

1)未来的要求可能要求您获得结果而不管词性。包含已修改术语的索引将不起作用。

2)您可能希望执行类似“term:noun或adjective”的BooleanQuery。你自己编写查询扩展器。

方法2

尝试使用Lucene的Payloads功能。

以下是简要tutorial on Lucene Payloads

解决使用案例的步骤。

1)以有效载荷的形式存储词性标记。

2)为每个词性标签定制相似度类。

3)根据查询,将相应的CustomSimilarity分配给IndexSearcher。例如,为名词查询指定NounBoostingSimilarity。

4)根据Payload提升或“降低”文档的分数。上面教程中给出的示例。

5)编写一个自定义收集器来过滤掉不符合上述得分提升逻辑的分数。

这种方法的优点是索引与任何其他正常搜索保持兼容。

缺点:

1)维护费用:必须为每个相似性维护多个IndexSearchers。 2)有点复杂的代码解决方案。

坦率地说,我对自己的解决方案并不满意,但只是想让你知道存在另一种方式。这完全取决于您的场景,项目是学术性的一次性项目还是商业项目等。