最近因为工作需要,学习了NLP的相关知识,简单动手实现了一下计算Edit Distance的算法,就是计算一个字符串要变成另一个字符串需要的代价,这其中采用Levenshtein方式,即规定一个插入和一个删除的代价是1,一次替换的代价是2.

简单的逻辑:

对于长度为M的字符串X,长度为N的字符串Y,

Initialization:

  D(i,0)=i

  D(0,j)=j

Recurrence Relation:

  for each i=1...M

    for each j=1...N

      D(i,j)=Min(D(i-1,j)+1,D(i,j-1)+1,X(i)==Y(j)?D(i-1,j-1):D(i-1,j-1)+2)

Termination:

  D(M,N) is distance

public static int EditDistance(string str1, string str2)
{
int len1 = str1.Length;
int len2 = str2.Length; int[,] table = new int[len1+, len2+];
for (int i = ; i < len1; i++)
{
for (int j = ; j < len2; j++)
{
table[i, j] = ;
}
}
table[, ] = ; for (int i = ; i <= len1; i++)
{
for (int j = ; j <= len2; j++)
{
if (i == && j != )
{
table[i, j] = table[i, j - ] + ;
}
if (j == && i != )
{
table[i, j] = table[i - , j] + ;
}
if (i > && j > )
{
int temp = (str1[i-] == str2[j-]) ? table[i - , j - ] : table[i - , j - ] + ;
table[i, j] = Min(table[i, j - ] + , table[i - , j] + , temp);
}
}
}
return table[len1, len2];
}
public static int Min(int val1, int val2, int val3)
{
return (val1 < val2 ? val1 : val2) < val3 ? (val1 < val2 ? val1 : val2) : val3;
}

递归:

public static int EditDistanceD(string str1, string str2, int len1, int len2)
{
if (len1 == || len2 == )
{
return Max(len1, len2);
} return str1[len1-]==str2[len2-]?Min(EditDistanceD(str1.Substring(,len1-), str2.Substring(, len2-), len1-, len2-), EditDistanceD(str1.Substring(,len1-), str2, len1-, len2)+, EditDistanceD(str1, str2.Substring(, len2-), len1, len2-)+):Min(EditDistanceD(str1.Substring(,len1-), str2.Substring(, len2-), len1-, len2-)+, EditDistanceD(str1.Substring(,len1-), str2, len1-, len2)+, EditDistanceD(str1, str2.Substring(, len2-), len1, len2-)+);
}
public static int Max(int val1, int val2)
{
return val1 > val2 ? val1 : val2;
}

具体讲解参考:

http://blog.csdn.net/huaweidong2011/article/details/7727482

简单实现计算Edit Distance算法的更多相关文章

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

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

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

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

  3. 利用编辑距离(Edit Distance)计算两个字符串的相似度

    利用编辑距离(Edit Distance)计算两个字符串的相似度 编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可 ...

  4. stanford NLP学习笔记3:最小编辑距离(Minimum Edit Distance)

    I. 最小编辑距离的定义 最小编辑距离旨在定义两个字符串之间的相似度(word similarity).定义相似度可以用于拼写纠错,计算生物学上的序列比对,机器翻译,信息提取,语音识别等. 编辑距离就 ...

  5. Minimum edit distance(levenshtein distance)(最小编辑距离)初探

    最小编辑距离的定义:编辑距离(Edit Distance),又称Levenshtein距离.是指两个字串之间,由一个转成还有一个所需的最少编辑操作次数.许可的编辑操作包含将一个字符替换成还有一个字符. ...

  6. [LeetCode] Edit Distance 编辑距离

    Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2 ...

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

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

  8. 编辑距离——Edit Distance

    编辑距离 在计算机科学中,编辑距离是一种量化两个字符串差异程度的方法,也就是计算从一个字符串转换成另外一个字符串所需要的最少操作步骤.不同的编辑距离中定义了不同操作的集合.比较常用的莱温斯坦距离(Le ...

  9. 动态规划 求解 Minimum Edit Distance

    http://blog.csdn.net/abcjennifer/article/details/7735272 自然语言处理(NLP)中,有一个基本问题就是求两个字符串的minimal Edit D ...

随机推荐

  1. ACID:数据库事务正确执行的四个基本要素

    ACID,指数据库事务正确执行的四个基本要素的缩写.包含:原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持久性(Durability).一个支持事务(T ...

  2. 轻松搞定javascript原型链 _proto_

    //如有错误或不同观点,欢迎批评与讨论! 首先,prototype出现的目的,是为了解决 代码重用 的问题 , prototype 相当于是在内存上划分出一个公共的区域, 专用于存放 实例化对象 的相 ...

  3. Oracle ORA-01555 快照过旧 说明

    oracle高级知识(1) ORA-01555 快照过旧,是数据库中很常见的一个错误,比如当我们的事务需要使用undo来构建CR块的时候,而此时对应的undo 已经不存在了, 这个时候就会报ORA-0 ...

  4. javascript - 工作笔记 (事件三)

    有关定义就不多说了,事件分两种 一,冒泡型事件 这是IE浏览器中事件模型的实现,顾名思义,就像水中的泡一样,自底而上,其经过的父元素都会触发对应的事件. 即:触发元素的父元素先于触发元素触发,看dem ...

  5. 浅析document.createDocumentFragment()与js效率

    对于循环批量操作页面的DOM有很大帮助!利用文档碎片处理,然后一次性append,并且使用原生的javascript语句操作 document.createDocumentFragment()说白了就 ...

  6. 论山寨手机与Android联姻 【2】手机OS成为核心

    手机凭借通话和短信这两项基本功能,积累了用户,开拓了市场.但是用户的需求是永无止境的,对于手机制造商来说,紧跟用户需求,拓展手机功能,是机会也是挑战. 1988年第一款数码相机,在日本上市.数码相机的 ...

  7. C语言对象化编程

    以下为一个引子: C中struct的函数实现,只能用函数指针成员. C结构体内不能有函数的代码,但可以有函数的指针. C/C code Code highlighting produced by Ac ...

  8. HNU 12850 Garage

    长为H的格子里面放n个长为h的格子 最多会有n+1个空隙 要使每一个空隙长度都小于h (H-h*n)/(n+1)<h n>(H/h-1)/2 #include<bits/stdc++ ...

  9. node.js(六) UTIL模块

    1.inspect函数的基本用法 util.inspect(object,[showHidden],[depth],[colors])是一个将任意对象转换为字符串的函数,通常用于调试和错误输出.它至少 ...

  10. php获取post参数的几种方式

    php获取post参数的几种方式 1.$_POST['paramName'] 只能接收Content-Type: application/x-www-form-urlencoded提交的数据 2.fi ...