【问题标题】:Is it possible to search for words inside a Lucene index by part of speech是否可以通过词性搜索 Lucene 索引中的单词
【发布时间】:2013-04-13 13:53:20
【问题描述】:

我在 Lucene 索引中存储了大量文档,我正在使用 customAnalyzer,它基本上对文档内容进行标记化和词干化。

现在,如果我在文档中搜索“love”一词,我会得到将 love 用作名词或动词的结果,而我只需要那些仅将 love 用作动词的文档。

如何实现这样的功能,我还可以将单词的词性与单词一起提到,以使结果只有love用作动词而不用作名词?

我可以想出一种方法来初始词性标记文档的每个单词并通过在词性后面附加带有“_”或其他内容的词来存储它,然后进行相应的搜索,但想知道是否在 Lucene 中有一种更聪明的方法来做到这一点。

【问题讨论】:

  • 你有有限的上述要求吗?比如名词、动词等。
  • 是的,我想主要限制在专有名词、普通名词和动词上。

标签: java solr lucene nlp tokenize


【解决方案1】:

我可以想到以下方法。

方法 1

就像您提到的:在索引时识别词性标签并将其附加到实际术语。查询时做同样的事情。

我想讨论一下相关的缺点。

缺点:

1) 未来的需求可能会要求您获得结果,而不管词性如何。包含修改条款的索引将不起作用。

2) 您可能希望执行一个 BooleanQuery,例如“术语:名词或形容词”。您必须自己编写查询扩展器。

方法 2

尝试使用 Lucene 的 Payloads 功能。

这是一个简短的tutorial on Lucene Payloads。

解决您的用例的步骤。

1) 以 Payload 的形式存储词性标签。

2) 每个词性标签都有自定义的相似度类。

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

4) 根据有效负载提高或“降低”文档的分数。上述教程中给出的示例。

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

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

缺点:

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

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

【讨论】:

    猜你喜欢
    • 2017-08-27
    • 2011-03-19
    • 2013-10-10
    • 1970-01-01
    • 2022-11-04
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多