在Lucene中使用属性值对应进行搜索

时间:2012-12-29 19:53:07

标签: search lucene nlp search-engine corpus

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

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

对于“锯”,它就像:

{lemma:see,pos:verb,tense:past},{lemma:saw,pos:noun,number:singular}

所有这些属性都来自第三方工具,Lucene本身并没有参与消歧这个词。

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

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

也许可以应用一些发布列表有效负载的黑客?

UPD:我的解决方案草案

以下是我的项目的具体内容:一个单词可以拥有固定的最大解析(例如,8)。 因此,我想在每个属性的有效负载中插入解析号,并在发布列表交叉阶段使用此有效负载。 例如,我们有一个'pos = Verb'的发布列表,如... | ... | 1.1234 | ... | ...,以及'number = Singular'的发布列表:... | ... | 2.1234 | ... | ... 在发布列表处理的所有阶段处理'pos = Verb AND number = singular'之类的查询时,'x.1234'条目将被接受,直到交叉阶段由于非对应的解析数而被拒绝。

我认为这是一个非常紧凑的解决方案,但将它融入Lucene有多难?

1 个答案:

答案 0 :(得分:2)

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

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

一种方式:

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

示例:

锯成为名词 - 锯 - 将其作为索引。 锯也变成了名词 - 过去看 - 把它作为索引。 锯也成为名词 - 过去 - 单数 - 看 - 索引它。

另一种方式:

如果您希望在单个索引中进行基于属性的查找,则可能必须执行类似排列完成的操作' saw'因此,您不必使用名词 - 锯,而是拥有大逻辑陈述中所需属性的所有可能排列。

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