Levenshtein距离
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)。
- 如果xi = yj,leva,b(i, j) = leva,b(i-1, j-1)
- 如果xi ≠ yj,leva,b(i, j)将是以下三种情况中,编辑次数最少的一个
(1) 替换xi ,让xi 替换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个位置, 删除入字符xi ,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距离的更多相关文章
- 字符串编辑距离(Levenshtein距离)算法
基本介绍 Levenshtein距离是一种计算两个字符串间的差异程度的字符串度量(string metric).我们可以认为Levenshtein距离就是从一个字符串修改到另一个字符串时,其中编辑单个 ...
- Spark Java API 计算 Levenshtein 距离
Spark Java API 计算 Levenshtein 距离 在上一篇文章中,完成了Spark开发环境的搭建,最终的目标是对用户昵称信息做聚类分析,找出违规的昵称.聚类分析需要一个距离,用来衡量两 ...
- 51nod 1183 - 编辑距离 - [简单DP][编辑距离问题][Levenshtein距离问题]
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1183 编辑距离,又称Levenshtein距离(也叫做Edi ...
- 1.交通聚类:编辑距离 (Levenshtein距离)Java实现
1.最近工作中要实现用户车辆的行驶路线的聚类,由于所给的数据只有用户一天中交通卡口所监视的卡口名称 :即青岛路-威海路-济阳路 . 要通过聚类实现车辆路线的规律分析,首先要解决的是相似度问题,我们知道 ...
- Finding Similar Items 文本相似度计算的算法——机器学习、词向量空间cosine、NLTK、diff、Levenshtein距离
http://infolab.stanford.edu/~ullman/mmds/ch3.pdf 汇总于此 还有这本书 http://www-nlp.stanford.edu/IR-book/ 里面有 ...
- 【Algorithm】字符串编辑距离(Levenshtein距离)C++算法实现
算法实现比较简单,但算法原理不明白,有空了再研究一下. unsigned LevenshteinDistance(const string& s1, const string& s2) ...
- Levenshtein Distance莱文斯坦距离算法来计算字符串的相似度
Levenshtein Distance莱文斯坦距离定义: 数学上,两个字符串a.b之间的莱文斯坦距离表示为levab(|a|, |b|). levab(i, j) = max(i, j) 如果mi ...
- Levenshtein计算相似度距离
使用Levenshtein计算相似度距离,装下模块,调用下函数就好. 拿idf还得自己去算权重,而且不一定准确度高,一般做idf还得做词性归一化,把动词形容词什么全部转成名词,很麻烦. Levensh ...
- 通俗解析莱文斯坦距离(Levenshtein Distance)计算原理(最小编辑距离)
[版权声明]:本文章由danvid发布于http://danvid.cnblogs.com/,如需转载或部分使用请注明出处 最近看到一些动态规划的东西讲到莱文斯坦距离(编辑距离)的计算,发现很多都讲的 ...
随机推荐
- Socket创建失败:10093错误
10093的错误,应用程序没有调用 WSAStartup,或者 WSAStartup 失败. 问题描述:Failed to create UDP socket:10093!Close and rest ...
- 从以下哪一个选项中可以获得Servlet的初始化参数。
从以下哪一个选项中可以获得Servlet的初始化参数. A.Servlet B.ServletContext C.ServletConfig D.GenericServlet 解答:C servlet ...
- heap corruption detected错误解决方法调试方法以及内存管理相关
1.heap corruption detected http://vopit.blog.51cto.com/2400931/645980 heap corruption detected:aft ...
- 【POJ】2942 Knights of the Round Table(双连通分量)
http://poj.org/problem?id=2942 各种逗.... 翻译白书上有:看了白书和网上的标程,学习了..orz. 双连通分量就是先找出割点,然后用个栈在找出割点前维护子树,最后如果 ...
- Access 是/否 字段
Microsoft Access 数据库引擎 SQL 数据类型包含由 Microsoft® Jet 数据库引擎定义的 13 种主要数据类型,以及若干可识别为这些数据类型的有效同义词. 其中,在工作中遇 ...
- poj 3281(网络流+拆点)
题目链接:http://poj.org/problem?id=3281 思路:设一个超级源点和一个超级汇点,源点与食物相连,饮料与汇点相连,然后就是对牛进行拆点,一边喜欢的食物相连,一边与喜欢的饮料相 ...
- Web 前端从入门菜鸟到实践老司机所需要的资料与指南合集
http://web.jobbole.com/89188/ 2016 – 对于未来五年内Web发展的7个预测 2015 – 我的前端之路:从命令式到响应式,以及组件化与工程化的变革 怎么成为一名优秀的 ...
- dropload 使用表
移动端下拉刷新.上拉加载更多插件 依赖 (dependence) Zepto 或者 jQuery 1.7以上版本,推荐jQuery 2.x版本(二者不要同时引用) Zepto or jQuery 1. ...
- PANDAS 数据合并与重塑(join/merge篇)
pandas中也常常用到的join 和merge方法 merge pandas的merge方法提供了一种类似于SQL的内存链接操作,官网文档提到它的性能会比其他开源语言的数据操作(例如R)要高效. 和 ...
- java-通过 HashMap、HashSet 的源码分析其 Hash 存储机制
通过 HashMap.HashSet 的源码分析其 Hash 存储机制 集合和引用 就像引用类型的数组一样,当我们把 Java 对象放入数组之时,并非真正的把 Java 对象放入数组中.仅仅是把对象的 ...