单词之间的详细距离

我该如何显示单词之间的详细距离。 例如,程序的输出可以是:
Words are "car" and "cure":
Replace "a" with "u".
Add "e".
Levenshtein距离不能满足我的需求(我认为)。     
已邀请:
请尝试以下方法。该算法大致遵循维基百科(Levenshtein距离)。下面使用的语言是ruby 例如,将
s
改为
t
的情况如下:
s = 'Sunday'
t = 'Saturday'
首先,将
s
t
转换为数组,并在开头插入一个空字符串。
m
最终将成为算法中使用的矩阵。
s = ['', *s.split('')]
t = ['', *t.split('')]
m = Array.new(s.length){[]}
然而,
m
与维基百科中的算法给出的矩阵不同,因为每个单元格不仅包括Levenshtein距离,还包括(非)操作(开始,不执行任何操作,删除,插入或替换)用于从相邻(左,上或左上)单元格到达该单元格的单元格。它还可以包括描述操作参数的字符串。也就是说,每个单元格的格式是: [Levenshtein距离,操作(,字符串)] 这是主要的例行程序。它按照算法填充
m
的单元格:
s.each_with_index{|a, i| t.each_with_index{|b, j|
    m[i][j] =
    if i.zero?
        [j, "started"]
    elsif j.zero?
        [i, "started"]
    elsif a == b
        [m[i-1][j-1][0], "did nothing"]
    else
        del, ins, subs = m[i-1][j][0], m[i][j-1][0], m[i-1][j-1][0]
        case [del, ins, subs].min
        when del
            [del+1, "deleted", "'#{a}' at position #{i-1}"]
        when ins
            [ins+1, "inserted", "'#{b}' at position #{j-1}"]
        when subs
            [subs+1, "substituted", "'#{a}' at position #{i-1} with '#{b}'"]
        end
    end
}}
现在,我们将
i
j
设置到
m
的右下角,然后按照步骤向后移动,因为我们将单元格的内容移动到一个名为
steps
的数组中,直到我们到达开始。
i, j = s.length-1, t.length-1
steps = []
loop do
    case m[i][j][1]
    when "started"
        break
    when "did nothing", "substituted"
        steps.unshift(m[i-=1][j-=1])
    when "deleted"
        steps.unshift(m[i-=1][j])
    when "inserted"
        steps.unshift(m[i][j-=1])
    end
end
然后我们打印操作和每个步骤的字符串,除非这是非操作。
steps.each do |d, op, str=''|
    puts "#{op} #{str}" unless op == "did nothing" or op == "started"
end
通过这个特定的例子,它将输出:
inserted 'a' at position 1
inserted 't' at position 2
substituted 'n' at position 2 with 'r'
    

要回复问题请先登录注册