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. 查看与修改网关,DNS

    网关是网络中的路由器,作为访问其他网络的接入点. 修改ip地址 即时生效: ifconfig eth0 192.168.0.20 netmask 255.255.255.0 启动生效: 修改/etc/ ...

  2. [转]jna模拟指针开辟空间,数组首地址获取值

    http://blog.csdn.net/zhuzhichao0201/article/details/5817819 不是很明白,先记在这里 ———————————————————————————— ...

  3. C++ 类的继承五(类继承中的static关键字)

    //类继承中的static关键字 #include<iostream> using namespace std; /* 派生类中的静态成员 基类定义的静态成员,将被所有派生类共享 根据静态 ...

  4. springboot查找配置文件路径的过程

    spring加载配置文件是通过listener监视器实现的,在springboot启动时: 在容器启动完成后会广播一个SpringApplicationEvent事件,而SpringApplicati ...

  5. 请写出一个超链接,点击链接后可以向zhangsan@d-heaven.com发送电子邮件。

    请写出一个超链接,点击链接后可以向zhangsan@d-heaven.com发送电子邮件. <a href=”mailto: zhangsan@d-heaven.com”>发邮件</ ...

  6. Window对应的类为java.awt.Windows, 它可独立于其他Container而存在

    Window对应的类为java.awt.Windows, 它可独立于其他Container而存在,它有两个子类, Frame和Dialog, Frame是具有标题(title)和可伸缩的角(resiz ...

  7. SQL Server Replace函数

    REPLACE用第三个表达式替换第一个字符串表达式中出现的所有第二个给定字符串表达式. 语法REPLACE ( 'string_expression1' , 'string_expression2' ...

  8. Anaconda2+Theano 安装过程中的所有的坑。。。

    写在前面的废话 上次搞theano安装还是一年多以前..anaconda才出到1.4,当时的AnacondaCE,直接安装完基本上theano啥的都一套成功.. 今天换了个电脑,重装anaconda, ...

  9. Android基础新手教程——3.1 基于监听的事件处理机制

    Android基础新手教程--3.1.1 基于监听的事件处理机制 标签(空格分隔): Android基础新手教程 本节引言: 第二章我们学习的是Android的UI控件,我们能够利用这些控件构成一个精 ...

  10. 转载:Faster-RCNN详解

    原文:http://blog.csdn.net/zy1034092330/article/details/62044941 原文大神有很多经典之作,并且讲解得很透彻,建议前往,这里仅当学习使用. Fa ...