基于Java中度量距离的快速字符串检索

时间:2015-02-05 02:55:00

标签: java algorithm search edit-distance metric

给定一个任意字符串 s ,我想要一种从大量字符串M(其中| M |>)快速检索所有字符串S⊆M的方法。 1百万),其中S的所有字符串具有最小的编辑距离<来自 s 的t(某个最低阈值)。

最糟糕的是,如果M中没有字符串符合此条件,则S可能为空,并且最多只有S = { s }(完全匹配)。对于介于两者之间的任何情况,我完全相信S可能非常大。

一般情况下,我希望修复最大编辑距离阈值(例如2),并且需要在任意字符串 s 上执行此操作很多次,因此,需要一种有效的方法,因为天真地迭代和测试所有字符串会太昂贵。

虽然我使用编辑距离作为示例指标,但我也想使用其他指标,例如Jaccard索引。

任何人都可以对现有的Java实现提出建议,或者指出正确的算法和数据结构来解决这个问题吗?

更新#1

我已经了解到Metric trees正是我所追求的那种结构,它利用距离度量来根据它们与度量的距离来组织M中的字符串子集。 Vantage-PointBK和其他类似的度量树数据结构和算法似乎都适用于此类问题。现在,在Java中找到易于使用的实现......

更新#2

结合使用此bk-tree和此Levenshtein distance实现,我成功地能够从一百万字符串的集合(M)中检索任意字符串的子集,并且检索时间大约为为10ms。

2 个答案:

答案 0 :(得分:2)

BK trees专为此类案例而设计。它适用于公制距离,例如Levenshtein或Jaccard指数。

答案 1 :(得分:0)

虽然我自己从未尝试过,但可能值得一看Levenshtein Automaton。我曾经给这篇文章添加了书签,它看起来相当复杂,并提供了几个代码片段:

Damn Cool Algorithms: Levenshtein Automata

正如H W已经提到的,你将无法避免检查字典中的每个单词。但是,自动机将加快计算距离。将此与您词典的高效数据结构相结合(例如,维基百科文章中提到的Trie),您可以加速当前的方法。