首页 文章

Solr / Lucene用上下文查询词形还原

提问于
浏览
7

我已成功为Lucene实施捷克语引理器 . 我正在使用Solr对它进行测试,它在索引时非常适合 . 但是当用于查询时它不能很好地工作,因为查询解析器不向引理器提供任何上下文(前后的单词) .

例如,在索引时比在查询时不同地分析短语 pila vodu . 它使用含糊不清的单词 pila ,这可能意味着 pila (看到例如电锯)或 pít (动词"to drink"的过去时) .

pila vodu - >

  • 索引时间: pít voda

  • 查询时间: pila voda

..因此找不到单词 pila ,并且未在文档摘要中突出显示 .

这种行为记录在solr wiki(引用下面的文字),我可以通过调试我的代码来确认它(只有隔离的字符串"pila"和_2767320被传递给引理器) .

... Lucene QueryParser在向分析器提供任何文本之前在空格上进行标记,因此如果一个人搜索单词sea biscit,分析器将单独给出单词“sea”和“biscit”,...

所以我的问题是:

是否有可能以某种方式更改,配置或调整查询解析器,以便引理器可以看到整个查询字符串,或者至少是单个单词的某些上下文?我想为dismax或edismax等不同的solr查询解析器提供解决方案 .

我知道像 "pila vodu" (引号)之类的短语查询没有这样的问题,但是如果没有确切的短语(例如带有"pila víno"或甚至"pila dobrou vodu"的文档),我将丢失文档 .


编辑 - 尝试解释/回答以下问题(谢谢@femtoRgon):

如果这两个术语不是一个短语,所以不一定会在一起,那么为什么要在上下文中对它们进行分析呢?

当然,最好只分析一起出现的术语 . 例如,在索引时,引理器检测输入文本中的句子,并且它仅一起分析来自单个句子的单词 . 但是如何在查询时实现类似的东西呢?实现我自己的查询解析器是唯一的选择吗?我非常喜欢 edismax 解析器的 pf2pf3 选项,如果是我自己的解析器,我是否必须再次实现它们?

背后的想法实际上更深一些,因为即使对于具有相同词汇基础的词,the lemmatizer也在进行词义消歧 . 例如, bow 这个词在英语中有大约7种不同的含义(参见wikipedia),并且这种词义可以区分这种感官 . 所以我想利用这种潜力使搜索更精确 - 只返回包含查询所需的具体意义上的单词 bow 的文档 . 所以我的问题可以扩展到:如何为查询字词获取正确的 <lemma;sense> -pair?如果单词在其共同的上下文中呈现,则引理器通常能够分配正确的意义,但是当没有上下文时它就没有机会 .

1 回答

  • 0

    最后,我实现了自己的查询解析器 .

    由于 edismax 源作为指南和参考实现,因此并不困难 . 我可以轻松地将我的解析器结果与 edismax 的结果进行比较...

    Solution :

    首先,我一起分析整个查询字符串 . 这给了我“令牌”列表 .

    与停用词有一点冲突 - 由于分析器省略了停止词而不是很容易获得停止词,但你可以从 PositionIncrementAttribute 检测到它们 .

    从"tokens"开始,我以与 edismax 相同的方式构造查询(例如,在 DisjunctionMaxQuery 实例中创建所有2个令牌和/或3个令牌短语查询) .

相关问题