2013-11-28 57 views
2

我正在尝试使用Jellyfish来处理模糊字符串。我注意到Damerau–Levenshtein distance算法的一些奇怪行为。例如:水母的Damerau-Levenshtein距离计算车?

import jellyfish as jf 
In [0]: jf.damerau_levenshtein_distance('ZX', 'XYZ') 
Out[0]: 3 
In [1]: jf.damerau_levenshtein_distance('BADC', 'ABCD') 
Out[1]: 3 

依我看两者都应该得分2.

在第一示例

  1. ZXXZ(转置相邻的字符)
  2. XZXYZ(插入Y

在第二个范例

  1. BACDABDC(转置相邻BA字符)
  2. ABDCABCD(转置相邻DC字符)

这是有点毛病算法,还是我误解了措施?任何指导将不胜感激。

编辑

只是为了让事情更奇怪的,我还注意以下事项:

In [3]: jf.damerau_levenshtein_distance('jellyifhs', 'jellyfish') 
Out[3]: 2 
In [4]: jf.damerau_levenshtein_distance('ifhs', 'fish') 
Out[4]L 3 

这是特别奇怪,因为编辑的数量不应仅仅是两个在这两个例子,但它们是完全相同的编辑次数:

在第三示例

  1. jellyifhsjellyfihs(转置相邻的字符if
  2. jellyfihsjellyfish(转置相邻的字符hs

在第四示例

  1. ifhsfihs(转置相邻字符if
  2. fihsfish(转置相邻的字符hs
+0

我认为转置算作两步。 – aIKid

+0

@aIKid:两个相邻字符的换位是一个操作/步骤。 – 0xc0de

+1

+1,看起来他们已经实现了OSA而不是Damerau-Levenshtein距离。 – 0xc0de

回答

1

wikipedia

在信息理论和计算机科学,Damerau-Levenshtein距离(弗雷德里克·J·达梅劳和Vladimir I.得名Levenshtein)[引用需要]是两个字符串之间的“距离”(字符串度量),即有限的符号序列,通过计算将一个字符串转换为另一个字符串所需的最小操作次数给出,其中操作被定义为插入,删除或替换单个字符,或转换两个相邻字符。

但是,如果你继续读下去,

就拿CA和ABC之间的编辑距离。因为CA→AC→ABC,所以Damerau-Levenshtein距离LD(CA,ABC)= 2,但是因为如果使用操作CA→AC,所以不是最佳的字符串对准距离OSA(CA,ABC)= 3可能使用AC - > ABC,因为这会要求子字符串被多次编辑,这在OSA中是不允许的,因此最短的操作顺序是CA-> A-> AB-> ABC。请注意,对于最佳字符串对齐距离,三角形不等式不成立:OSA(CA,AC)+ OSA(AC,ABC)< OSA(CA,ABC),因此它不是一个真正的度量标准。

编辑:

source服用后一看,很明显,该函数计算OSA,而不是Damerau–Levenshtein distance

+1

这似乎很清楚地表明“Damerau-Levenshtein距离LD(CA,ABC)= 2”这就是为什么当水母返回同样的问题时3 –

+1

是的,我的不好,看起来像实现计算OSA。提交了一个问题https://github.com/sunlightlabs/jellyfish/issues/13。 – 0xc0de

+0

多数民众赞成在我以为...其实我也发现jaro_distance错误。我在github上,但从来没有使用它,直接发邮件给他们或者在github上做些什么更好? –