我有一个包含大量单词的单元数组字典(大约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
答案 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。见