编辑距离(Minimum Edit Distance,MED),也叫 Levenshtein Distance。他的含义是计算字符串a转换为字符串b的最少单字符编辑次数。编辑操作有:插入、删除、替换(都是对a进行的变换)。用lev(i, j) 表示 a的前i个单词和 b的前j个单词的最短编辑距离(即从后往前)。可以分为以下几种情况:

  • i == 0j == 0

    • \(lev(i, j) = max(i, j)\)
  • i,j 不为0, 且 \(a[i] == a[j]\)
    • \(lev(i, j) = lev(i-1, j-1)\)
  • i,j 不为0, 且 \(a[i] != a[j]\)
    • 插入: \(lev(i, j-1)\)
    • 删除: \(lev(i-1, j)\)
    • 替换: \(lev(i-1, j-1) + 1\)
    • 三者取最小

这里的插入是在 a[i] 后方插入,这样,b[j] 已经和 a[i] 后方的元素匹配,所以j前移;删除表示删除当前元素,a[i] 前面的元素顶上来,所以i前移,但是顶上来的元素不一定和j匹配,所以j不动。

C++ 实现

解法就是动态规划:

class Solution {
public:
vector<vector<int>> matrix;
int editDistance(string str1, string str2) {
int len1 = str1.size();
int len2 = str2.size(); matrix = vector<vector<int>>(len1 + 1, vector<int>(len2 + 1, 0)); for (int i = 0; i <= len1; ++i)
matrix[i][0] = i; for (int j = 1; j <= len2; ++j)
matrix[0][j] = j; for (int i = 1; i <= len1; ++i) {
for (int j = 1; j <= len2; ++j) {
if (str1[i] == str2[j]) matrix[i][j] = matrix[i - 1][j - 1]; // 最后一个字母相同
else {
int insert = matrix[i][j - 1] + 1; // 插入
int del = matrix[i - 1][j] + 1; // 删除
int replace = matrix[i - 1][j - 1] + 1; // 替换
matrix[i][j] = min(insert, min(del, replace));
}
}
}
return matrix[len1][len2];
}
};

python-Levenshtein 库

pip install python-Levenshtein

import Levenshtein
print(Levenshtein.distance("the","teh"))

单词纠错

前几天看到一个很有意思的代码,通过统计的方式,计算最后可能的单词。w是输入单词,c是可能的正确单词。根据贝叶斯,按照惯例忽略分母。

\[p(c | w)=\frac{p(c) * p(w | c)}{p(w)}
\]
  • \(p(w|c)\) : 计算通过w所有编辑距离为i的所有正确单词(就是c),i越小表示p越大
  • \(p(c)\) : 在上面的c中,找出频率最高的单词
import re
from collections import Counter def words(text): return re.findall(r'\w+', text.lower()) WORDS = Counter(words(open('big.txt').read())) def P(word, N=sum(WORDS.values())):
# 返回单词的概率
return WORDS[word] / N def correction(word):
# 找到频率最高的c
return max(candidates(word), key=P) def candidates(word):
'''
找到候选单词c
'''
return (known([word]) or known(edits1(word)) or known(edits2(word)) or [word]) def known(words):
# 返回 words 和 WORDS的交集. 找出正确单词
return set(w for w in words if w in WORDS) def edits1(word):
# 编辑距离为1的所有单词
"All edits that are one edit away from `word`."
letters = 'abcdefghijklmnopqrstuvwxyz'
splits = [(word[:i], word[i:]) for i in range(len(word) + 1)]
deletes = [L + R[1:] for L, R in splits if R]
transposes = [L + R[1] + R[0] + R[2:] for L, R in splits if len(R)>1]
replaces = [L + c + R[1:] for L, R in splits if R for c in letters]
inserts = [L + c + R for L, R in splits for c in letters]
return set(deletes + transposes + replaces + inserts) def edits2(word):
# 编辑距离为2的所有单词
return (e2 for e1 in edits1(word) for e2 in edits1(e1))

在python中 list1 or list2 的含义是:

  • 如果list1不为空,那么返回list1
  • 如果list1为空,那么返回list2

所以这行代码的意思是:

return (known([word]) or known(edits1(word)) or known(edits2(word)) or [word])
  • 如果单词是正确的就直接返回
  • 如果但是错的,就返回编辑距离是1的所有正确单词作为候选词
  • 如果编辑距离是1的正确单词没有,就返回编辑距离是2的所有正确单词作为候选词
  • 如果还是为空,就返回他自己

编辑距离(Minimum Edit Distance)的更多相关文章

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

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

  2. Leetcode之动态规划(DP)专题-72. 编辑距离(Edit Distance)

    Leetcode之动态规划(DP)专题-72. 编辑距离(Edit Distance) 给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 . 你可 ...

  3. 字符串编辑距离(Edit Distance)

    一.问题描述定义字符串编辑距离(Edit Distance),是俄罗斯科学家 Vladimir Levenshtein 在 1965 年提出的概念,又称 Levenshtein 距离,是指两个字符串之 ...

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

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

  5. 动态规划 求解 Minimum Edit Distance

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

  6. [Swift]LeetCode161. 一次编辑距离 $ One Edit Distance

    Given two strings S and T, determine if they are both one edit distance apart. 给定两个字符串S和T,确定它们是否都是是一 ...

  7. 编辑距离——Edit Distance

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

  8. Min Edit Distance

    Min Edit Distance ----两字符串之间的最小距离 PPT原稿参见Stanford:http://www.stanford.edu/class/cs124/lec/med.pdf Ti ...

  9. LeetCode(72) Edit Distance

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

随机推荐

  1. Apple Music 免费试用 2 个月

    下载地址:https://redeem.apple.com/am-genshin-impact-2mo-zh-cn?origin=&locale=zh-CN 使用指南 打开链接,点击" ...

  2. 从零开始搭建react基础开发环境(基于webpack5)

    前言 最近利用闲暇时间把webpack系统的学习了下,搭建出一个react环境的脚手架,写篇文章总结一下,帮助正在学习webpack小伙伴们,如有写的不对的地方或还有可以优化的地方,望大佬们指出,及时 ...

  3. DataGridView控件绑定数据之后,置顶操作

    一个小小的置顶,就搞了半个小时,还是记录一下吧. 1.第一个问题就是datatable的插入只能是Insert DataRow,但是获取选中的行,都是DataGridViewRow,不能直接转换. 找 ...

  4. 微软出品自动化神器Playwright,不用写一行代码(Playwright+Java)系列(一) 之 环境搭建及脚本录制

    一.前言 半年前,偶然在视频号刷到某机构正在直播讲解Playwright框架的使用,就看了一会,感觉还不错,便被种草,就想着自己有时间也可以自己学一下,这一想着就半年多过去了. 读到这,你可能就去百度 ...

  5. 利用京东云Web应用防火墙实现Web入侵防护

    摘 要 本指南描述如何利用京东云Web应用防火墙(简称WAF),对一个简单的网站(无论运行在京东云.其它公有云或者IDC)进行Web完全防护的全过程.该指南包括如下内容: 1 准备环境 1.1 在京东 ...

  6. Windows LDAP加固之LDAP over SSL和通道绑定

    很多网络通信都可以用SSL来加密的,LDAP也不列外,同样可以用SSL加密. LDAPS使用的证书必须满足以下几个条件: 1.证书的增强性密钥用法中必须有服务器身份验证Server Authentic ...

  7. kubeadm join 命令执行流程

  8. flannel跨主网络通信方案(UDP、VXLAN、HOST-GW)详解

  9. 在 Traefik 中使用 Kubernetes Gateway API

    文章转载自:https://mp.weixin.qq.com/s/QYy8ETBB-xqU0IMI7YuTWw Gateway API(之前叫 Service API)是由 SIG-NETWORK 社 ...

  10. 使用KubeOperator扩展k8s集群的worker节点

    官方文档网址:https://kubeoperator.io/docs/installation/install/ 背景说明 原先是一个三节点的k8s集群,一个master,三个woker(maste ...