Coffeescript 咖啡脚本中的Levenshtein距离公式?

Coffeescript 咖啡脚本中的Levenshtein距离公式?,coffeescript,levenshtein-distance,edit-distance,Coffeescript,Levenshtein Distance,Edit Distance,我正在尝试创建或找到Levenshtein距离公式的CoffeeScript实现,也称为编辑距离。这是我到目前为止所拥有的,如果有任何帮助,我将不胜感激 levenshtein = (s1,s2) -> n = s1.length m = s2.length if n < m return levenshtein(s2, s1) if not s1 return s2.length previous_row

我正在尝试创建或找到Levenshtein距离公式的CoffeeScript实现,也称为编辑距离。这是我到目前为止所拥有的,如果有任何帮助,我将不胜感激

levenshtein = (s1,s2) ->
    n = s1.length
    m = s2.length
    if n < m
        return levenshtein(s2, s1) 
    if not s1 
        return s2.length
    previous_row = [s2.length + 1]
    for c1, i in s1
        current_row = [i + 1]
        for c2, j in s2
            insertions = previous_row[j + 1] + 1
            deletions = current_row[j] + 1
            substitutions = previous_row[j] # is this unnescessary?-> (c1 != c2)
            current_row.push(Math.min(insertions,deletions,substitutions))
        previous_row = current_row
    return previous_row[previous_row.length-1]
#End Levenshetein Function
levenshtein=(s1,s2)->
n=s1.5米长
m=s2.5米长
如果n(c1!=c2)
当前行推送(Math.min(插入、删除、替换))
上一行=当前行
返回上一行[上一行.长度-1]
#结束Levenshetein函数
顺便说一句:我知道这个准则在很多方面都是错误的,我很高兴收到任何和所有建设性的批评。只是想改进一下,找出这个公式

CodeEdit1:修复了Trevor指出的错误,上面的当前代码包括这些更改

更新:我要问的问题是-我们如何在咖啡脚本中使用Levenshtein

以下是Levenshtein距离算法的“步骤”,帮助您了解我试图实现的目标

台阶 1
将n设置为s的长度。 将m设置为t的长度。 如果n=0,则返回m并退出。 如果m=0,则返回n并退出。 构造一个包含0..m行和0..n列的矩阵

2
将第一行初始化为0..n。 将第一列初始化为0..m

3检查s的每个字符(i从1到n)

4检查t(j从1到m)的每个字符

5如果s[i]等于t[j],则成本为0。 如果s[i]不等于t[j],则成本为1

6将矩阵的单元格d[i,j]设置为以下最小值: A.正上方的电池+1:d[i-1,j]+1。 B紧靠左边的单元格加上1:d[i,j-1]+1。 C对角线上方和左侧的单元格加上成本:d[i-1,j-1]+成本

7迭代步骤(3、4、5、6)完成后,在单元d[n,m]中找到距离

资料来源:http://www.merriampark.com/ld.htm(链接到您提到的资源)提供了Levenshtein距离算法的JavaScript实现。基于这一点和您发布的代码,以下是我的咖啡脚本版本:

LD = (s, t) ->
  n = s.length
  m = t.length
  return m if n is 0
  return n if m is 0

  d       = []
  d[i]    = [] for i in [0..n]
  d[i][0] = i  for i in [0..n]
  d[0][j] = j  for j in [0..m]

  for c1, i in s
    for c2, j in t
      cost = if c1 is c2 then 0 else 1
      d[i+1][j+1] = Math.min d[i][j+1]+1, d[i+1][j]+1, d[i][j] + cost

  d[n][m]

它似乎可以进行轻度测试,但如果有任何问题,请告诉我。

我们如何在CoffeeScript中实现Levenshtein距离?当前代码有三个大问题:1)
previouis\u行
是一个打字错误,2)
前一行[-1]
无法工作,因为CoffeeScript不使用负索引(使用
previous\u行)[上一行长度-1]
),和3)
+(c1!=c2)
添加
true
false
。我会发布一个更完整的答案,但你应该马上纠正这三件事。此外,CoffeeScript的
for…in
语法是
value,index
,而不是反过来。因此你的循环应该是
对于c1,I在s1
中,而
对于c2,j在s2
。非常感谢特雷弗。我会让你知道我期待着得到你即将出版的书的硬拷贝(不要着急!).Trevor此解决方案非常有效。我针对JavaScript实现对其进行了测试,得到了相同的结果。我有一个问题:为什么我们要使用变量c1和c2?在我看来,它应该使用变量n和m,但不是这样工作的。这是为什么?@joe
c1
c2
是字符串中的实际字符。如果不同,则
成本
1
;否则,
成本
0
。不是CS,而是可以从中调用: