计算字符串相似度算法—Levenshtein

简介: 什么是LevenshteinLevenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。

什么是Levenshtein

Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。levenshtein() 函数返回两个字符串之间的 Levenshtein 距离。编辑距离的算法是首先由俄国科学家Levenshtein提出的,故又叫Levenshtein Distance

实现过程

首先我们明确从一个字符串变化到另一个字符串需要进行添加、修改、删除来变化

如a变化到ab需要一步,添加一个b,

   aa变化到ab需要修改一个a到b,

   ab变化到a需要删除一个b。

 

首先我们确定了两个字符串str1,str2;假设这两个字符为a1a2a3a4......,b1b2b3......

那么构建一个二维矩阵

        空   a1  a2  a3  a4 ......

空     [1]   [2]   [3]   [4]     [5]......

b1    [6]   [7]   [8]   [9]     [10]......

b2    [11]  [12]  [13] [14]   [15]......

b3    [16] [17]   .......

...     

1.判断[1]左边为空,上面为空,从空到空需要变化0次

2.所以可以得到下面的矩阵

        空   a1  a2  a3  a4 ......

空     0      1      2      3       4......

b1    1      [7]   [8]   [9]     [10]......

b2    2       [12]  [13] [14]   [15]......

b3    3      [17]   .......

 .......

3.到7的位置表示了[空a1]变化到[空b1],这里我们需要得到三个值

    1)从[2]变化到[7]需要的步数是[2]+1

    2)从[6]变化到[7]需要的变化是[6]+1

    3) 从[1]变化到[7]需要的变化是 ,如果a1=b1,那么需要0步,如果a1!=b1,那么需要删除一个a1在添加一个b1,需要2步,也就是大于1步。

我们取这三步中所需走的最短步数填到[7]的位置   。

4.以此推得到

    Amn的值为Am-1n+1,Amn-1+1,Am-1n-1+x(当am=bn时x=0,否则x=2)的最小值

5.当求得的值的最后一位得到的值N,用1-n/(max(len(a),len(b)))得到相关度。 

实现代码 

复制代码
 /// <summary>
        /// Levenshtein 算法实现  
        /// </summary>
        /// <param name="value1"></param>
        /// <param name="values2"></param>
        /// <returns></returns>
        public static float Leven(string value1, string value2)
        { 
            int len1 = value1.Length;
            int len2 = value2.Length;
            int [,] dif =new int[len1+1,len2+1];
            for (int a=0;a<=len1;a++)
            {
                dif[a,0] = a; 
            }
            for (int a = 0; a <= len2; a++)
            {
                dif[0, a] = a; 
            }
            int temp =0;
            for (int i = 1; i <= len1; i++)
            {
                for (int j = 1; j <= len2; j++)
                {
                    if (value1[i - 1] == value2[j - 1])
                    { temp = 0; }
                    else
                    {
                        temp = 1;
                    }
                    dif[i,j] = Min(dif[i - 1,j - 1] + temp, dif[i,j - 1] + 1,
                        dif[i - 1,j] + 1);
                }
            }

            float similarity=1- (float)dif[len1, len2]/Math.Max(len1,len2);
            return similarity;
        }

        public static int Min(int a, int b, int c)
        {
            int i = a < b ? a : b;
            return i = i < c ? i : c;
        }
复制代码

 

目录
打赏
0
0
0
0
52
分享
相关文章
基于Big-Bang-Big-Crunch(BBBC)算法的目标函数最小值计算matlab仿真
该程序基于Big-Bang-Big-Crunch (BBBC)算法,在MATLAB2022A中实现目标函数最小值的计算与仿真。通过模拟宇宙大爆炸和大收缩过程,算法在解空间中搜索最优解。程序初始化随机解集,经过扩张和收缩阶段逐步逼近全局最优解,并记录每次迭代的最佳适应度。最终输出最佳解及其对应的目标函数最小值,并绘制收敛曲线展示优化过程。 核心代码实现了主循环、粒子位置更新、适应度评估及最优解更新等功能。程序运行后无水印,提供清晰的结果展示。
大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户
大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户
116 0
|
6月前
|
两个字符串匹配出最长公共子序列算法
本文介绍了最长公共子序列(LCS)问题的算法实现,通过动态规划方法求解两个字符串的最长公共子序列,并提供了具体的编程实现细节和示例。
154 1
两个字符串匹配出最长公共子序列算法
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
124 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
如何精确计算出一个算法的CPU运行时间?
如何精确计算出一个算法的CPU运行时间?
基于免疫算法的最优物流仓储点选址方案MATLAB仿真
本程序基于免疫算法实现物流仓储点选址优化,并通过MATLAB 2022A仿真展示结果。核心代码包括收敛曲线绘制、最优派送路线规划及可视化。算法模拟生物免疫系统,通过多样性生成、亲和力评价、选择、克隆、变异和抑制机制,高效搜索最优解。解决了物流仓储点选址这一复杂多目标优化问题,显著提升物流效率与服务质量。附完整无水印运行结果图示。
基于免疫算法的最优物流仓储点选址方案MATLAB仿真
基于GA遗传算法的斜拉桥静载试验车辆最优布载matlab仿真
本程序基于遗传算法(GA)实现斜拉桥静载试验车辆最优布载的MATLAB仿真,旨在自动化确定车辆位置以满足加载效率ηq(0.95≤ηq≤1.05)的要求,目标是使ηq尽量接近1,同时减少加载车辆数量和布载耗时。程序通过迭代优化计算车辆位置、方向、类型及占用车道等参数,并展示适应度值收敛过程。测试版本为MATLAB2022A,包含核心代码与运行结果展示。优化模型综合考虑车辆总重量、间距及桥梁允许载荷密度等约束条件,确保布载方案科学合理。
基于GA遗传优化TCN时间卷积神经网络时间序列预测算法matlab仿真
本内容介绍了一种基于遗传算法优化的时间卷积神经网络(TCN)用于时间序列预测的方法。算法运行于 Matlab2022a,完整程序无水印,附带核心代码、中文注释及操作视频。TCN通过因果卷积层与残差连接学习时间序列复杂特征,但其性能依赖超参数设置。遗传算法通过对种群迭代优化,确定最佳超参数组合,提升预测精度。此方法适用于金融、气象等领域,实现更准确可靠的未来趋势预测。
基于LSB最低有效位的音频水印嵌入提取算法FPGA实现,包含testbench和MATLAB对比
本项目展示了一种基于FPGA的音频水印算法,采用LSB(最低有效位)技术实现版权保护与数据追踪功能。使用Vivado2019.2和Matlab2022a开发,完整代码含中文注释及操作视频。算法通过修改音频采样点的最低有效位嵌入水印,人耳难以察觉变化。然而,面对滤波或压缩等攻击时,水印提取可能受影响。该项目运行效果无水印干扰,适合实时应用场景,核心逻辑简单高效,时间复杂度低。
基于GA遗传算法的拱桥静载试验车辆最优布载matlab仿真
本程序基于遗传算法(GA)实现拱桥静载试验车辆最优布载的MATLAB仿真,旨在自动化确定车辆位置以满足加载效率要求(0.95≤ηq≤1.05),目标是使ηq尽量接近1,同时减少车辆数量和布载耗时。程序在MATLAB 2022A版本下运行,展示了工况1至工况3的测试结果。通过优化模型,综合考虑车辆重量、位置、类型及车道占用等因素,确保桥梁关键部位承受最大荷载,从而有效评估桥梁性能。核心代码实现了迭代优化过程,并输出最优布载方案及相关参数。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等