自然语言处理中,一个很重要的应用就是问答系统,这里面,涉及到问题和知识库里面的问题的匹配度,从而检索出问题的答案,这个是一个比较常见的应用算法。

编辑距离(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算法研究的更多相关文章

  1. NLTK学习笔记(四):自然语言处理的一些算法研究

    自然语言处理中算法设计有两大部分:分而治之 和 转化 思想.一个是将大问题简化为小问题,另一个是将问题抽象化,向向已知转化.前者的例子:归并排序:后者的例子:判断相邻元素是否相同(与排序). 这次总结 ...

  2. Levenshtein Distance算法(编辑距离算法)

    编辑距离 编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符, ...

  3. Magic Number(Levenshtein distance算法)

    Magic Number Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit ...

  4. July-程序员面试、算法研究、编程艺术、红黑树、数据挖掘5大经典原创系列集锦与总结

    程序员面试.算法研究.编程艺术.红黑树.数据挖掘5大经典原创系列集锦与总结 http://blog.csdn.net/v_july_v/article/details/6543438

  5. Akamai在内容分发网络中的算法研究(翻译总结)

    作者 | 钱坤 钱坤,腾讯后台开发工程师,从事领域为流媒体CDN相关,参与腾讯TVideo平台开发维护. 原文是<Algorithmic Nuggets in Content Delivery& ...

  6. 经典算法研究系列:二、Dijkstra 算法初探

    July   二零一一年一月 本文主要参考:算法导论 第二版.维基百科. 一.Dijkstra 算法的介绍 Dijkstra 算法,又叫迪科斯彻算法(Dijkstra),算法解决的是有向图中单个源点到 ...

  7. 静态频繁子图挖掘算法用于动态网络——gSpan算法研究

    摘要 随着信息技术的不断发展,人类可以很容易地收集和储存大量的数据,然而,如何在海量的数据中提取对用户有用的信息逐渐地成为巨大挑战.为了应对这种挑战,数据挖掘技术应运而生,成为了最近一段时期数据科学的 ...

  8. 字符串相似度算法——Levenshtein Distance算法

    Levenshtein Distance 算法,又叫 Edit Distance 算法,是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一 ...

  9. 字符串相似度算法-LEVENSHTEIN DISTANCE算法

    Levenshtein Distance 算法,又叫 Edit Distance 算法,是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一 ...

随机推荐

  1. Java 构造器Constructor 继承

    Java默认构造方法 构造方法作用:初始化所定义的类的对象和属性. 构造方法没有返回类型. 2 继承中的构造器 子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式). 如果父类 ...

  2. c++字符串前几位,后几位的截取

    参考 1. https://blog.csdn.net/haijunsm/article/details/82733584 完

  3. 检查服务器主从状态的脚本-check_server_state.sh

    分别检查服务器在Master/Slave状态下,各项服务是否正常,否则报警: 原来使用keepalived每隔1分钟调用,由于执行结果对keepalived的weight参数有影响,所以移动到外部,使 ...

  4. [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 ...

  5. iptables filter表 案例、iptables nat表的路由功能 、端口映射

    1.小案例 #!/bin/bashipt="/usr/sbin/iptables"$ipt -F$ipt -P INPUT DROP$ipt -P OUTPUT ACCEPT$ip ...

  6. Chrome程序及数据位置变更到非系统盘

    Chrome浏览器在Windows系统上安装过程,没有设置安装位置的步骤,所以默认是安装在C盘的.并且,若Chrome作为主要浏览器使用,随着时间的积累,数据文件会非常多.增加系统盘的负荷. Wind ...

  7. 20165313 《Java程序设计》第一周学习总结

    教材学习内容总结 1.Java的地位 1.网络地位 2.语言地位 3.需求地位 2.Java的特点 1.简单 2.面向对象 3.平台无关 4.多线程 5.动态 3.安装JDK(重点) 注释:需修改系统 ...

  8. (考研)java网络编程

    dog   jb 叫什么...  从飞秋得到IP地址 自己学会的用命令 ipconfig 编写java程序看ipimport java.net.*; public class Test{ public ...

  9. Makefile introduction (very old presentation)

  10. 怎样解题 (G. 波利亚 著)

    第一部分 (已看) 目的 1. 帮助学生 2. 问题,建议,思维活动 3. 普遍性 4. 常识 5. 教师和学生,模仿和实践 主要部分,主要问题 6. 四个阶段 7. 理解题目 8. 例子 9. 拟订 ...