自然语言处理之Levenshtien Distance算法研究
自然语言处理中,一个很重要的应用就是问答系统,这里面,涉及到问题和知识库里面的问题的匹配度,从而检索出问题的答案,这个是一个比较常见的应用算法。
编辑距离(Edit Distance),又称Levenshtein距离(即莱文斯坦距离,LD算法),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。
许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。一般来说,编辑距离越小,两个串的相似度越大。
该算法由俄罗斯科学家Vladimir Levenshtein于1965年提出。
算法应用范围很广泛,除了论文查重(抄袭率),基因序列匹配,当前一个很重要的应用就是自然语言处理中的语句的近似度。今天,我们重点讨论的是用LD算法计算两个语句串的相似度。
例如将kitten转成sitting(变化过程中没有删除动作,只有修改和插入):
kitten->sitten (将字母k→s)
sitten->sittin (将字母e→i)
sittin->sitting (插入g)
算法逻辑步骤:
1. 计算出比较的字符串S,T的长度n和m。
2. 初始化一个(n+1)*(m+1)的二维数组edit(i,j)。
3. 抽象出动态规划计算编辑距离的方程edit(i,j)=min{edit(i-1,j)+1,edit(i,j-1)+1,edit(i-1,j-1)+cost}。
其中cost=[当S串的i字符与T串的j字符不等时为1,否则为0]
4. 遍历S,T中的每个字符的对比,最后的edit(n,m)为编辑距离。
比如要计算cafe和coffee的编辑距离。cafe→caffe→coffe→coffee,定义S=cafe,T=coffee,编辑距离是3.
算法的java的实现过程源码:
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner; /**
* @author shihuc
* @date 2017年9月28日 下午3:24:43
*/
public class EditDistance { /**
* @author shihuc
* @param args
* @throws FileNotFoundException
*/
public static void main(String[] args) throws FileNotFoundException {
File file = new File("./src/com/shihuc/nlp/leventhienDistance/sample.txt");
Scanner sc = new Scanner(file);
int N = sc.nextInt();
sc.nextLine();
for(int i=; i<N; i++){
String T = sc.nextLine();
String S = sc.nextLine();
int dist = editDist(S,T);
System.out.println(S + " vs " + T + " distance: " + dist);
}
sc.close();
} private static int editDist(String S, String T){
/*
* 步骤1.
*/
int n = S.length();
int m = T.length();
int [][] edit = new int[n+][m+]; /*
* 步骤2.
* 初始化动态规划数据容器edit[][]
*/
for(int i=;i<=n;i++) edit[i][] = i;
for(int j=;j<=m;j++) edit[][j] = j; /*
* 步骤4.
* 遍历S,T
*/
for(int i=; i<=n; i++){
char s = S.charAt(i-);
for(int j=; j<=m; j++){
/*
* 步骤3.
* 动态规划,迭代计算edit[i][j]的距离
*/
int cost = calcCost(s, T.charAt(j-));
edit[i][j] = min(edit[i-][j]+,edit[i][j-]+,edit[i-][j-]+cost);
}
}
printEdit(S,T,edit);
return edit[n][m];
} private static int calcCost(int a, int b){
if(a == b) {
return ;
}else {
return ;
}
} private static int min(int a, int b, int c){
int m = ;
if(a < b){
m = a;
}else{
m = b;
}
if(m < c){
return m;
}else{
return c;
}
} private static void printEdit(String S, String T, int es[][]){
System.out.print(" ");
for(int x=; x<es[].length - ; x++){
System.out.print(T.charAt(x)+" ");
}
System.out.println("");
for(int i=;i<es.length;i++){
if(i > ){
System.out.print(S.charAt(i - ) + " ");
}else{
System.out.print(" " );
}
for(int j=;j<es[].length;j++){
System.out.print(es[i][j] + " ");
}
System.out.println("");
}
}
}
这里,附上测试案例数据:
4 #表示有4组测试数据,每组含有S和T。每组的第一行是T,表示目标数据,第二行S表示源数据
coffee
cafe
failing
sailn
kitten
sitting
girl
girlfriend
运行后的结果如下:
c o f f e e c
a
f
e
cafe vs coffee distance:
f a i l i n g s
a
i
l
n
sailn vs failing distance:
k i t t e n s
i
t
t
i
n
g
sitting vs kitten distance:
g i r l f r i e n d g
i
r
l
girl vs girlfriend distance:
是不是比较有意思,还是比较有价值的。
PS。最近有很长一段时间没有跟算法了,因为项目太紧,自然语言处理是个深远的领域,路很长,慢慢走!
自然语言处理之Levenshtien Distance算法研究的更多相关文章
- NLTK学习笔记(四):自然语言处理的一些算法研究
自然语言处理中算法设计有两大部分:分而治之 和 转化 思想.一个是将大问题简化为小问题,另一个是将问题抽象化,向向已知转化.前者的例子:归并排序:后者的例子:判断相邻元素是否相同(与排序). 这次总结 ...
- Levenshtein Distance算法(编辑距离算法)
编辑距离 编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符, ...
- Magic Number(Levenshtein distance算法)
Magic Number Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit ...
- July-程序员面试、算法研究、编程艺术、红黑树、数据挖掘5大经典原创系列集锦与总结
程序员面试.算法研究.编程艺术.红黑树.数据挖掘5大经典原创系列集锦与总结 http://blog.csdn.net/v_july_v/article/details/6543438
- Akamai在内容分发网络中的算法研究(翻译总结)
作者 | 钱坤 钱坤,腾讯后台开发工程师,从事领域为流媒体CDN相关,参与腾讯TVideo平台开发维护. 原文是<Algorithmic Nuggets in Content Delivery& ...
- 经典算法研究系列:二、Dijkstra 算法初探
July 二零一一年一月 本文主要参考:算法导论 第二版.维基百科. 一.Dijkstra 算法的介绍 Dijkstra 算法,又叫迪科斯彻算法(Dijkstra),算法解决的是有向图中单个源点到 ...
- 静态频繁子图挖掘算法用于动态网络——gSpan算法研究
摘要 随着信息技术的不断发展,人类可以很容易地收集和储存大量的数据,然而,如何在海量的数据中提取对用户有用的信息逐渐地成为巨大挑战.为了应对这种挑战,数据挖掘技术应运而生,成为了最近一段时期数据科学的 ...
- 字符串相似度算法——Levenshtein Distance算法
Levenshtein Distance 算法,又叫 Edit Distance 算法,是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一 ...
- 字符串相似度算法-LEVENSHTEIN DISTANCE算法
Levenshtein Distance 算法,又叫 Edit Distance 算法,是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一 ...
随机推荐
- ibatis集成封装之路(to mysql)
hello <tx:annotation-driven transaction-manager=" "/> 插入记录ID的坑 https://renjieguixion ...
- python day 16作业
day18天作业及默写1,完成下列功能: 1.1创建一个人类Person,再类中创建3个静态变量(静态字段) animal = '高级动物' soup = '有灵魂' language = '语言' ...
- SSL/TLS Server supports TLSv1.0
远程登录服务器后打开注册表编辑器,点开HKEY-LOCAL-MACHINE,SYSTEM,CURRENTCONTROLSET下的Control 找到SecurityProviders下的SCHANNE ...
- c++ 中:和::理解
1.冒号(:)用法 (1)表示机构内位域的定义(即该变量占几个bit空间) typedef struct _XXX{ unsigned char a:4; unsigned char c; } ; X ...
- php-xdebug(安装)
我虽然是前端人员,但是我也挺喜欢服务端语言的,我不是说完全不会服务端语言,主要是没有实践经验,实践经验不一样非要公司的项目,自己也可以去模仿一些项目,那也是实践的.所以就有了想法,自己写个项目,从后端 ...
- MongDB篇,第一章:数据库知识2
MongDB 数据库知识2 非关系型数据库和关系型数据库的比较1. 不是以关系模型构建数据结构,结构比较自由 不保证数据的一致性2. 非关系型数据库弥补了关系型数据库的一些不足,能 够在处理高并 ...
- jvm内存增长问题排查简例
jvm内存增长问题排查 排查个jvm 内存占用持续增加的问题,纪录一下,引以为戒. 运维发现应用jvm内存占用在发布后回落,然后持续增高,,dump后分析一下: 占内存的大部分是这种名字相似的bean ...
- 通过putty进行端口映射并且启动jupyter notebook
通过内网穿透之后,一般而言,我们访问内网中的机器在ubuntu下一句命令: ssh name@阿里云 -p 6000即可进行访问,其中-p是表示端口号:同样的通过windows下的putty也可修改对 ...
- 逆序对__归并排序__树状数组 Inversions SGU - 180
There are N integers (1<=N<=65537) A1, A2,.. AN (0<=Ai<=10^9). You need to find amount o ...
- gurnt js css 压缩合并
package.json 文件 { "name":"my-project-name", "version":"0.0.1" ...