最近因为工作需要,学习了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. NodeJS学习笔记(一)——搭建开发框架Express,实现Web网站登录验证

    JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS,浏览器充当了解析器的角色.而对于需要独立运行的JS,NodeJS就是一个解析器.每一种解析器都是一个运行环境,不但允许J ...

  2. 获取自动增长IDmysqli函数

    <?php $mysqli=@new mysqli("localhost", "root", "123456", "xsph ...

  3. 一分钟了解PHP

    PHP5编辑 PHP5在长时间的开发及多个预发布版本后,2004年7月13日,PHP5.0发布.该版本以Zend引擎Ⅱ为引擎,并且加入了新功能如PHP Data Objects(PDO).PHP5.0 ...

  4. cocos2d-x box2d使用调试绘图

    cocos2d-x box2d使用调试绘图 复制TestCpp的GLES-Render.h和GLES-Render.cpp过来. 添加一个成员变量: GLESDebugDraw *m_debugDra ...

  5. Oracle EBS-SQL (WIP-9):检查车间任务超发料.sql

    select WE.WIP_ENTITY_NAME                                  任务号,         MFG_LOOKUPS_WJS.MEANING      ...

  6. Type Correlation

    Types of correlation: Logical correlation: Using pre-defined and customized correlation rules. Inven ...

  7. delphi 发送Windwos消息控制按钮(控制计算器里的某一个按钮)

    procedure TfrmMain.btnSendClick(Sender: TObject); var hCalc, h1: Cardinal; begin WinExec('calc', SW_ ...

  8. RDLC报表 在WinForm里运行出现 未能加载文件或程序集 Microsoft.ReportViewer.WinForms, Version=11.0.0.0 System.IO.FileNotFoundException

    原文:RDLC报表 在WinForm里运行出现 未能加载文件或程序集microsoft.reportviewer.winforms 推荐以下方案二 做一下记录顺便帮助一下遇到问题的朋友. 做RDLC报 ...

  9. Python学习笔记8-类的继承 、深度优先、广度优先

    Python 类声明 语法: class 类名: 类体 例: #--encoding:utf-8-- # class AddressBookEntity: myVersion=0.1 def __in ...

  10. Spring、Spring事务详解;使用XML配置事务

    @Transactional可以设置以下参数: @Transactional(readOnly=false) // 指定事务是否只读的 true/false @Transactional(rollba ...