首页 > 编程 > C# > 正文

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

2019-10-29 21:41:47
字体:
来源:转载
供稿:网友

这篇文章主要介绍了C#实现的字符串相似度对比类,本文直接给出类实现代码,代码中包含详细注释,需要的朋友可以参考下

本类适用于比较2个字符的相似度,代码如下:

 

 
  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Text; 
  4.  
  5. public class StringCompute 
  6. #region 私有变量 
  7. /// <summary> 
  8. /// 字符串1 
  9. /// </summary> 
  10. private char[] _ArrChar1; 
  11. /// <summary> 
  12. /// 字符串2 
  13. /// </summary> 
  14. private char[] _ArrChar2; 
  15. /// <summary> 
  16. /// 统计结果 
  17. /// </summary> 
  18. private Result _Result; 
  19. /// <summary> 
  20. /// 开始时间 
  21. /// </summary> 
  22. private DateTime _BeginTime; 
  23. /// <summary> 
  24. /// 结束时间 
  25. /// </summary> 
  26. private DateTime _EndTime; 
  27. /// <summary> 
  28. /// 计算次数 
  29. /// </summary> 
  30. private int _ComputeTimes; 
  31. /// <summary> 
  32. /// 算法矩阵 
  33. /// </summary> 
  34. private int[,] _Matrix; 
  35. /// <summary> 
  36. /// 矩阵列数 
  37. /// </summary> 
  38. private int _Column; 
  39. /// <summary> 
  40. /// 矩阵行数 
  41. /// </summary> 
  42. private int _Row; 
  43. #endregion 
  44. #region 属性 
  45. public Result ComputeResult 
  46. get { return _Result; } 
  47. #endregion 
  48. #region 构造函数 
  49. public StringCompute(string str1, string str2) 
  50. this.StringComputeInit(str1, str2); 
  51. public StringCompute() 
  52. #endregion 
  53. #region 算法实现 
  54. /// <summary> 
  55. /// 初始化算法基本信息 
  56. /// </summary> 
  57. /// <param name="str1">字符串1</param> 
  58. /// <param name="str2">字符串2</param> 
  59. private void StringComputeInit(string str1, string str2) 
  60. _ArrChar1 = str1.ToCharArray(); 
  61. _ArrChar2 = str2.ToCharArray(); 
  62. _Result = new Result(); 
  63. _ComputeTimes = 0; 
  64. _Row = _ArrChar1.Length + 1; 
  65. _Column = _ArrChar2.Length + 1; 
  66. _Matrix = new int[_Row, _Column]; 
  67. /// <summary> 
  68. /// 计算相似度 
  69. /// </summary> 
  70. public void Compute() 
  71. //开始时间 
  72. _BeginTime = DateTime.Now; 
  73. //初始化矩阵的第一行和第一列 
  74. this.InitMatrix(); 
  75. int intCost = 0; 
  76. for (int i = 1; i < _Row; i++) 
  77. for (int j = 1; j < _Column; j++) 
  78. if (_ArrChar1[i - 1] == _ArrChar2[j - 1]) 
  79. intCost = 0; 
  80. else 
  81. intCost = 1; 
  82. //关键步骤,计算当前位置值为左边+1、上面+1、左上角+intCost中的最小值  
  83. //循环遍历到最后_Matrix[_Row - 1, _Column - 1]即为两个字符串的距离 
  84. _Matrix[i, j] = this.Minimum(_Matrix[i - 1, j] + 1, _Matrix[i, j - 1] + 1, _Matrix[i - 1, j - 1] + intCost); 
  85. _ComputeTimes++; 
  86. //结束时间 
  87. _EndTime = DateTime.Now; 
  88. //相似率 移动次数小于最长的字符串长度的20%算同一题 
  89. int intLength = _Row > _Column ? _Row : _Column; 
  90.  
  91. _Result.Rate = (1 - (decimal)_Matrix[_Row - 1, _Column - 1] / intLength); 
  92. _Result.UseTime = (_EndTime - _BeginTime).ToString(); 
  93. _Result.ComputeTimes = _ComputeTimes.ToString(); 
  94. _Result.Difference = _Matrix[_Row - 1, _Column - 1]; 
  95.  
  96.  
  97. /// <summary> 
  98. /// 计算相似度(不记录比较时间) 
  99. /// </summary> 
  100. public void SpeedyCompute() 
  101. //开始时间 
  102. //_BeginTime = DateTime.Now; 
  103. //初始化矩阵的第一行和第一列 
  104. this.InitMatrix(); 
  105. int intCost = 0; 
  106. for (int i = 1; i < _Row; i++) 
  107. for (int j = 1; j < _Column; j++) 
  108. if (_ArrChar1[i - 1] == _ArrChar2[j - 1]) 
  109. intCost = 0; 
  110. else 
  111. intCost = 1; 
  112. //关键步骤,计算当前位置值为左边+1、上面+1、左上角+intCost中的最小值  
  113. //循环遍历到最后_Matrix[_Row - 1, _Column - 1]即为两个字符串的距离 
  114. _Matrix[i, j] = this.Minimum(_Matrix[i - 1, j] + 1, _Matrix[i, j - 1] + 1, _Matrix[i - 1, j - 1] + intCost); 
  115. _ComputeTimes++; 
  116. //结束时间 
  117. //_EndTime = DateTime.Now; 
  118. //相似率 移动次数小于最长的字符串长度的20%算同一题 
  119. int intLength = _Row > _Column ? _Row : _Column; 
  120.  
  121. _Result.Rate = (1 - (decimal)_Matrix[_Row - 1, _Column - 1] / intLength); 
  122. // _Result.UseTime = (_EndTime - _BeginTime).ToString(); 
  123. _Result.ComputeTimes = _ComputeTimes.ToString(); 
  124. _Result.Difference = _Matrix[_Row - 1, _Column - 1]; 
  125. /// <summary> 
  126. /// 计算相似度 
  127. /// </summary> 
  128. /// <param name="str1">字符串1</param> 
  129. /// <param name="str2">字符串2</param> 
  130. public void Compute(string str1, string str2) 
  131. this.StringComputeInit(str1, str2); 
  132. this.Compute(); 
  133.  
  134. /// <summary> 
  135. /// 计算相似度 
  136. /// </summary> 
  137. /// <param name="str1">字符串1</param> 
  138. /// <param name="str2">字符串2</param> 
  139. public void SpeedyCompute(string str1, string str2) 
  140. this.StringComputeInit(str1, str2); 
  141. this.SpeedyCompute(); 
  142. /// <summary> 
  143. /// 初始化矩阵的第一行和第一列 
  144. /// </summary> 
  145. private void InitMatrix() 
  146. for (int i = 0; i < _Column; i++) 
  147. _Matrix[0, i] = i; 
  148. for (int i = 0; i < _Row; i++) 
  149. _Matrix[i, 0] = i; 
  150. /// <summary> 
  151. /// 取三个数中的最小值 
  152. /// </summary> 
  153. /// <param name="First"></param> 
  154. /// <param name="Second"></param> 
  155. /// <param name="Third"></param> 
  156. /// <returns></returns> 
  157. private int Minimum(int First, int Second, int Third) 
  158. int intMin = First; 
  159. if (Second < intMin) 
  160. intMin = Second; 
  161. if (Third < intMin) 
  162. intMin = Third; 
  163. return intMin; 
  164. #endregion 
  165. /// <summary> 
  166. /// 计算结果 
  167. /// </summary> 
  168. public struct Result 
  169. /// <summary> 
  170. /// 相似度 
  171. /// </summary> 
  172. public decimal Rate; 
  173. /// <summary> 
  174. /// 对比次数 
  175. /// </summary> 
  176. public string ComputeTimes; 
  177. /// <summary> 
  178. /// 使用时间 
  179. /// </summary> 
  180. public string UseTime; 
  181. /// <summary> 
  182. /// 差异 
  183. /// </summary> 
  184. public int Difference; 

调用方法:

 

 
  1. // 方式一 
  2. StringCompute stringcompute1 = new StringCompute(); 
  3. stringcompute1.SpeedyCompute("对比字符一""对比字符二"); // 计算相似度, 不记录比较时间 
  4. decimal rate = stringcompute1.ComputeResult.Rate; // 相似度百分之几,完全匹配相似度为1 
  5.  
  6. // 方式二 
  7. StringCompute stringcompute2 = new StringCompute(); 
  8. stringcompute2.Compute(); // 计算相似度, 记录比较时间 
  9. string usetime = stringcompute2.ComputeResult.UseTime; // 对比使用时间 

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表