C#实现的字符串相似度对比类
本类适用于比较2个字符的相似度,代码如下:
usingSystem; usingSystem.Collections.Generic; usingSystem.Text; publicclassStringCompute { #region私有变量 ///<summary> ///字符串1 ///</summary> privatechar[]_ArrChar1; ///<summary> ///字符串2 ///</summary> privatechar[]_ArrChar2; ///<summary> ///统计结果 ///</summary> privateResult_Result; ///<summary> ///开始时间 ///</summary> privateDateTime_BeginTime; ///<summary> ///结束时间 ///</summary> privateDateTime_EndTime; ///<summary> ///计算次数 ///</summary> privateint_ComputeTimes; ///<summary> ///算法矩阵 ///</summary> privateint[,]_Matrix; ///<summary> ///矩阵列数 ///</summary> privateint_Column; ///<summary> ///矩阵行数 ///</summary> privateint_Row; #endregion #region属性 publicResultComputeResult { get{return_Result;} } #endregion #region构造函数 publicStringCompute(stringstr1,stringstr2) { this.StringComputeInit(str1,str2); } publicStringCompute() { } #endregion #region算法实现 ///<summary> ///初始化算法基本信息 ///</summary> ///<paramname="str1">字符串1</param> ///<paramname="str2">字符串2</param> privatevoidStringComputeInit(stringstr1,stringstr2) { _ArrChar1=str1.ToCharArray(); _ArrChar2=str2.ToCharArray(); _Result=newResult(); _ComputeTimes=0; _Row=_ArrChar1.Length+1; _Column=_ArrChar2.Length+1; _Matrix=newint[_Row,_Column]; } ///<summary> ///计算相似度 ///</summary> publicvoidCompute() { //开始时间 _BeginTime=DateTime.Now; //初始化矩阵的第一行和第一列 this.InitMatrix(); intintCost=0; for(inti=1;i<_Row;i++) { for(intj=1;j<_Column;j++) { if(_ArrChar1[i-1]==_ArrChar2[j-1]) { intCost=0; } else { intCost=1; } //关键步骤,计算当前位置值为左边+1、上面+1、左上角+intCost中的最小值 //循环遍历到最后_Matrix[_Row-1,_Column-1]即为两个字符串的距离 _Matrix[i,j]=this.Minimum(_Matrix[i-1,j]+1,_Matrix[i,j-1]+1,_Matrix[i-1,j-1]+intCost); _ComputeTimes++; } } //结束时间 _EndTime=DateTime.Now; //相似率移动次数小于最长的字符串长度的20%算同一题 intintLength=_Row>_Column?_Row:_Column; _Result.Rate=(1-(decimal)_Matrix[_Row-1,_Column-1]/intLength); _Result.UseTime=(_EndTime-_BeginTime).ToString(); _Result.ComputeTimes=_ComputeTimes.ToString(); _Result.Difference=_Matrix[_Row-1,_Column-1]; } ///<summary> ///计算相似度(不记录比较时间) ///</summary> publicvoidSpeedyCompute() { //开始时间 //_BeginTime=DateTime.Now; //初始化矩阵的第一行和第一列 this.InitMatrix(); intintCost=0; for(inti=1;i<_Row;i++) { for(intj=1;j<_Column;j++) { if(_ArrChar1[i-1]==_ArrChar2[j-1]) { intCost=0; } else { intCost=1; } //关键步骤,计算当前位置值为左边+1、上面+1、左上角+intCost中的最小值 //循环遍历到最后_Matrix[_Row-1,_Column-1]即为两个字符串的距离 _Matrix[i,j]=this.Minimum(_Matrix[i-1,j]+1,_Matrix[i,j-1]+1,_Matrix[i-1,j-1]+intCost); _ComputeTimes++; } } //结束时间 //_EndTime=DateTime.Now; //相似率移动次数小于最长的字符串长度的20%算同一题 intintLength=_Row>_Column?_Row:_Column; _Result.Rate=(1-(decimal)_Matrix[_Row-1,_Column-1]/intLength); //_Result.UseTime=(_EndTime-_BeginTime).ToString(); _Result.ComputeTimes=_ComputeTimes.ToString(); _Result.Difference=_Matrix[_Row-1,_Column-1]; } ///<summary> ///计算相似度 ///</summary> ///<paramname="str1">字符串1</param> ///<paramname="str2">字符串2</param> publicvoidCompute(stringstr1,stringstr2) { this.StringComputeInit(str1,str2); this.Compute(); } ///<summary> ///计算相似度 ///</summary> ///<paramname="str1">字符串1</param> ///<paramname="str2">字符串2</param> publicvoidSpeedyCompute(stringstr1,stringstr2) { this.StringComputeInit(str1,str2); this.SpeedyCompute(); } ///<summary> ///初始化矩阵的第一行和第一列 ///</summary> privatevoidInitMatrix() { for(inti=0;i<_Column;i++) { _Matrix[0,i]=i; } for(inti=0;i<_Row;i++) { _Matrix[i,0]=i; } } ///<summary> ///取三个数中的最小值 ///</summary> ///<paramname="First"></param> ///<paramname="Second"></param> ///<paramname="Third"></param> ///<returns></returns> privateintMinimum(intFirst,intSecond,intThird) { intintMin=First; if(Second<intMin) { intMin=Second; } if(Third<intMin) { intMin=Third; } returnintMin; } #endregion } ///<summary> ///计算结果 ///</summary> publicstructResult { ///<summary> ///相似度 ///</summary> publicdecimalRate; ///<summary> ///对比次数 ///</summary> publicstringComputeTimes; ///<summary> ///使用时间 ///</summary> publicstringUseTime; ///<summary> ///差异 ///</summary> publicintDifference; }
调用方法:
//方式一 StringComputestringcompute1=newStringCompute(); stringcompute1.SpeedyCompute("对比字符一","对比字符二");//计算相似度,不记录比较时间 decimalrate=stringcompute1.ComputeResult.Rate;//相似度百分之几,完全匹配相似度为1 //方式二 StringComputestringcompute2=newStringCompute(); stringcompute2.Compute();//计算相似度,记录比较时间 stringusetime=stringcompute2.ComputeResult.UseTime;//对比使用时间