编辑距离部分的详解, 比较推荐:
(1)大神matrix67的文章:编辑距离、拼写检查与度量空间:一个有趣的数据结构
(2)知乎专栏:字符串相似度之美(一) 字符串相似度之美(二)
本文转载于 字符串相似性的几种度量方法
1、余弦相似性(cosine similarity)
余弦相似性大家都非常熟悉,它是定义在向量空间模型(VSM)中的。它的定义如下:
其中,A,B为向量中间中的两个向量。
2、欧氏距离(Euclidean distance)
欧氏距离大家非常熟悉,定义在向量空间模型中,计算使用欧氏距离公式:
3、编辑距离(edit distance)
4、海明距离(hamming distance)
海明距离用于表示两个等长字符串对应位置不同字符的总个数,也即把一个字符串换成另一个字符串所需要的替换操作次数。根据定义,可以把海明距离理解为编辑距离的一种特殊情况,即只计算等长情况下替换操作的编辑次数。举个例子来讲,字符串“bob”与“pom”的海明距离为2,因为需要至少两次的替换操作两个字符串才能一致。海明距离较常用与二进制串上的操作,如对编码进行检错与纠错。在计算长字符串的相似性时可以 通过hash函数将字符串映射成定长二进制串再利用海明距离来计算相似性。
海明距离的计算比较简单,通过一个循环来比较对应位置的字符是否相同即可。
5、Dice 距离
6、Jaccard distance
杰卡德系数的定义如下,
7、J-W距离(Jaro–Winkler distance)
8、有限状态自动机FSA(Finite State Automaton)
这是一个单词food,最大编辑距离为2的LA示意图。
左下角的是自动机状态的起点节点,每个节点的状态用如图的形式来描述,n表示当前走到了第几个字符,e表示的是错误的个数(有一个错误就要消耗一个编辑距离来修正)。水平向右的箭头表示没有修改,垂直向上的箭头表示插入,两种类型的对角线分别表示替换(有*号)和删除。
机智的你已经发现,只要随便给出一个单词,经过这张图之后能走到最右边的节点集中,取最小的e就是这两个单词的最短编辑距离。
显然,复杂度是O(kN),N是构造自动机的单词长度(如上述food),k是编辑距离最大阈值,一般来说k是一个比较小的常数,所以我们可以认为通过自动机来求限定状态下两个字符串的最短编辑距离只花了线性时间。