机器学习是时下流行AI技术中一个很重要的方向,无论是有监督学习还是无监督学习都使用各种“度量”来得到不同样本数据的差异度或者不同样本数据的相似度。良好的“度量”可以显著提高算法的分类或预测的准确率,本文中将介绍机器学习中各种“度量”,“度量”主要由两种,分别为距离、相似度和相关系数,距离的研究主体一般是线性空间中点;而相似度研究主体是线性空间中向量;相关系数研究主体主要是分布数据。本文主要介绍字符串距离。
1 汉明距离——等长字符串对应位置差异
在信息论中,两个等长字符串之间的汉明距离(Hamming distance)是两个字符串对应位置的不同字符的个数。换句话说,它就是将一个字符串变换成另外一个字符串所需要替换的字符个数。
汉明重量是字符串相对于同样长度的零字符串的汉明距离,也就是说,它是字符串中非零的元素个数:对于二进制字符串来说,就是1的个数,所以11101的汉明重量是4。例如:
1017101与1007001之间的汉明距离是2
9143896与9233796之间的汉明距离是3。
karolin与kathrin之间的汉明距离是3。
如图1给出了汉明距离几何意义,所示任意两个顶点之间的最小距离是两个二进制字符串之间的汉明距离。
图1 汉明距离的几何意义
汉明距离是以理查德·卫斯里·汉明的名字命名的,汉明在误差检测与校正码的基础性论文中首次引入这个概念。在通信中累计定长二进制字中发生翻转的错误数据位,所以它也被称为信号距离。汉明重量分析在包括信息论、编码理论、密码学等领域都有应用。但是,如果要比较两个不同长度的字符串,不仅要进行替换,而且要进行插入与删除的运算,在这种场合下,通常使用更加复杂的编辑距离等算法。下面介绍另一个常用的字符串距离——编辑距离。
2 编辑距离——一个串变为另一个串的距离
编辑距离是针对二个字符串(例如英文字)的差异程度的量化量测,量测方式是看至少需要多少次的处理才能将一个字符串变成另一个字符串,处理只包括插入一个字符、删除一个字符、新增一个字符。编辑距离可以用在自然语言处理中,例如拼写检查可以根据一个拼错的字和其他正确的字的编辑距离,判断哪一个(或哪几个)是比较可能的字。以下为编辑距离的例子
"kitten" and "sitting"的编辑距离是3,这是因为:
第一次处理:kitten → sitten (替换一个字符,"s" 替换了 "k")
第二次处理:sitten → sittin (替换一个字符, "i" 替换了 "e")
第三次处理:sittin → sitting (插入一个字符, 字符串末尾插入了 "g").
那么编辑距离如何计算了?假定函数dist(A, B)表示字串A转变到字串B的编辑距
离,那么对于下面3种极端情况,我们很容易给出解答(NULL表示空串)。
dist(NULL, NULL) = 0
dist(NULL, s) = s的长度
dist(s, NULL) = s的长度
对于一般的情况,dist(A, B)我们应该如何求解呢?假定我们现在正在求解dist(A+c1, B+c2),在这里A和B是字符串,c1和c2都是字符。dist(A+c1, B+c2)也就是把"A+c1"转变成"B+c2"。在这个转变过称中,我们要分情况讨论:
(1) A可以直接转变成B。这时我们只要把c1转成c2就可以了(如果c1 != c2)。
(2) A+c1可以直接转变成B。这时我们处理的方式是插入c2。
(3) A可以直接转成B+c2。这时的情况是我们需要删除c1。
综合上面三种情况,dist(A+c1, B+c2)应该是三者的最小值。因此我们可以定义这样一个函数——edit(i, j),它表示第一个字符串的长度为i的子串到第二个字符串的长度为j的子串的编辑距离。显然可以有如下动态规划公式:
if i = 0 且 j = 0,edit(i, j) = 0
if i = 0 且 j > 0,edit(i, j) = j
if i > 0 且j =0,edit(i, j) = i
if i ≥ 1 且 j ≥ 1, 若A第i个字符等于B第j个字符edit(i, j)=min{edit(i-1, j) + 1, edit(i, j-1) + 1, edit(i-1, j-1)};否则edit(i, j)=min{edit(i-1, j) + 1, edit(i, j-1) + 1, edit(i-1, j-1) + 1}。
结合"kitten" and "sitting"可得图2编辑距离矩阵,矩阵右下角数值就是两个字符串编辑距离。
图2 kitten和sitting编辑距离矩阵
- 还没有人评论,欢迎说说您的想法!