Coffeescript 咖啡脚本中的Levenshtein距离公式?
我正在尝试创建或找到Levenshtein距离公式的CoffeeScript实现,也称为编辑距离。这是我到目前为止所拥有的,如果有任何帮助,我将不胜感激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 = (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,但不是这样工作的。这是为什么?@joec1
和c2
是字符串中的实际字符。如果不同,则成本
为1
;否则,成本
为0
。不是CS,而是可以从中调用: