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

  在“文本比较算法Ⅰ——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))这两个并不完全相等。

 

  

 

 

    

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python中,有多种用于计算文本相似度算法。其中一种较为常见的算法是simhash算法。simhash算法由Google用于处理海量文本去重。 simhash算法将一个文档转换成一个64位的特征字节,然后通过计算文档特征字之间的汉明距离来判断文档是否重复。一般来说,当两个文档特征字之间的汉明距离小于3时,可以判定两个文档相似。 在Python中,可以使用第三方库simhash来实现simhash算法。可以通过计算两个文本的simhash值,然后计算它们的汉明距离来判断它们的相似度。 下面是一个用Python实现simhash算法计算文本相似度的示例代码: ```python from simhash import Simhash def simhash_demo(text_a, text_b): """ 求两文本相似度 :param text_a: :param text_b: :return: """ a_simhash = Simhash(text_a) b_simhash = Simhash(text_b) max_hashbit = max(len(bin(a_simhash.value)), len(bin(b_simhash.value))) # 汉明距离 distince = a_simhash.distance(b_simhash) similar = 1 - distince / max_hashbit return similar if __name__ == '__main__': text1 = "傲游AI专注于游戏领域,多年的AI技术积淀,一站式提供文本、图片、音/视频内容审核,游戏AI以及数据平台服务" text2 = "傲游AI专注于游戏领域,多年的AI技术积淀,二站式提供文本、图片、音 视频内容审核,游戏AI以及数据平台服务" text3 = '"傲游AI专注于游戏领域,多年的AI技术积淀,三站式提供文本、图片、音视频内容审核,游戏AI以及数据平台服务"' similar = simhash_demo(text1, text2) similar2 = simhash_demo(text1, text3) similar3 = simhash_demo(text2, text3) print(similar) print(similar2) print(similar3) ``` 以上代码中,通过计算两个文本的simhash值并计算它们的汉明距离,最后得到它们的相似度。可以根据实际需求进行相似度的判断和进一步处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [文本相似度计算——Simhash算法(python实现)](https://blog.csdn.net/Trisyp/article/details/113623966)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值