levenshtein距离为索引字典

时间:2013-06-15 00:20:08

标签: javascript levenshtein-distance

我目前在使用模糊字符串匹配器时遇到了问题。我希望能够在不到一秒的时间内快速确定10,000个短语列表中的哪些短语与字典中200,000个短语中的任何一个的编辑距离为2或更小,使用Javascript。短语平均每个约15个字符。我不关心有多少场比赛,甚至比赛是什么,只是有没有比赛。我可以在我想要的字典中进行任何索引,但在其他单词上没有。

我的主要方法是使用BK树。对所有10,000个单词进行分类通常需要大约130-140秒,因此比我希望的低两个数量级。能够在Javascript中快速对短语进行分类是否现实?如果是这样,我应该使用什么技术,是否有比BK树更快的方法用于这样的问题?

1 个答案:

答案 0 :(得分:1)

我会建议我的Levenshtein实施,因为它是我见过的最快的。

var levenshtein = (function() {
    var row2 = [];
    return function(s1, s2) {
        if (s1 === s2) {
            return 0;
        } else {
            var s1_len = s1.length, s2_len = s2.length;
            if (s1_len && s2_len) {
                var i1 = 0, i2 = 0, a, b, c, c2, row = row2;
                while (i1 < s1_len)
                    row[i1] = ++i1;
                while (i2 < s2_len) {
                    c2 = s2.charCodeAt(i2);
                    a = i2;
                    ++i2;
                    b = i2;
                    for (i1 = 0; i1 < s1_len; ++i1) {
                        c = a + (s1.charCodeAt(i1) === c2 ? 0 : 1);
                        a = row[i1];
                        b = b < a ? (b < c ? b + 1 : c) : (a < c ? a + 1 : c);
                        row[i1] = b;
                    }
                }
                return b;
            } else {
                return s1_len + s2_len;
            }
        }
    };
})();