7

我已经成功地为 Lucene 实施了捷克语词形还原器。我正在用 Solr 对其进行测试,它在索引时很好用。但它在用于查询时效果不佳,因为查询解析器不向词形还原器提供任何上下文(之前或之后的单词)。

例如,pila vodu在索引时对短语的分析与在查询时不同。它使用了模棱两可的词pila,可以表示pila (锯,例如电锯)或pít(动词“喝”的过去时)。

pila vodu->

  • 索引时间:pít voda
  • 查询时间:pila voda

..所以这个词pila没有找到,也没有在文档片段中突出显示。

这种行为记录在solr wiki(引用如下),我可以通过调试我的代码来确认它(只有孤立的字符串“pila”和“vodu”被传递给 lemmatizer)。

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

所以我的问题是:

是否有可能以某种方式更改、配置或调整查询解析器,以便词形还原器可以看到整个查询字符串,或者至少是单个单词的某些上下文?我也想为不同的 solr 查询解析器(如dismaxedismax )提供解决方案。

我知道像 (quotes) 这样的短语查询没有这样的问题"pila vodu",但是我会丢失没有确切短语的文档(例如带有"pila víno"甚至"pila dobrou vodu"的文档)。


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

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

当然,最好只分析组合在一起的术语。例如,在索引时,词形还原器会检测输入文本中的句子,并且只分析单个句子中的单词。但是如何在查询时实现类似的事情呢?实现我自己的查询解析器是唯一的选择吗?我非常喜欢解析器的pf2andpf3选项,edismax如果是我自己的解析器,我是否必须再次实现它们?

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

4

1 回答 1

1

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

多亏了这些edismax资源作为指南和参考实现,这并不难。我可以轻松地将我的解析器结果与edismax...的结果进行比较

解决方案 :

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

与停用词有一点冲突 - 获取停用词的标记并不容易,因为分析器会省略它们,但您可以从PositionIncrementAttribute.

从“tokens”,我以相同的方式构造查询edismax(例如,创建所有 2-token 和/或 3-token 短语查询组合在DisjunctionMaxQuery实例中)。

于 2018-01-04T14:22:35.663 回答