LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C#利用莱文史特距离算法计算字符串相似性的方法

admin
2023年3月22日 18:25 本文热度 569

这篇文章主要介绍了C#计算字符串相似性的方法,实例分析了C#计算字符串相似性的原理与算法实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了C#计算字符串相似性的方法。分享给大家供大家参考。具体如下:

计算字符串相似性的办法很多,甚至最笨的办法可以挨个匹配,这里要讲的是使用莱文史特距离来计算字符串相似性。

莱文史特距离概念:假设函数名是LD

用于计算两个字符串之间的相似度。 譬如有两个字符串A和B。假设以A为基准,那么该算法就是计算把B通过(替换、删除、加字符)等方法变成A需要多少步。

例如:

A=”abcd”, B=”abc”, 那么 LD(A,B)=1,只需在B字符串中插入一个字符那么就完全等于A

A=”abcd”, B=”abcd”, 那么 LD(A,B)= ,因为这两个货完全相同

A=”abcd”, B=”abdc”, 那么 LD(A,B)= 1,因为只需把B中”dc”互换位置就等于A了。

A=”fwegwegweg@#2″, B=”ddd*&&%^&”, 那么 LD(A,B)= ????,这个叔真不知道了,要用程序算了。

莱文史特距离计算出来的值越大代表步骤越多,说明两个字符串的相似程度越低。

譬如大家要做个简易的“文章抄袭”判定功能,那么用这个莱文史特距离完全可以实现个初步方法。

算法注释:

1、假设字符串str1的长度为 n,str2 的长度为 m。

如果 n = 0,则返回 m并退出;(这是句废话)

2、如果 m=0,则返回 n 并退出。(这依然是句废话)

3、如果上述都不是则要开始进行计算,

构建一个数组 d[0..m, 0..n]。

将第0行初始化为 0..n,第0列初始化为0..m。

依次检查 str1 的每个字母(i=1..n)。

依次检查 str2 的每个字母(j=1..m)。

如果 str1[i]=str2[j],则 sign=0;(sign仅仅是个标记,没有任何意思,为了记录相等还是不相等)

如果 str1[i]!=str12[j],则 sign=1。

将 d[i,j] 设置为以下三个值中的最小值:

紧邻当前格上方的格的值加一,即 d[i-1,j]+1

紧邻当前格左方的格的值加一,即 d[i,j-1]+1

当前格左上方的格的值加sign,即 d[i-1,j-1]+sign

重复上述几步直到循环结束。d[n,m]既为最终的值

接下来是用c#写的一款莱文史特距离的实现。

  1. public class LDMaker//搞成一个类看起来专业, 

  2. //实际上就是脱裤子放屁,这里使用来文史特距离算法 

  3. //用于计算字符串之间的相似性 

  4. char[] str1; 

  5. char[] str2; 

  6. public LDMaker(string s1, string s2) 

  7. //替换掉 所有 数字 为固定数字 数字干扰 太严重 

  8. //这里因人而异,在中文文章的匹配中,数字是干扰很严重 

  9. //的,所以我在某些应用中把数字替换掉了。 

  10. //原因是有的文章之间实际上相似性很高,但是故意在里面加一些数字 

  11. //干扰该函数的执行,让机器看出来两篇文章很不同。一般不需要做如下 

  12. // 步骤 

  13. s1=System.Text.RegularExpressions.Regex.Replace(s1,@"(/d+)","1"); 

  14. s2 = System.Text.RegularExpressions.Regex.Replace(s2, @"(/d+)""1"); 

  15. str1 = s1.ToCharArray(); 

  16. str2 = s2.ToCharArray(); 

  17. public int GetLD()//这是莱文史特距离的算法实现 

  18. try 

  19. int m=str1.Length; 

  20. int n=str2.Length; 

  21. int[,] d = new int[m+1, n+1]; 

  22. for (int i = 0; i <= m ; i++) 

  23. d[i, 0] = i; 

  24. for (int i = 0; i <= n ; i++) 

  25. d[0, i] = i; 

  26. for (int i = 1; i <= m; i++) 

  27. for (int j = 1; j <= n; j++) 

  28. d[i,j] = d[i - 1,j - 1] + (str1[i - 1] == str2[j - 1] ? 0 : 1); 

  29. //修改一个字符 

  30. d[i,j] = Math.Min(d[i,j], d[i - 1,j] + 1); 

  31. // 插入一个字符串  

  32. d[i,j] = Math.Min(d[i,j], d[i,j - 1] + 1);  

  33. //删除一个字符  

  34. }  

  35. }  

  36. return d[m, n]; 

  37. catch(//出错返回一个很大值 

  38. {  

  39. return 10000; 

  40. }  

希望本文所述对大家的C#程序设计有所帮助。


该文章在 2023/3/22 18:26:05 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved