优化许多单词的Levenshtein距离的速度

时间:2014-12-03 14:43:36

标签: performance matlab levenshtein-distance

我有一个包含大量单词的单元数组字典(大约15000)。

我想计算所有单词对的函数strdist(计算Levenshtein距离)。我试过两种方式,但它们都很慢。什么是更有效的解决方案?

这是我的代码(dict_keys是我的长度为m的单元格数组):

1)

matrix = sparse(m,m);
for i = 1:m-1;
    matrix(i,:) = cellfun( @(u) strdist(dict_keys{i},u), dict_keys );
end

2)

matrix = sparse(m,m);
for i = 1:m-1;
  for j = i+1:m
     matrix(i,j) = strdist(dict_keys{i},dict_keys{j});
  end   
end

2 个答案:

答案 0 :(得分:1)

函数'strdist'不是内置的matlab函数,所以我猜你是从File Exchange得到的。这也是为什么你的方法在时间上大致相等的原因,cellfun内部只是扩展成一个循环。

如果strdist是对称的,即strdist(a,b)== strdist(b,a),则可以节省一半的计算量。这似乎是这种情况,所以只计算第二个循环(你正在做的)j<i的所有情况。

否则你可以在C中实现strdist作为mex函数,并且可能会看到一些显着的速度改进。例如,可以在rosettacode.org找到Levenshtein距离的C实现。

或深入研究算法如何计算两个字符串的距离,看看是否可以对其进行矢量化并将运算符从二次方减少得更少。然而,这可能不是很容易。

最后,如果您获得许可的Parallel Computing Toolbox和多核CPU,您可以轻松地对代码进行并行化,因为strdist调用完全相互独立。

答案 1 :(得分:1)

有几种更快的方法,如Levenshtain Automata。见

  1. http://en.wikipedia.org/wiki/Levenshtein_automaton
  2. http://blog.notdot.net/2010/07/Damn-Cool-Algorithms-Levenshtein-Automata
  3. https://www.google.com.ng/search?q=Fast+approximate+search+in+large+dictionaries(许多不同的论文。你也可以参考CiteSeerX上的论文(反向)。