1 / 3
文档名称:

编辑距离--计算字符串相似度.docx

格式:docx   大小:106KB   页数:3页
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

编辑距离--计算字符串相似度.docx

上传人:762357237 2019/3/28 文件大小:106 KB

下载得到文件列表

编辑距离--计算字符串相似度.docx

文档介绍

文档介绍:基于编辑距离求两个字符串的相似度最近在编程之美这本书上看到这样一道题,计算两个字符串的相似度。首先得明确的是两个字符串的相似度有很多定义,既有字符表面意义的,如apple和applet很接近只相差1个字符,但是意思相差很远,也有基于语义的,如person和people,人的单复数,但是相差了好几个字符。这里主要讨论字符表面意义的相似度。在给出字符串表面意义的相似度之前首先给出编辑距离的概念。编辑距离是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。例如将kitten一字转成sitting:①sitten(k→s)②sittin(e→i)③sitting(→g)总共需要三次变换,那么他们之间的距离就是3定义:相似度=1/(编辑距离+1),?编程之美上给的解法个人没看懂。于是搜索出另外一种解法,简易明确。算法思路如下:给出字符串s1,字符串s2,长度分别是m和n。初始化:构造一个矩阵distance,(m+1)×(n+1),其中第一行写上0-m,第一列写上0-n。构造:给每个矩阵元素赋值,赋值规则如下,如果当前指向的s1和s2中的元素相同,(left),上面的值(top),左上角的值(left-top),取出最小值min。如果min是left或top,那么current=min+=min+cost。依次赋值,distance[m][n]就是两个字符串的编辑距离。例子:kitten和sitting的距离矩阵如下:原理:为什可以这样做呢?为什么这样做能够求出两个字符串的编辑距离呢?自己的考量如下,各位看官若有不对,不完善之处,恳请纠正。首先看初始化,第一行0-m,显然是空字符到一个长度m的字符串的距离,就是依次加上去呗!执行插入操作。第一列的值也是同样的道理。那么第二步构造是啥意思呢?为了简便起见,假设我们正在填distance[3][3]。该点的值无非是三种选择。current=left+1=3执行插入操作。依次变化为ki->si->s->sicurrent=top+1=3执行删除操作。依次变化为ki->si->sii->sicurrent=left-top+cost=1不执行任何操作。依次变化为ki->si。显然这种方式最优用装逼语言描述如下:设s1=a1,…,am-1,=b1,…,bn-1,bn。由s1到s2经过这三种途径(保证完备性)由a1,…,am-1,am到b1,…,bn-1,最后插入bn由a1,…,am-1到b1,…,bn-1,bn,最后删除am由a1,…,am-1到b1,…,bn-1,最后将am改成bn这上述三种方式对应上面的a,b,c三种方式。因此我们取他们之间的最小值然后得到当前距离可能能保持最小,即编辑距离。附Java代码classeditDistance{ privateStrings1; privateStrings2; publiceditDistance(Strings1,Strings2){ =s1; =s2; } publicdoublegetS