可以改善Damerau-Levenshtein吗?


9

我最近从Wikipedia上的伪代码实现了Damerau-Levenshtein距离算法。我找不到它是如何工作的任何解释和伪采用完全无信息变量的名称,如DADBi1,和j1我留下抓我的头。

这是我在Python中的实现:https : //gist.github.com/badocelot/5327337

Python的实现帮助我遍历了程序并弄清了正在发生的事情,将变量重命名为更有用的名称。我很熟悉Wagner-Fischer的方法来计算Levenshtein距离,因此有了参考系。

冒着过长的风险,这就是我对Damerau-Levenshtein的理解:

神秘变量:

  • DAlast_row在我的代码中)是一种地图,其中包含每个元素被查看到的最后一行;在我的代码中,这是一个实际的Python字典
  • DBlast_match_col)保留最后一列,其中输入的字母ba当前行的输入字母匹配
  • i1last_matching_row)是来自DA当前字母的行号b
  • j1只是DB/ 值last_match_col可能被更新之前的副本;在我的代码中,我只是移动了last_match_col更新并消除了此变量的位置

换位成本:

H[i1][j1] + (i-i1-1) + 1 + (j-j1-1)

正在计算将当前字符换成已知b的最后一个字符(最后一个匹配项)所花费的费用,将之间的所有字符都视为增加或删除。ba

成本要素:

  • H[i1][j1] 将基本成本还原到转置之前的计算点,因为找到转置会使先前的工作无效
  • (i-i1-1) 是当前行与匹配当前字符的最后一行之间的距离,这是需要删除的数量
  • (j-j1-1) 是当前列与具有匹配项的最后一列之间的距离,即相加次数
  • 多余+ 1的只是换位本身的成本

如果此分析不正确,我很想知道我哪里做错了。就像我说的那样,我找不到关于该算法如何在线工作的任何详细说明。

改进版?

已经想通了这一点,虽然,它让我吃惊的是,通过计算成本增加和调换字母之间的缺失似乎有缺陷的:一个加法和一个删除相当于替代,这,这是不检查。

如果一切正确,那么解决方案应该是微不足道的:转置字母之间的字母成本应为添加和删​​除中的较高者:将尽可能多的字母转换为替换,并添加所有剩余的添加或删除。

因此成本为:

H[i1][j1] + max((i-i1-1), (j-j1-1)) + 1

这是该版本的代码:https : //gist.github.com/badocelot/5327427

从一些简单的测试来看,这似乎是正确的。例如,“ abcdef”->“ abcfad”的编辑距离为2(转置“ d”和“ f”,将“ e”更改为“ a”),而原始算法给出的距离为3(最后三个)字母是替换,或1个换位+ 1个加+ 1个删除)。

现在,我不能成为第一个想到这一点的人。那么,为什么我没有碰到它呢?我只是搜索时间不够长吗?还是存在一些细微的缺陷使它无法真正起作用?


我决定写一篇博客文章中详细解释DL:scarcitycomputing.blogspot.com/2013/04/...
詹姆斯詹森

Answers:


3

我必须在维基百科上查找Damerau-Levenshtein的距离,如果这是错误的话,请原谅我。但看起来它只允许转置相邻的字母,而不允许任何任意字母。因此,带有d和f转置的示例“ abcdef”->“ abcfad”不起作用。在我看来,您已经修改了算法的定义,并且不再计算Damerau-Levenshtein距离。


嗯,我明白你的意思了。DL允许在添加之前或删除之后进行转置。如果两者都发生,那么它实际上并不是相邻的转置,因此成本飞涨和转置成本将不会被选作新成本。似乎正在处理这两个问题,因为它通过最小化成本的副作用避免了它们。
James Jensen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.