文本比较算法Ⅲ——计算文本的相似度

  在“文本比较算法Ⅰ——LD算法”中,介绍了编辑距离的计算。

  在“文本比较算法Ⅱ——Needleman/Wunsch算法”中,介绍了最长公共子串的计算。

  在给定的字符串A和字符串B,LD(A,B)表示编辑距离,LCS(A,B)表示最长公共子串的长度。

  如何来度量它们之间的相似度呢?

  不妨设S(A,B)来表示字符串A和字符串B的相似度。那么,比较合理的相似度应该满足下列性质。

  性质一:0≤S(A,B)≤100%,0表示完全不相似,100%表示完全相等

  性质二:S(A,B)=S(B,A)

  目前,网上介绍的各种相似度的计算,都有各自的不尽合理的地方。

  计算公式一:S(A,B)=1/(LD(A,B)+1)

    能完美的满足性质二。

    当LD(A,B)=0时,S(A,B)=100%,不过无论LD(A,B)取任何值,S(A,B)>0,不能满足性质一。

 

  计算公式二:S(A,B)=1-LD(A,B)/Len(A)

    当Len(B)>Len(A)时,S(A,B)<0。不满足性质一。

    有人会说,当S(A,B)<0时,强制指定S(A,B)=0就解决问题了。

    问题是,S(A,B)=1-LD(A,B)/Len(A),而S(B,A)=1-LD(B,A)/Len(B)。当Len(A)≠Len(B)时,S(A,B)≠S(B,A)。不满足性质二

    还有一个例子可以说明问题

    A="BC",B="CD",C="EF"

    S(A,B)=1-LD(A,B)/Len(A)=1-2/2=0

    S(A,C)=1-LD(A,C)/Len(A)=1-2/2=0

    A和B的相似度与A和C的相似度是一样的。不过很明显的是B比C更接近A

 

  计算公式三:S(A,B)=LCS(A,B)/Len(A)

    这个公式能完美的满足的性质一

    不过当Len(A)≠Len(B)时,S(A,B)≠S(B,A)。不满足性质二

    用一个例子说明问题

    A="BC",B="BCD",C="BCEF"

    S(A,B)=LCS(A,B)/Len(A)=2/2=100%

    S(A,C)=LCS(A,C)/Len(A)=2/2=100%

    A和B的相似度与A和C的相似度是一样的。不过很明显的是B比C更接近A

 

  上面是网上能找到的三个计算公式,从上面的分析来看都有各自的局限性。

 

  我们看一个例子:

  A=GGATCGA,B=GAATTCAGTTA,LD(A,B)=5,LCS(A,B)=6

  他们的匹配为:

    A:GGA_TC_G__A

    B:GAATTCAGTTA

  可以看出上面蓝色的部分表示的是LCS部分,黑色表示的是LD部分。

  因此,给出一个新的公式

  S(A,B)=LCS(A,B)/(LD(A,B)+LCS(A,B))

  这个公式能解决上述三个公式的种种不足。

  而LD(A,B)+LCS(A,B)表示两个字符串A、B的最佳匹配字串的长度。这个是唯一的。

  还有注意的是LD(A,B)+LCS(A,B)和Max(Len(A),Len(B))这两个并不完全相等。

 

  

 

 

    

时间: 2024-10-26 08:17:42

文本比较算法Ⅲ——计算文本的相似度的相关文章

文本比较算法Ⅴ——回顾贴,对前面几篇文章的回顾与质疑

文本比较算法Ⅰ--LD算法 文本比较算法Ⅱ--Needleman/Wunsch算法 文本比较算法Ⅲ--计算文本的相似度 文本比较算法Ⅳ--Nakatsu算法 在写了本系列的前面几篇文章之后.有些网友质疑文章的正确性.在仔细的推敲之下,这些网友指正的不无道理.下面举一个反例,来质疑前面文章的正确性. 文本:A:481234781:B:4411327431 先按照LD算法,计算LD矩阵     4 4 1 1 3 2 7 4 3 1   0 1 2 3 4 5 6 7 8 9 10 4 1 0 1

关于文本之间相似度比较的代码

问题描述 最近在研究跨语言链接的部分被安排要做一个计算文本之间相似度的任务本人是java小白在网上找参考只说做了一个文本分词的程序请问论坛中的大神是不是不做错文本的分词程序就无法做相似度计算的程序?如果有哪位好心的大神能否给小白一个相似度计算的代码以助于参考??谢谢 解决方案 解决方案二:完全不知道~相似度是什么,百分比,还是就是像那种文本比较器一样的比较差异的感觉如果是百分比好像很难啊,中文这么多意思计算机怎么知道同一个词放在不同语境里面意思是不是相同

文本比较算法Ⅵ——用线性空间计算最大公共子序列(翻译贴)

研究文本比较算法有一段时间了.近日研读了<A Linear Space Algorithm for Computing Maximal Common Subsequences>(D.S.Hirschberg著).文章写于1975年.很多其他的论文都会引用这篇论文,可见这篇论文的质量.同时,该文作者D.S.Hirschberg也写了很多有关LCS的文章,也都是经典中的经典. 在研读这篇文章之后,我将它翻译成中文.由于本人的英语与文法都还不行,故翻译的质量也就一般了,也欢迎广大网友指正.   In

通过余弦相似度算法计算用户相似度时具体怎么做

问题描述 通过余弦相似度算法计算用户相似度时具体怎么做 按用户购买的物品,具体怎么样计算...................... 解决方案 http://blog.csdn.net/cscmaker/article/details/7990600

文本比较算法Ⅰ——LD算法

在日常应用中,文本比较是一个比较常见的问题.文本比较算法也是一个老生常谈的话题. 文本比较的核心就是比较两个给定的文本(可以是字节流等)之间的差异.目前,主流的比较文本之间的差异主要有两大类.一类是基于编辑距离(Edit Distance)的,例如LD算法.一类是基于最长公共子串的(Longest Common Subsequence),例如Needleman/Wunsch算法等. LD算法(Levenshtein Distance)又成为编辑距离算法(Edit Distance).他是以字符串

文本比较算法Ⅷ——再议Nakatsu算法

研究文本比较算法已经一段时间了.把思路重新理了理. 在"文本比较算法Ⅳ--Nakatsu算法"中提到"对角线上的数字就是最长公共子序列的下标". 在"文本比较算法Ⅶ--线性空间求最长公共子序列的Nakatsu算法"中提到"每行最左边不为V的数字就是最长公共子序列的下标". 以上两个结论,网友Sumtec都提出了质疑,并提出了反例.经过本人的验算,Sumtec是正确的,我的文章有问题. 不过,不能说Nakatsu算法有问题.在&

对盗图、盗文、盗墓深恶痛绝吗?PostgreSQL结合余弦、线性相关算法 在文本、图片、数组相似 等领域的应用 - 2 smlar插件详解

标签 PostgreSQL , 文本分析 , cosine , smlar , 相似性 , simlar , tf , idf , tf-idf , tag 背景 以2个例子作为开始, 例1 在数据库中有两条这样的记录 "I want a dog" // 狗 "I want a chihuahua" // 吉娃娃狗 然后使用这样的查询条件进行查询 "dog|chihuahua" 很显然,两条记录都会被匹配到,但是哪条记录应该排在前面呢? 例2 在

文本比较算法Ⅱ——Needleman/Wunsch算法

在"文本比较算法Ⅰ--LD算法"中介绍了基于编辑距离的文本比较算法--LD算法. 本文介绍基于最长公共子串的文本比较算法--Needleman/Wunsch算法. 还是以实例说明:字符串A=kitten,字符串B=sitting 那他们的最长公共子串为ittn(注:最长公共子串不需要连续出现,但一定是出现的顺序一致),最长公共子串长度为4. 定义: LCS(A,B)表示字符串A和字符串B的最长公共子串的长度.很显然,LSC(A,B)=0表示两个字符串没有公共部分. Rev(A)表示反转

计算字符串的相似度

在看完<编程之美>一书的"计算字符串的相似度"一文后,对该书最后提出的问题作一点回忆与思考. 这里先将原问题再复述一遍: 原文的问题描述: 许多程序会大量使用字符串.对于不同的字符串,我们希望能够有办法判断其相似程序.我们定义一套操作方法来把两个不相同的字符串变得相同,具体的操作方法为: 1.修改一个字符(如把"a"替换为"b"); 2.增加一个字符(如把"abdd"变为"aebdd"); 3.