javascript - 索引字典的编辑距离

标签 javascript levenshtein-distance

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

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

最佳答案

我会建议我的 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;
            }
        }
    };
})();

关于javascript - 索引字典的编辑距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17119031/

相关文章:

javascript - 使用重定向方法的 OAuth.callback 获取推文时出现 OAuth.io 未定义错误

algorithm - 如何判断字符相似度?

ruby-on-rails - 推荐需要 : Rails, Postgres 和模糊全文搜索

java - 如何有效地检查两个字符是否是键盘上的邻居?

python - 将列表中相似的字符串分组在一起

javascript - 在 Javascript 中对特殊字符进行排序 (Æ)

javascript - XMLHttpRequest 在 phantomjs 中异步失败

asp.net - Response.Redirect 偶尔会导致错误,但我无法重现它

javascript - 如何在 jwplayer 5 中单击播放按钮时收到警报消息?

tsql - T-SQL 中的编辑距离