3

这是一个含糊不清的文字:“一个人看到了一头大象。”

每个单词都有属性:引理、词性和取决于其词性的各种语法属性。

对于“锯”,它就像:

{lemma:see,pos:动词,时态:过去},{lemma:saw,pos:名词,number:单数}

所有这些属性都来自 3rd 方工具,Lucene 本身不参与词消歧。

我想执行类似“pos=verb & number=singular”的查询,而不是在结果中得到“saw”。

我想将不同的语法注释编码成字符串,如 "l:see;pos:verb;t:past|l:saw;pos:noun;n:sg" 并搜索正则表达式 "pos\:verb[^\|]+ n\:sg",但由于性能问题,我绝对负担不起正则表达式查询。

也许可以应用一些带有发布列表有效负载的技巧?

UPD:我的解决方案草稿

以下是我的项目的细节:一个单词可以拥有的解析次数是固定的(比如 8 次)。因此,我想在每个属性的有效负载中插入解析号,并在发布列表相交阶段使用此有效负载。例如,我们有一个 'pos = Verb' 的发布列表,如 ...|...|1.1234|...|...,还有一个 'number = Singular' 的发布列表:...|... |2.1234|...|... 在发布列表处理的所有阶段处理“pos = Verb AND number = single”之类的查询时,将接受“x.1234”条目,直到它们被拒绝的交集阶段因为不对应的解析数字。

我认为这是一个非常紧凑的解决方案,但是将它整合到 Lucene 中会有多难呢?

4

1 回答 1

2

所以......这样做的骗子方式是(确实)控制你如何构建lucene索引。

在构建 lucene 索引时,在 Lucene 索引它之前修改每个单词,以便它包含该单词的所有必要属性。如果以这种方式索引事物,则必须以相同的方式进行查找。

单程:

这意味着对于您执行的每种类型的查询,您还必须以相同的方式构建索引。

例子:

saw 变成了名词-saw -- 索引它。看到也变成名词过去看到——索引它。锯也变成了名词过去单数 - 索引它。

另一种方法:

如果您想在单个索引中进行基于属性的查找,您可能必须对单词“saw”执行排列完成之类的操作,这样您就可以拥有一个大的必要属性的所有可能排列,而不是名词锯。逻辑陈述。

不确定这是否是一个好的答案,但这就是我能想到的。

于 2012-12-31T03:44:44.383 回答