最近因为工作需要,学习了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. 一维树状数组(HD1166)

    #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<string.h> using namespace st ...

  2. java如何在一个有序的数组类插入一个数!

    第一种:依次与有序数组中的每个数进行比较,然后找到位置之后,定义一个新的数组,该信数组的长度加一,再使用system.arraycopy将于数组copy到新数组!import java.util.Ar ...

  3. mysql DBI 事务控制

    事务: 事务是任何健壮数据库系统的基本组成,它们 防止错误和数据库腐败通过确保有关数据的改变是原子发生的(不可分割的,要么所有要么什么都不做) 这个章节应用于数据库支持事务和 AutoCommit 是 ...

  4. reids客户端 redis-cli用法

    Redis提供了丰富的命令(command)对数据库和各种数据类型进行操作,这些command可以在Linux终端使用.在编程时,比如使用Redis 的Java语言包,这些命令都有对应的方法.下面将R ...

  5. Java调用.dll文件

    因为项目的需求,要在JAVA项目中调用Windows的Dll(动态链接库)文件,之前用Jni调用过C写的Dll文件,比较麻烦,这里不多说,网上也有很多这方面的文档.在网上找到一个开源的组件JNativ ...

  6. 借助bootstrap框架模仿airbnb写的网页

    View HTML .nav a { color: #5a5a5a; font-size: 11px; font-weight: bold; padding: 14px 10px; text-tran ...

  7. VS2013启动项目调试的时候会启动本地IIS

    VS2013启动项目调试的时候会启动本地IIS ,而在这种状态下去调试程序,会有很多功能用不了,而且还会有错误:如下图: 解决方法,将托管管道模式更改一下就行了:

  8. CLR via C# 阅读笔记

    1.char在C#中为16位Unicode字符:int 映射到System.Int32;long映射到System.Int64. 2.重载时C#不考虑返回值,而CLR允许返回值不同,方法名和参数相同的 ...

  9. AngularJS 实战讲义笔记

    第一部分 快速上手 1.1 感受AngularJs四大核心特性(MVC, 模块化,指令系统,双向数据绑定)1.2 搭建自动化的前端开发,调试,测试环境 代码编辑工具 (sublime) 断点调试工具 ...

  10. php汉字截取

    /** * 截取HTML,并自动补全闭合 * @param $html * @param $length * @param $end */ function subHtml($html,$length ...