自然语言处理之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 算法,是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一 ...
随机推荐
- Java 构造器Constructor 继承
Java默认构造方法 构造方法作用:初始化所定义的类的对象和属性. 构造方法没有返回类型. 2 继承中的构造器 子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式). 如果父类 ...
- c++字符串前几位,后几位的截取
参考 1. https://blog.csdn.net/haijunsm/article/details/82733584 完
- 检查服务器主从状态的脚本-check_server_state.sh
分别检查服务器在Master/Slave状态下,各项服务是否正常,否则报警: 原来使用keepalived每隔1分钟调用,由于执行结果对keepalived的weight参数有影响,所以移动到外部,使 ...
- [LeetCode&Python] Problem 21. Merge Two Sorted Lists
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...
- iptables filter表 案例、iptables nat表的路由功能 、端口映射
1.小案例 #!/bin/bashipt="/usr/sbin/iptables"$ipt -F$ipt -P INPUT DROP$ipt -P OUTPUT ACCEPT$ip ...
- Chrome程序及数据位置变更到非系统盘
Chrome浏览器在Windows系统上安装过程,没有设置安装位置的步骤,所以默认是安装在C盘的.并且,若Chrome作为主要浏览器使用,随着时间的积累,数据文件会非常多.增加系统盘的负荷. Wind ...
- 20165313 《Java程序设计》第一周学习总结
教材学习内容总结 1.Java的地位 1.网络地位 2.语言地位 3.需求地位 2.Java的特点 1.简单 2.面向对象 3.平台无关 4.多线程 5.动态 3.安装JDK(重点) 注释:需修改系统 ...
- (考研)java网络编程
dog jb 叫什么... 从飞秋得到IP地址 自己学会的用命令 ipconfig 编写java程序看ipimport java.net.*; public class Test{ public ...
- Makefile introduction (very old presentation)
- 怎样解题 (G. 波利亚 著)
第一部分 (已看) 目的 1. 帮助学生 2. 问题,建议,思维活动 3. 普遍性 4. 常识 5. 教师和学生,模仿和实践 主要部分,主要问题 6. 四个阶段 7. 理解题目 8. 例子 9. 拟订 ...