`

计算字符串相似度的矩阵算法

阅读更多

计算字符串相似度的矩阵算法

李彬

(武汉理工大学计算机学院  武汉  430070)

摘  要:用两个字符串滑动比较时匹配的字符数和两字符串滑动比较的重叠率定义了相似度的衡量指标,在确定一个字符串较另一个字符串较少的情况下,设计了一种算法,实现了在字符串匹配矩阵中确定插入空格的位置使相似度指标达到最大值,可以用于信息的模糊检索。

关键词:匹配率;相似度;匹配矩阵;信息量

中图法分类号:TP301.6

       The Matrix Arithmetic of Computing Strings' Similar Degree 

                          LI Bin

  ( Department Of Computer Of Wu’han University of Technology   Wu’han 430070  China)

Abstract:The similar degree is defined based on the number of matching chars and the overlaping ratio of two strings’ chars when two strings do comparison during gliding.Designing a arithmetic under the sistuation that making sure the length of one string is smaller than another strings’ and makeing sure the position of inserting blank space in strings’ matching matrix makes similar degree gain the biggest value,this arithmetic can used for the misty index of the information.

Key Words: Matching Ratio;Similar Degree;Matching Matrix;Information Quantity

1 引言

随着现代科学技术的发展,生物学中的DAN序列的相似性的比较可以用于亲子鉴定等,医学中应用病毒基因的相似性来诊治疾病。与之相似,随着计算机的发展,字符串的相似问题也成了计算科学中一个非常重要的问题,也提出了很多关于字符串匹配和相似度的算法,现有的计算字符串相似度的方法按照计算所依据的特征的不同,可以划分为三种方法:基于字面相似的方法、基于统计关联的方法、基于语义相似的方法。三种方法各有优缺点,还有人提出了综合考虑三种方法的多层特征方法[2]。其中,基于字面相似的计算方法主要有基于编辑距离的计算方法 [3]和基于相同字或词的方法 [4]。字符串序列相似度计算在异构数据库操作、音乐乐谱分析、基因序列分析[1],信息检索等方面有较好的应用。

本文通过定义的字符串相似度的衡量指标,利用匹配矩阵对字符串的相似度进行计算。对于长度不相等的字符串,通过插入空格的方法使字符串的长度相等,根据设计的算法确定空格的位置,使相似度的值达到最大,可以使模糊检索的信息更有意义。

2 计算字符串相似度的算法

2.1构造字符串相似程度的指标

给定两个长度相等的任意字符串Str1=“abcddacbcb”和Str2=“aadaccbddc”,对两个字符串在任意的位置比对:  (字符中间没有空格)。字符串的长度记为n(这里n=10),相同字母(d、a、c)的个数记为m(这里m=3),两字符串重叠的个数记为r(这里r=8)。根据上面给出的数据,我们给出下面的定义:

     定义1重叠率  两个长度相等的(包括在长度的短的字符串中加入空格,使其长度相等的情况)字符串在字符串移动匹配的过程中,重叠字符串的个数与字符串的长度的比率,即 。

     定义2 匹配率  两个长度相等的(包括在长度的短的字符串中加入空格,使其长度相等的情况)字符串在字符串移动匹配的过程中,对应位置字符相同的个数与字符串长度的比率,即 。

     定义3 相似度  匹配率的平方与重叠率的乘积,即 。

这样定义相似度的目的是为了在匹配率相同的情况下,利用重叠率衡量相似度,同时减小重叠率对相似度的影响,因为相似度是应该依赖于匹配率的。

2.2算法设计与分析

2.2.1算法原理

  鉴于以上相似度指标Q的定义,我们只要考虑如何使匹配率最大,这样就可以得到最大的相似度。

如 ,我们保持上面的字符串不动,把下面的字符串自左向右移动,每到一个位置时计算Q值,然后取Q的最大值。Str1的长度记为n1,Str2的长度记为n2,当Str2的尾字母和Str1的首字母对齐的情况下计算相似度指标为Q1,Str2右移一位计算的相似度指标为Q2,当Str2的首字母和Str1的尾字母对齐的情况下计算相似度指标为Qm(m=n2+n1-1),然后计算最大相似度Qmax=max{Q1、Q2、......、Qm}。

2.2.2算法实现

下面我们用两个字符串实现具体的算法。字符串S1的长度为n1,字符串S2的长度为n2,设n1>n2,记S=n1-n2;具体的令S1=“abcddacbcbdadcabbdca”,S2=“aadaccbddcabacd”,则n1=20,n2=15,S=5。下面所用的S1,S2,n1,n2,S都与这里的设置一致。

(1) 如图1所示,我们将两个字符串按如下方式填写: 

 

 

图1       匹 配 图

图中横向(首行)为字符串S1,纵向(首列)为字符串S2,矩阵中元素 (交叉点)为‘1’,表示相匹配,否则为‘0’(图中只表示出非零元素)。矩阵中划了一些斜线,斜线所经过的单元格表示S1与S2相匹配的位置和匹配的情况。第一条斜线必须覆盖字符串S2与S1的前n2个字母匹配的情况,依次下去,一共有S+1条斜线。下面的图2,图3表示的是第一条斜线与第二条斜线的表示的情况,其余的斜线表示的情况依次类推。

 

         图2 第一条斜线表示的情况                      图3 第二条斜线表示的情况

拿第二条斜线说明一下:如图3表示S2的首字母和S1的第二个对齐。该斜线经过的单元格有四个元素不为零,说明有四个元素匹配,即是有底线的字母。斜线的间距(相邻的两条斜线的距离为1)表示字符串滑动的距离,也表示在两个字符串均不动的情况下,在字符串S2中加入空格所能影响到的距离。如第一条斜线和第二条斜线:从上面图2,图3中可以看出在S2中加入一个空格,在移动匹配中只能到第二条斜线所能表示的情况,依次类推。因此,在S2中加入的空格数所能达到的最远匹配可以用斜线的条数来表示。在S2中加入S个空格,可以在当前匹配的斜线后再划S条斜线。

(2)我们的目的是为了在加入空格后达到最大的匹配率,因此可以在n1 -n2+1条斜线中找到一条含非零值最多的路径,但要遵循一个原则:路径的查找必须遵循自左向右的原则,因为每移动一条斜线相当于插入一个空格,插入空格以后不能向回匹配只能向后匹配。现在我们要解决的问题就是在S+1条斜线中按照自左向右、自上向下的原则找一条含非零值最多的路径。

如图1所示,我们以S1和S2为例说明一下具体过程,这里字符串S1有20个字符,字符串S2有15个字符,斜线的条数等于20-15+1=6。这里我们将斜线覆盖的范围为转化为矩阵的形式,我们把他写成矩阵R1。矩阵R1的第一行代表左边第一条斜线,依次类推。矩阵元素表示斜线经过的单元格中的数值,也就是字符是否匹配。按照上面的原则:自左而右、自上而下,找到一条含‘1’最多的路径。为方便其见,我们把‘1’换成该行的行号。写成矩阵R2。

 

 

 

  (3)我们现在就需要找到一条含非零值最多的路径。

  我们定义非零值的个数为信息量,记为In。算法准则:因为遵从自左而右、自上而下的原则,所以第i行可以包含第i+1行的信息量,也就是说从第i行和第i+1行选取部分元素可以使第i行达到这两行的最大信息量。

我们从矩阵R2倒数第二行反向递推到第一行,那么第一行就含有下面所有行的最大信息量,也就是找到了最优路径。下面就上面的矩阵R2进行处理,用穷举法两两寻找最优划分(选取第i行左面元素和第i+1行右面的元素达到信息量最大)。

下面就以字符串S1和S2为例寻找信息量最大的路径。

a、先在倒数第二行取一个元素,再在倒数第一行取n2-1个元素(有底线的为所取的数值) ,计算信息量为3;

  b、在倒数第二行取两个元素,再在倒数第一行取n2-2个元素 ,

计算信息量为4;

  c、依次穷举计算,得到信息量最大的划分:  ,信息量为7; 

  d、将取得的倒数第二行元素和倒数第三行,重复步骤a、b、c,直到第一行为止。得到所有的划分结果为图4:

 

 

                         图4 划分图             图5 改进的划分图

  e、将划分的右上角元素置零,将右下角元素替代右上角元素,保留左上角元素。比如步骤c的划分变为: ,则整个划分变为图5。

f、在数值增大的地方加入空格,空格的个数为前后变化的数值的差值,(元素零除外)。S2插入空格如图6所示。 

 

           图6 相似度最大匹配图

  g、计算匹配率为(12/20)2,重叠率为1,则Q15=0.38。

  如果插入的空格少于n1-n2,可以依据重叠率较大的情况在字符前或字符后插入。

同样可以计算Q1、Q2………Qm,在其中找到最大值。

2.2.3 算法步骤

这里我们假设字符串s1的长度大于s2的长度,即n1>n2,记S=n1-n2。

第一步:将字符串s1的字符依次写成一行,将字符串s2的字符依次写成一列,然后依次比对,字符相同的就记为1,不同的就记为0,生成矩阵R,矩阵元素R[i,j]表示s2的第i个元素与s1的第j个元素是否相同;

第二步:生成矩阵R1,R1的行数等于S+1,列数等于n2,R1[i,j]=R[j,j+i-1];

第三步:将矩阵R1的非零元素换成所在行的数字,生成矩阵R2。

第四步: 从矩阵R2倒数第二行反向递推到第一行,那么第一行就含有下面所有行的最大信息量,也就是找到了最优路径。下面就上面的矩阵R2进行处理,用穷举法两两寻找最优划分(选取第i行左面元素和第i+1行右面的元素达到信息量最大)。

a、先在R2的倒数第二行取一个元素,再在倒数第一行取n2-1个元素,计算这n2个元素的信息量;

b、在倒数第二行取两个元素,再在倒数第一行取n2-2个元素,同样计算这n2个元素的信息量;

c、依次穷举计算,得到信息量最大的划分;

d、对倒数第二行元素和倒数第三行,重复步骤a、b、c,直到第一行为止;

e 、将划分的右上角元素置零,将右下角元素替代右上角元素,保留左上角元素;

f、取得整个划分,在数值增大的地方加入空格,空格的个数为前后变化的数值的差值,(元素零除外)。

2.2.4算法性能分析

     下面按照一般的算法分析对此算法进行分析[5]。

(1)构造匹配矩阵为:n1*n2

(2)进行移动匹配的次数为: n1+n2-1

(3)构造寻优路径矩阵:(n1-n2+1)*n1

(4)寻找最优路径计算Q:n1*(n1-n2)

(5)寻找最大的Q值。

算法的空间效率为:n1*n2+(n1-n2+1)*n1+2*n1+n2-2

算法的计算次数为:(n1+n2-1)*n1*(n1-n2)

  算法的计算次数比穷举法 的次数减少了很多,像文中的例子,利用穷举法是O( ),当然如果 再增大的话,会更大,因为穷举法的次数是O( )。本文中的算法的计算次数是O( )。特别的,当 时,就不必进行这样的计算,只需要进行移动匹配就可以了。 

3 结论

    文中用两个字符串滑动比较时匹配的字符数和两字符串滑动比较的重叠率定义了相似度的衡量指标,在确定一个字符串较另一个字符串较少的情况下,设计了一种算法,实现了在字符串匹配矩阵中确定插入空格的位置使相似度指标达到最大值,算法的计算次数明显的减少了,可以使模糊信息检索高效有意义。

参考文献

[1]孙啸,陆祖宏,谢建明.生物信息学基础[M].清华大学出版社,2005.

[2]章成志.基于多层特征的字符串相似度计算模型[J].情报学报2005 ,24(6):696-701.

[3] Monge AE , Elkan CP. The field2matching problem: algorithm and applications. In : Proceedings of the Second Internet Conference on Knowledge Discovery and Data Mining ,Oregon , Portland , 1996 , 8:267~270.

[4] Nirenburg S ,Domashnev C ,Grannes DJ. Two approaches to matching in example-based machine translation[J]. In :Proceedings of TMI293 , Kyoto , Japan , 1993, 7:47~57.

[5] Anany Levitin,(译者)潘彦.《算法设计与分析基础》[M].清华大学出版社,2004.

[6]陈鑫,常致全.智能化搜索引擎原理及实现[J] .计算机应用2003 ,vol23:191-193.

 

 

 

 

分享到:
评论

相关推荐

    字符串相似度算法 字符串相似度算法 字符串相似度算法

    字符串相似度算法 字符串相似度算法是一种衡量两个字符串之间相似度的方法,广泛应用于自然语言处理、数据挖掘、机器学习等领域。在本文中,我们将讨论一种常用的字符串相似度算法:Levenshtein Distance。 什么是...

    LD的两字符串相似度计算.zip

    使用Levenshtein Distance计算字符串相似度有以下几点需要注意: 1. **效率优化**:虽然基本的动态规划算法的时间复杂度是O(n*m),其中n和m分别是两个字符串的长度,但在实际应用中,可以采用空间优化技巧,如Wagner...

    java字符串相似度算法

    Java字符串相似度算法是用于衡量两个字符串之间相似程度的一种计算方法。在文本处理、信息检索、数据清洗等领域中,这种算法具有重要的应用价值。这里主要介绍了一种基于Levenshtein距离的Java实现。 Levenshtein...

    字符串相似度算法 levenshtein distance 编辑距离算法

    **字符串相似度算法——Levenshtein Distance(编辑距离)** 在信息技术和计算机科学领域,字符串相似度计算是一个重要的概念,特别是在文本处理、搜索引擎优化、数据校验和生物信息学等多个场景中。Levenshtein ...

    使用最短编辑距离算法判断两个字符串的相似度

    总之,最短编辑距离算法是计算字符串相似度的一种基础且重要的方法,它在文本处理领域有着广泛的应用。理解和掌握这一算法,对于开发相关的软件功能,如自动纠错、搜索引擎优化等,都是非常有益的。

    编辑长求字符串相似度Delphi源代码

    首先,我们需要了解几种常见的字符串相似度算法: 1. **Levenshtein距离**:这个算法衡量的是通过插入、删除或替换操作将一个字符串转换成另一个字符串所需的最少步骤数。在Delphi中,你可以创建一个动态数组来存储...

    图像的相似度Hash算法(aHash的delphi实现).rar

    在Delphi中,可以使用`IntToHex`函数将二进制矩阵转换为16进制字符串。 5. **相似度比较**:比较两个aHash值的差异,通常通过汉明距离(Hamming Distance)来衡量。汉明距离是两个字符串对应位置不同字符的数量,...

    字符串的相似度 编辑距离 java实现

    字符串相似度计算之编辑距离 编辑距离(Edit Distance)是计算两个字符串之间的相似度的算法,它定义了从原串(s)转换到目标串(t)所需要的最少的插入、删除和替换的数目。在自然语言处理(NLP)中应用非常广泛,...

    C#实现的字符串相似度对比类

    总结来说,这个C#字符串相似度对比类提供了一个简洁且高效的Levenshtein距离计算实现,能够方便地集成到任何需要字符串相似度评估的C#项目中。通过理解和应用这个类,开发者可以轻松地比较和分析字符串之间的相似性...

    易语言文本相似度判断模块源码

    综上所述,易语言文本相似度判断模块涉及到了多个层次的编程技术,包括字符串处理、向量化、相似度计算算法以及模块化编程思想。通过学习和实践这个模块,开发者能够掌握文本相似度判断的关键步骤,并在实际项目中...

    编辑距离 字符串的相似度

    编辑距离(Edit Distance)是一种衡量两个字符串相似度的数学概念,它定义了将一个字符串转换成另一个字符串所需的最少单字符操作次数,包括插入、删除和替换。这些操作在自然语言处理(NLP)中有着广泛的应用,比如...

    计算两字符串的编辑距离

    编辑距离,又称Levenshtein距离,是一种衡量两个字符串相似度的指标,广泛应用于文本处理、数据校验、搜索引擎优化等多个领域。这个概念源于俄国科学家瓦迪姆·列文斯坦在1965年提出,它定义了将一个字符串转换成另...

    弦相似算法计算 短文本相似度

    假设有字符串A和B,编辑距离可以通过动态规划来计算。构建一个二维矩阵,行和列分别对应A和B的字符位置,矩阵中的每个元素表示对应位置字符达到匹配所需的编辑距离。初始化边界值后,通过比较相邻字符是否相同,...

    FSV算法用于相似度分析Matlab算法

    FSV算法的核心是通过构建字符串向量空间模型,将每个字符串映射为一个向量,然后计算这些向量之间的距离或相似度来评估序列的相似程度。通常,这种映射基于字符出现的频率或位置信息。具体步骤如下: 1. **向量表示...

    Java实现的计算稀疏矩阵余弦相似度示例

    在本示例中,我们使用HashMap来存储稀疏矩阵的数据,并使用算法来计算稀疏矩阵的余弦相似度。 本文介绍了Java实现的计算稀疏矩阵余弦相似度示例,涉及Java基于HashMap的数值计算相关操作技巧。我们可以使用HashMap...

    levenshtein相似度算法

    **Levenshtein相似度算法**,又称为编辑距离算法,是计算机科学中用于衡量两个字符串之间差异的一种经典方法。该算法由俄国科学家Vladimir Levenshtein在1965年提出,因此得名。它通过计算将一个字符串转换成另一个...

    编辑距离问题 对于给定的字符串A和字符串B,编程计算其编辑距离d(A,B)。

    ### 编辑距离问题 #### 一、问题背景与定义 ...综上所述,编辑距离问题是一个经典的字符串相似度计算问题,通过对字符串进行基本的操作可以有效地计算出两个字符串之间的差异程度,具有重要的理论意义和应用价值。

Global site tag (gtag.js) - Google Analytics