自然语言处理之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 算法,是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一 ...
随机推荐
- Python MRO_C3
class A: pass class B(A): pass class C(A): pass class D(B, C): pass class E(C, A): pass class F(D, E ...
- python的ConfigParser模块
前言 处理配置文件做增.删.改.查 操作. 配置文件的格式如下:“[ ]”包含的为 section,section 下面为类似于 key - value 的配置内容: configparser 默认支 ...
- SQL server类型转换
1. CAST函数 语法: CAST ( expression AS data_type [ ( length ) ] ) | | | |关键字 表达式或值 要转换成的数据类型 最大长度 示例: SE ...
- Vue 之 Vue.nextTick()
异步更新队列 可能你还没有注意到,Vue 异步执行 DOM 更新.只要观察到数据变化,Vue 将开启一个队列,并缓冲在同一事件循环中发生的所有数据改变.如果同一个 watcher 被多次触发,只会一次 ...
- Symbol -- JavaScript 语言的第七种数据类型
ES5 的对象属性名都是字符串,这容易造成属性名的冲突.比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突.如果有一种机制,保证 ...
- React native Configuration with name 'default' not found.
添加插件后出现异常 FAILURE: Build failed with an exception. * What went wrong: A problem occurred configuring ...
- 支付宝异步通知(notify_url)与return_url.
支付宝接口使用文档说明 支付宝异步通知(notify_url)与return_url. 现支付宝的通知有两类. A服务器通知,对应的参数为notify_url,支付宝通知使用POST方式 B页面跳转通 ...
- 对ajax中数据的得到以及绑定的认识
1.将后台得到的数据绑定到datagrid为例: 第一种是: 后台得到的数据直接绑定到datagrid上面,如下图: 这样操作的好处在于可以使界面比较简洁. 第二种是将得到的数据作为参数的形式绑定到d ...
- 标准正态分布表(scipy.stats)
0. 标准正态分布表与常用值 Z-score 是非标准正态分布标准化后的 x即 z=x−μσ" role="presentation">z=x−μσz=x−μσ 表 ...
- HTTP基本原理(转)
1. HTTP简介 HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议.它可以使浏览器更加高效,使网络传输减少. ...