Solr/Lucene 使用上下文查询词形还原
Solr/Lucene query lemmatization with context
我已经成功地为 Lucene 实现了捷克语词形还原器。我正在使用 Solr 对其进行测试,它在索引时运行良好。但它在用于查询时效果不佳,因为查询解析器不向词形还原器提供任何上下文(之前或之后的词)。
例如,短语 pila vodu
在索引时和查询时的分析方式不同。它使用歧义词 pila
,可能表示 pila
(锯,例如电锯)或 pít
(动词 "to drink" 的过去式)。
pila vodu
->
- 索引时间:
pít voda
- 查询时间:
pila voda
.. 所以单词 pila
未找到且未在文档片段中突出显示。
此行为记录在 solr wiki(下面引用)中,我可以通过调试我的代码来确认它(只有孤立的字符串 "pila" 和 "vodu" 被传递给词形还原器) .
... The Lucene QueryParser tokenizes on white space before giving any text to the Analyzer, so if a person searches for the words sea biscit
the analyzer will be given the words "sea" and "biscit" seperately, ...
所以我的问题是:
是否有可能以某种方式更改、配置或调整查询解析器,以便词形还原器可以看到整个查询字符串,或者至少是单个单词的某些上下文?我也想为 dismax 或 edismax.
等不同的 solr 查询解析器提供解决方案
我知道像 "pila vodu"
(引号)这样的短语查询没有这样的问题,但是如果没有确切的短语我会丢失文档(例如带有 [=71= 的文档) ]甚至"pila dobrou vodu").
编辑 - 尝试解释/回答以下问题(谢谢@femtoRgon):
If the two terms aren't a phrase, and so don't necessarily come together, then why would they be analyzed in context to one another?
当然,只分析出现在一起的术语会更好。例如,在索引时,词形还原器检测输入文本中的句子,并仅分析单个句子中的单词。但是如何在查询时实现类似的事情呢?实现我自己的查询解析器是唯一的选择吗?我非常喜欢 edismax
解析器的 pf2
和 pf3
选项,如果是我自己的解析器,我是否必须再次实现它们?
背后的想法实际上更深一些,因为 the lemmatizer is doing word-sense-disambiguation even for words that has the same lexical base. For example the word bow
has about 7 different senses in English (see at wikipedia) 并且词形还原器正在区分这些意义。因此,我想利用这种潜力使搜索更加精确——return 仅包含查询所需具体意义上的单词 bow
的文档。所以我的问题可以扩展为:How to get the correct <lemma;sense>
-pair for a query term?如果单词出现在其共同上下文中,词形还原器通常能够分配正确的含义,但如果没有上下文,它就没有机会了。
最后,我实现了自己的查询解析器。
由于有 edismax
源作为指南和参考实现,这并不难。我可以轻松地将我的解析器结果与 edismax
...
的结果进行比较
解法:
首先,我一起分析了整个查询字符串。这给了我 "tokens".
的列表
与停用词有一点冲突 - 获取停用词的标记并不容易,因为分析器会忽略它们,但您可以从 PositionIncrementAttribute
.
中检测到它们
从 "tokens" 我构建查询的方式与 edismax
相同(例如,创建所有 2-token and/or 3-token 短语查询组合在 DisjunctionMaxQuery
实例)。
我已经成功地为 Lucene 实现了捷克语词形还原器。我正在使用 Solr 对其进行测试,它在索引时运行良好。但它在用于查询时效果不佳,因为查询解析器不向词形还原器提供任何上下文(之前或之后的词)。
例如,短语 pila vodu
在索引时和查询时的分析方式不同。它使用歧义词 pila
,可能表示 pila
(锯,例如电锯)或 pít
(动词 "to drink" 的过去式)。
pila vodu
->
- 索引时间:
pít voda
- 查询时间:
pila voda
.. 所以单词 pila
未找到且未在文档片段中突出显示。
此行为记录在 solr wiki(下面引用)中,我可以通过调试我的代码来确认它(只有孤立的字符串 "pila" 和 "vodu" 被传递给词形还原器) .
... The Lucene QueryParser tokenizes on white space before giving any text to the Analyzer, so if a person searches for the words
sea biscit
the analyzer will be given the words "sea" and "biscit" seperately, ...
所以我的问题是:
是否有可能以某种方式更改、配置或调整查询解析器,以便词形还原器可以看到整个查询字符串,或者至少是单个单词的某些上下文?我也想为 dismax 或 edismax.
等不同的 solr 查询解析器提供解决方案我知道像 "pila vodu"
(引号)这样的短语查询没有这样的问题,但是如果没有确切的短语我会丢失文档(例如带有 [=71= 的文档) ]甚至"pila dobrou vodu").
编辑 - 尝试解释/回答以下问题(谢谢@femtoRgon):
If the two terms aren't a phrase, and so don't necessarily come together, then why would they be analyzed in context to one another?
当然,只分析出现在一起的术语会更好。例如,在索引时,词形还原器检测输入文本中的句子,并仅分析单个句子中的单词。但是如何在查询时实现类似的事情呢?实现我自己的查询解析器是唯一的选择吗?我非常喜欢 edismax
解析器的 pf2
和 pf3
选项,如果是我自己的解析器,我是否必须再次实现它们?
背后的想法实际上更深一些,因为 the lemmatizer is doing word-sense-disambiguation even for words that has the same lexical base. For example the word bow
has about 7 different senses in English (see at wikipedia) 并且词形还原器正在区分这些意义。因此,我想利用这种潜力使搜索更加精确——return 仅包含查询所需具体意义上的单词 bow
的文档。所以我的问题可以扩展为:How to get the correct <lemma;sense>
-pair for a query term?如果单词出现在其共同上下文中,词形还原器通常能够分配正确的含义,但如果没有上下文,它就没有机会了。
最后,我实现了自己的查询解析器。
由于有 edismax
源作为指南和参考实现,这并不难。我可以轻松地将我的解析器结果与 edismax
...
解法:
首先,我一起分析了整个查询字符串。这给了我 "tokens".
的列表与停用词有一点冲突 - 获取停用词的标记并不容易,因为分析器会忽略它们,但您可以从 PositionIncrementAttribute
.
从 "tokens" 我构建查询的方式与 edismax
相同(例如,创建所有 2-token and/or 3-token 短语查询组合在 DisjunctionMaxQuery
实例)。