Solr/Lucene 查询词形还原与上下文
Posted
技术标签:
【中文标题】Solr/Lucene 查询词形还原与上下文【英文标题】:Solr/Lucene query lemmatization with context 【发布时间】:2017-02-12 11:08:04 【问题描述】:我已经成功地为 Lucene 实现了捷克语词形还原器。我正在用 Solr 对其进行测试,它在索引时很好用。但它在用于查询时效果不佳,因为查询解析器不向词形还原器提供任何上下文(之前或之后的单词)。
例如,短语pila vodu
在索引时与查询时的分析方式不同。它使用了模棱两可的词 pila
,这可能意味着 pila
(锯,例如电锯)或 pít
(动词“喝”的过去时)。
pila vodu
->
pít voda
查询时间:pila voda
.. 所以单词 pila
在文档 sn-p 中找不到并且未突出显示。
此行为记录在solr wiki(引用如下),我可以通过调试我的代码来确认它(只有孤立的字符串“pila”和“vodu”被传递给词形分析器)。
... Lucene QueryParser 在将任何文本提供给分析器之前在空白处进行标记,因此如果一个人搜索单词
sea biscit
,分析器将分别给出单词“sea”和“biscit”,.. .
所以我的问题是:
是否可以以某种方式更改、配置或调整查询解析器,以便词形还原器可以看到整个查询字符串,或者至少可以看到单个单词的某些上下文?我也想为不同的 solr 查询解析器提供解决方案,例如 dismax 或 edismax。
我知道像"pila vodu"
(引号)这样的短语查询没有这样的问题,但是我会丢失没有确切短语的文档(例如带有 "pila víno" 的文档,甚至“pila dobrou vodu”)。
编辑 - 试图解释/回答以下问题(谢谢@femtoRgon):
如果这两个术语不是一个短语,因此不一定会一起出现,那么为什么要在上下文中对它们进行分析?
当然,最好只分析组合在一起的术语。例如,在索引时,词形还原器会检测输入文本中的句子,并且只分析单个句子中的单词。但是如何在查询时实现类似的事情呢?实现我自己的查询解析器是唯一的选择吗?我非常喜欢edismax
解析器的pf2
和pf3
选项,如果是我自己的解析器,我是否必须再次实现它们?
背后的想法实际上更深一些,因为the lemmatizer 正在对具有相同词汇基础的单词进行词义消歧。例如,单词bow
在英语中有大约 7 种不同的含义(参见wikipedia),并且词形分析器正在区分这些含义。因此,我想利用这种潜力使搜索更加精确——在查询所需的具体意义上,只返回包含单词bow
的文档。所以我的问题可以扩展到:如何为查询词获得正确的<lemma;sense>
-pair?如果单词出现在其共同的上下文中,则词形还原器通常能够分配正确的含义,但是当没有上下文时,它就没有机会了。
【问题讨论】:
如果这两个词不是一个词组,因此不一定会放在一起,那么为什么要在上下文中对它们进行分析呢? @femtoRgon :查看我的编辑...您对我有什么建议吗?我将不胜感激... Automatic Phrazing Token Filter 用于检测和标记 Lucidworks 的短语。过滤器使用一个短语列表——从一个文本文件中提取,每行一个短语 【参考方案1】:最后,我实现了自己的查询解析器。
感谢edismax
源作为指南和参考实现,这并不难。我可以轻松地将我的解析器结果与edismax
的结果进行比较...
解决方案:
首先,我一起分析整个查询字符串。这给了我“令牌”列表。
与停用词有一点冲突 - 获取停用词的标记并不容易,因为分析器会忽略它们,但您可以从 PositionIncrementAttribute
检测到它们。
从“tokens”,我以与edismax
相同的方式构造查询(例如,在DisjunctionMaxQuery
实例中创建所有2-token 和/或3-token 短语查询)。
【讨论】:
以上是关于Solr/Lucene 查询词形还原与上下文的主要内容,如果未能解决你的问题,请参考以下文章