Lucene模糊短语搜索方法与评分

时间:2013-09-06 17:02:32

标签: lucene levenshtein-distance fuzzy-search

我的要求是在模糊短语搜索上生成匹配分数。 实施例

1)输入数据 - 你好Sam,你好吗?谢谢,史密斯。

  • 索引文档 - Sam Smith(文档总是人/组织名称,输入数据是自由文本数据)

在上面的例子中,Sam和Smith都在我的输入数据中找到,但在上下文中都是不同的人。如果我的输入数据是“你好Sam Smith”,那么我应该得到更高分的相关命中(我也期待“Hello Sam John Smith”的OK分数等等)。

我在这里使用Lucene进行主要过滤,之后将使用输入数据对匹配的文档进行后处理并定义匹配分数(使用levenshtein),它也适用于模糊。

准确的方法,

1)索引文件为Tri-Grams

2)使用Tri-Gram索引搜索输入自由文本数据

3)收集所有匹配的文件(这将有很多噪音数据)

4)对每个匹配的文档进行后处理,并在输入的自由文本数据中定义每个匹配的三元组令牌的位置,并计算可能的位置标记和整个文档之间的levenshtein分数。

例如 - 你好Sam,你好吗?谢谢,史密斯。

在这里,我的文档匹配将是“Sam Smith”,我想在输入的自由文本数据中查看每个三元索引及其位置匹配,例如

1)令牌“sam”与输入数据中的第二个位置词“Sam”相匹配

2)令牌“smi”与输入数据中的第8个位置词“Smith”相匹配

稍后我将编写逻辑来计算令牌2,8的levenshtein得分与实际匹配的文档(考虑到位置2和8之间的接近度,它将是非常少的得分),但是如果令牌的位置是2,3(或2, 4)我会得到很好的得分。

希望获得专家对此方法的反馈,或者更好的建议,谢谢。

1 个答案:

答案 0 :(得分:0)

我在Lucene中使用标记化序列进行类似的模糊短语匹配。使用Levenshtein或JaroWinkler计算令牌距离,然后使用Smith-Waterman找到最佳序列比对。如果我要将这种方法适用于您的情况,那么问题就是对齐评分没有办法(直接)支持令牌交换(替代令牌替换)。我唯一能做的就是为源代码中出现的代币插入成本降低而不是那些代币成本。

所以我喜欢n-gram方法来获得对非本地重新排序不太敏感的评分。我建议查看BLEU,METEOR和ROUGE,它们是句子相似性的标准n-gram指标,以及处理订单敏感度的各种方法。它们可以与提案中的字符级n-gram一起使用,也可以与我正在使用的令牌级n-gram一起使用。