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. 编写可维护的JavaScript----笔记(一)

    1.缩进层级 建议使用4个空格为一个缩进层级,避免使用制表符进行缩进,可以通过配置文本编辑器来改变 缩进层级表示的内容. 2.语句末尾 有赖于分析器的自动分号插入机制(ASI),JavaScript可 ...

  2. COCOS2D-HTML5 开发之二】cocos2d-html5项目定义成员,局部变量,函数笔记随笔

    本站文章均为李华明Himi原创,转载务必在明显处注明:(作者新浪微博:@李华明Himi) 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/cocos2d- ...

  3. deep learning+ Depth Estimation

    Depth estimation/stereo matching/optical flow @CVPR 2017 Unsupervised Learning of Depth and Ego-Moti ...

  4. ubuntu 安装 avahi服务

    sudo apt-get install avahi-daemon sudo apt-get install avahi-utils

  5. 该如何将MathType公式粘贴到文档中

    MathType是一款非常好用的数学公式编辑器,因为它与很多的文档处理器都能够很好地兼容,因此其使用范围非常的大.MathType公式编辑器编辑的公式与数学符号等都符号国际期刊的出版标准,并且上手容易 ...

  6. Chem 3D中怎么创建立体模型

    ChemDraw作为一款很受大家欢迎的化学绘图软件,其在绘制平面化学方面的功能已经非常的强大了,其实它也可以绘制3D图形.Chem 3D就是绘制3D图形的重要组件.而且为了满足不同的用户绘图的需求,可 ...

  7. 监视EF生成SQL的方法(log , SqlServerProfile)

    大家在学习entityframework的时候,都知道那linq写的叫一个爽,再也不用区分不同RDMS的sql版本差异了,但是呢,高效率带来了差灵活性,我们 无法控制sql的生成策略,所以必须不要让自 ...

  8. Laravel5.1 分页展示

    Laravel为我们提供了一套分页的逻辑,我们无需自己实现分页逻辑,只需要执行几个简单的方法就能实现漂亮的分页. 1 simplePaginate 这是一种只显示上一页下一页的样式分页,我们来看看怎么 ...

  9. wireshark抓取OpenFlow数据包

    在写SDN控制器应用或者改写控制器源码的时候,经常需要抓包,验证网络功能,以及流表的执行结果等等,wireshark是个很好的抓包分析包的网络工具,下面简介如何用wireshark软件抓取OpenFl ...

  10. HDU4267(2012年长春站)

    这道题真的是好题,让我对线段树有了全新的认识,至少让我真正感受到了线段树的神奇. 题意是就是线段树区间更新,单点询问的问题,不过这个题好就好在它的区间更新的点并不连续! adding c to eac ...