计算两个字符串的相似度

第1种:相似度计算公式 相似度=Kq*q/(Kq*q+Kr*r+Ks*s) (Kq > 0 , Kr>=0,Ka>=0) 

q 是字符串1和字符串2中都存在的单词的总数

s 是字符串1 比 q 多的单词总数

r 是字符串2 比 q 多的单词总数

Kq,Kr和ka 分别是q,r,s的权重(非常重要)

根据实际的计算情况,我们设Kq=2,Kr=Ks=1

 

        /// <summary>
        /// 获取两个字符串的相似度
        /// </summary>
        /// <param name=”str1”>第一个字符串</param>
        /// <param name=”str2”>第二个字符串</param>
        /// <returns></returns>
        static decimal GetSimilarityWith(string str1, string str2)
        {

            decimal Kq = 2;
            decimal Kr = 1;
            decimal Ks = 1;

            char[] ss = str1.ToCharArray();
            char[] st = str2.ToCharArray();

            //获取交集数量
            int q = ss.Intersect(st).Count();
            int s = ss.Length - q;
            int r = st.Length - q;

            return Kq * q / (Kq * q + Kr * r + Ks * s);
        }

例如:

string str1="第十一届成像技术及其在原子分子物理中的应用学术研讨会";

string str2=str1;

var r= GetSimilarityWith(str1,str2);

 Console.WriteLine(r); //输出如下

 

 说明:即使肉眼看起一样,但是也会因为权重的设置比例问题,不会输出到 1,也就是说不会有100%相似度。

原文地址:C#计算两个字符串的相似度 - 建站教程 (jiuaidu.com)

 

第二种:莱文斯坦距离算法

        static double ComputeTextSame(string str1, string str2) // 计算文本相似度函数(适用于短文本)
        {
            int textSameLength = 0;

            double maxLength = Math.Max(str1.Length, str2.Length);
            if (maxLength <= 0)
            {
                return 1.0;
            }

            try
            {
                int m = str1.Length;
                int n = str2.Length;
                int[,] d = new int[m + 1, n + 1];
                for (int i = 0; i <= m; i++)
                    d[i, 0] = i;
                for (int i = 0; i <= n; i++)
                    d[0, i] = i;
                for (int i = 1; i <= m; i++)
                {
                    for (int j = 1; j <= n; j++)
                    {
                        d[i, j] = d[i - 1, j - 1] + (str1[i - 1] == str2[j - 1] ? 0 : 1);
                        //修改一个字符
                        d[i, j] = Math.Min(d[i, j], d[i - 1, j] + 1);
                        // 插入一个字符串 
                        d[i, j] = Math.Min(d[i, j], d[i, j - 1] + 1);
                        //删除一个字符 
                    }
                }
                textSameLength = d[m, n];
            }
            catch //出错返回一个很大值
            {
                textSameLength = 10000;
            }

            return (maxLength - textSameLength) / maxLength;          
        }

例如:

string str1="第十一届成像技术及其在原子分子物理中的应用学术研讨会";

string str2=str1;

var r= ComputeTextSame(str1,str2);

 Console.WriteLine(r); //输出如下

 

 原文地址:C#计算字符串相似性的方法 - phpStudy (xp.cn)

 

posted @ 2023-03-06 11:22  H辉  阅读(727)  评论(0编辑  收藏  举报