Levenshtein Distance,又称Edit Distance,在自然语言处理中有着广泛的应用。Levenshtein  Distance 指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。编辑操作包括:1)删除一个字符;2)插入一个字符;3)替换一个字符

  Example:

  两个字符串a = "kitten", b = "ssitting",编辑过程如下:

  • kitten → sitten (substitution of "s" for "k")
  • sitten → sittin (substitution of "i" for "e")
  • sittin → sitting (insertion of "g" at the end).

  因此,a与b之间的编辑距离等于3。

  解决方案:动态规划

  1)描述最优解结构,寻找最优子结构

  a = {x1, x2..xi}与字符串b = {y1, y2...yj}之间的最小编辑次数leva,b(i, j)。

  •  如果x= yj,leva,b(i, j) = leva,b(i-1, j-1)
  •  如果x≠ yj,leva,b(i, j)将是以下三种情况中,编辑次数最少的一个

  (1) 替换x,让x替换yj,编辑距离leva,b(i, j) =  leva,b(i-1, j-1) + 1

      (2) 在a中的第i个位置,插入新字符x让字符x = yj,leva,b(i, j) =  leva,b(i, j-1) + 1

      (3) 在a中的第i个位置, 删除入字符x,leva,b(i, j) =  leva,b(i-1, j) + 1

  2)递归定义最优解

  有了上面的分析,递归表达式可以容易的推导出来:

  

  3)自底向上的实现

  

#include <iostream>

using namespace std;

/************************************************************************/
/*
* a: 源字符串
* b: 目的字符串
* m: 源字符串长度
* n: 目的字符串的长度
/************************************************************************/
int lev_distance(const char* a, const char* b, int m, int n)
{
int* pre_col = new int[n+];
int* cur_col = new int[n+]; for (int i = ; i != n+; i++)
{
pre_col[i] = i;
} for (int i = ; i != m; i++)
{
cur_col[] = i + ;
for (int j = ; j < n; j++)
{
cur_col[j+] = min(min( + cur_col[j], + pre_col[j+]),
pre_col[j] + (a[i] == b[j] ? : ));
}
swap(pre_col, cur_col);
} return pre_col[n];
} int main()
{
char a[] = "kitten";
char b[] = "sitting"; int dist = lev_distance(a, b, sizeof(a)-, sizeof(b)-); cout<<"levenshtein distance:"<<dist<<endl; system("pause");
return ;
}

  正常的动态规划算法需要记录表格大小是len(a) * len(b),当字符串长度较长的情况下,将需要很大的存储空间,上面的算法针对这种情况做了一个小的改进:lev(i, j)仅依赖于表格中的三个位置,左边,上方,左上方,因此只要保留当前列与左边一列就可以求出lev(i, j)的值了。

  

Levenshtein距离的更多相关文章

  1. 字符串编辑距离(Levenshtein距离)算法

    基本介绍 Levenshtein距离是一种计算两个字符串间的差异程度的字符串度量(string metric).我们可以认为Levenshtein距离就是从一个字符串修改到另一个字符串时,其中编辑单个 ...

  2. Spark Java API 计算 Levenshtein 距离

    Spark Java API 计算 Levenshtein 距离 在上一篇文章中,完成了Spark开发环境的搭建,最终的目标是对用户昵称信息做聚类分析,找出违规的昵称.聚类分析需要一个距离,用来衡量两 ...

  3. 51nod 1183 - 编辑距离 - [简单DP][编辑距离问题][Levenshtein距离问题]

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1183 编辑距离,又称Levenshtein距离(也叫做Edi ...

  4. 1.交通聚类:编辑距离 (Levenshtein距离)Java实现

    1.最近工作中要实现用户车辆的行驶路线的聚类,由于所给的数据只有用户一天中交通卡口所监视的卡口名称 :即青岛路-威海路-济阳路 . 要通过聚类实现车辆路线的规律分析,首先要解决的是相似度问题,我们知道 ...

  5. Finding Similar Items 文本相似度计算的算法——机器学习、词向量空间cosine、NLTK、diff、Levenshtein距离

    http://infolab.stanford.edu/~ullman/mmds/ch3.pdf 汇总于此 还有这本书 http://www-nlp.stanford.edu/IR-book/ 里面有 ...

  6. 【Algorithm】字符串编辑距离(Levenshtein距离)C++算法实现

    算法实现比较简单,但算法原理不明白,有空了再研究一下. unsigned LevenshteinDistance(const string& s1, const string& s2) ...

  7. Levenshtein Distance莱文斯坦距离算法来计算字符串的相似度

    Levenshtein Distance莱文斯坦距离定义: 数学上,两个字符串a.b之间的莱文斯坦距离表示为levab(|a|, |b|). levab(i, j) = max(i, j)  如果mi ...

  8. Levenshtein计算相似度距离

    使用Levenshtein计算相似度距离,装下模块,调用下函数就好. 拿idf还得自己去算权重,而且不一定准确度高,一般做idf还得做词性归一化,把动词形容词什么全部转成名词,很麻烦. Levensh ...

  9. 通俗解析莱文斯坦距离(Levenshtein Distance)计算原理(最小编辑距离)

    [版权声明]:本文章由danvid发布于http://danvid.cnblogs.com/,如需转载或部分使用请注明出处 最近看到一些动态规划的东西讲到莱文斯坦距离(编辑距离)的计算,发现很多都讲的 ...

随机推荐

  1. ES6快速入门使用

    https://www.jianshu.com/p/061304806bda Babel-webpack的配置 Bebal官方文档 前段项目我想使用ES6的语法我应该怎么做呢?我们可以查看Babel的 ...

  2. iis 如何搭建url 重定向,实现无线端和pc端不同的跳转

    第一步,下载安装ARR(Application Request Routing), http://www.iis.net/downloads/microsoft/application-request ...

  3. nodejs之路探寻

    在webpack配置中经常会发现 const path = require('path') 这是加载nodejs路径处理API,这个API主要包含下面三个方法 path.dirname(filepat ...

  4. npm install 不自动生成 package-lock.json文件

    package-lock.json这个文件的作用就不详细说明了 有需要的可以参考 :https://www.cnblogs.com/cangqinglang/p/8336754.html 网上都说 n ...

  5. jquery page

  6. 如何交换a,b的数值——一个简单的问题就证明现在的你依然弱爆了

    How? int c = a; a = b; b = c; 这样会浪费多一点内存去存放c,so还有吗? a ^= b; b ^= a; a ^= b; ^:异或. 答案碉堡了, 不过估计除了有可能在面 ...

  7. MVC [Control与View交互]

    <1> Home控制器 using System; using System.Collections.Generic; using System.Data; using System.Da ...

  8. Android中使用OnClickListener接口实现button点击的低级失误

    今天写了几行极为简单的代码,就是想implements  View.OnCLickListener.然后实现按钮点击操作.可是按钮却没有反应.找了五分钟还是没有结果. 下面是我的代码,希望大家不要嘲笑 ...

  9. SpringMVC如何接收json数据

    请求头:Content-Type=application/json数据如: {"mobile":"12345678912","smsContent&q ...

  10. java汉字转拼音的工具类

    import com.google.common.base.Strings;import net.sourceforge.pinyin4j.PinyinHelper;import net.source ...