【问题标题】:Edit distance such as Levenshtein taking into account proximity on keyboard编辑距离,例如 Levenshtein,考虑到键盘上的接近度
【发布时间】:2015-03-24 13:27:04
【问题描述】:

是否存在考虑替换距离的编辑距离,例如 Levenshtein?

例如,如果我们考虑单词是否相等,typotylo 非常接近(pl 在键盘上物理上接近),而 typotyqo 是离的远。我想为更可能的错别字分配更小的距离。

必须有一个衡量这种混合性的指标吗?

【问题讨论】:

  • 你的意思是Damerau-Levenshtein
  • 我看到了,但没有意识到“相邻字符的换位”实际上是我的意思。虽然我想我不仅在寻找相邻的字符,而且更多的是二次加权距离(不仅是相邻的)谢谢!
  • 我认为该方案中的相邻是指转换单词中相邻的字符(例如,want vs wnat),而不是键盘上的相邻字符。
  • @JRichardSnape “情节扭曲”确实....
  • 您是否尝试将 Damerau-Levenshtein(或替换,如果您真的只想考虑键盘“未命中”)与@marmeladze 答案中建议的某种欧几里得距离相结合?似乎是找我的方法,还是有更多需要考虑/对你不起作用?

标签: python levenshtein-distance


【解决方案1】:

你问的那种距离不包括在 levenshtein 中 - 但你应该使用像欧几里得或曼哈顿距离这样的助手来获得结果。我的简单假设是,q(英文 qwerty 布局) 是笛卡尔坐标 (y=0; x=0) 因此,w 将是 (y=0; x=1) 等等。 whole list here

keyboard_cartesian= {
                     'q': {'y': 0, 'x': 0},
                     'w': {'y': 0, 'x': 1},
                     'e': {'y': 0, 'x': 2},   
                     'r': {'y': 0, 'x': 3},    
                      # ...
                     'a': {'y': 1, 'x': 0}, 
                      #...
                     'z': {'y': 2, 'x': 0},
                     'x' : {'x':1, 'y':2},
                      #   
                     }

假设,单词 qaz 有一个含义。 qazwazeaz 之间的 levenshtein 距离为 1。要检查哪个拼写错误的可能性更大,取差值(此处为 (q,w) 和 (q,e))并计算欧几里得距离

>>> from math import *
>>> def euclidean_distance(a,b):
...     X = (keyboard_cartesian[a]['x']-keyboard_cartesian[b]['x'])**2
...     Y = (keyboard_cartesian[a]['y']-keyboard_cartesian[b]['y'])**2
...     return sqrt(X+Y)
... 
>>> euclidean_distance('q', 'w')
1.0 
>>> euclidean_distance('q', 'e')
2.0

这意味着 qaz 拼写错误,因为 wazqaz 更容易拼写为 eaz

【讨论】:

    【解决方案2】:

    http://www.melissadata.com/webhelp/ssis/updated/Components/Fuzzy_Match/Algorithms.htm 提到:“Needleman-Wunsch - Levenshtein 算法的一种变体。Levenshtein 和 Needleman-Wunsch 是相同的,只是字符错误根据标准键盘布局上两个字符的距离赋予不同的权重. 例如:A 到 S 的错误权重为 0.4,而 A 到 D 为 0.6,A 到 P 为 1.0" 但Needleman-Wunsch Wikipedia article 没有提及键盘布局接近度...但也许你应该调查一下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-15
      • 2018-09-21
      • 1970-01-01
      • 2021-08-04
      • 1970-01-01
      • 1970-01-01
      • 2010-11-09
      相关资源
      最近更新 更多