编辑距离(Minimum Edit Distance)
编辑距离(Minimum Edit Distance,MED),也叫 Levenshtein Distance。他的含义是计算字符串a转换为字符串b的最少单字符编辑次数。编辑操作有:插入、删除、替换(都是对a进行的变换)。用lev(i, j) 表示 a的前i个单词和 b的前j个单词的最短编辑距离(即从后往前)。可以分为以下几种情况:
i == 0
或j == 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(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)的更多相关文章
- Minimum edit distance(levenshtein distance)(最小编辑距离)初探
最小编辑距离的定义:编辑距离(Edit Distance),又称Levenshtein距离.是指两个字串之间,由一个转成还有一个所需的最少编辑操作次数.许可的编辑操作包含将一个字符替换成还有一个字符. ...
- Leetcode之动态规划(DP)专题-72. 编辑距离(Edit Distance)
Leetcode之动态规划(DP)专题-72. 编辑距离(Edit Distance) 给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 . 你可 ...
- 字符串编辑距离(Edit Distance)
一.问题描述定义字符串编辑距离(Edit Distance),是俄罗斯科学家 Vladimir Levenshtein 在 1965 年提出的概念,又称 Levenshtein 距离,是指两个字符串之 ...
- stanford NLP学习笔记3:最小编辑距离(Minimum Edit Distance)
I. 最小编辑距离的定义 最小编辑距离旨在定义两个字符串之间的相似度(word similarity).定义相似度可以用于拼写纠错,计算生物学上的序列比对,机器翻译,信息提取,语音识别等. 编辑距离就 ...
- 动态规划 求解 Minimum Edit Distance
http://blog.csdn.net/abcjennifer/article/details/7735272 自然语言处理(NLP)中,有一个基本问题就是求两个字符串的minimal Edit D ...
- [Swift]LeetCode161. 一次编辑距离 $ One Edit Distance
Given two strings S and T, determine if they are both one edit distance apart. 给定两个字符串S和T,确定它们是否都是是一 ...
- 编辑距离——Edit Distance
编辑距离 在计算机科学中,编辑距离是一种量化两个字符串差异程度的方法,也就是计算从一个字符串转换成另外一个字符串所需要的最少操作步骤.不同的编辑距离中定义了不同操作的集合.比较常用的莱温斯坦距离(Le ...
- Min Edit Distance
Min Edit Distance ----两字符串之间的最小距离 PPT原稿参见Stanford:http://www.stanford.edu/class/cs124/lec/med.pdf Ti ...
- LeetCode(72) Edit Distance
题目 Given two words word1 and word2, find the minimum number of steps required to convert word1 to wo ...
随机推荐
- Word 分页符怎么使用
当一页内容输入完之后,还留有很多空白区域没有填写,一直按回车键跳转到下一页显得复杂,并且回车键经过的地方都是段落. 可以手动添加分页符,使当前页跳转到下一页. 也可以使用快捷键Ctrl + Enter ...
- 修改窗体的Title
直接上代码 /// <summary> /// 获取窗体的名称 /// </summary> /// <param name="hWnd">&l ...
- KingbaseESV8R6 垃圾回收原理以及如何预防膨胀
背景 KingbaseESV8R6支持snapshot too old 那么实际工作中,经常看到表又膨胀了,那么我们讨论一下导致对象膨胀的常见原因有哪些呢? 未开启autovacuum 对于未开启au ...
- C#,使用NPOI,导出excel文件
/// <summary> /// 导出excel文件 /// </summary> /// <param name="dt">Table表数据 ...
- 【项目实战】kaggle产品分类挑战
多分类特征的学习 这里还是b站刘二大人的视频课代码,视频链接:https://www.bilibili.com/video/BV1Y7411d7Ys?p=9 相关注释已经标明了(就当是笔记),因此在这 ...
- k8s中安装rabbitmq集群
官方文档地址:https://www.rabbitmq.com/kubernetes/operator/quickstart-operator.html 要求 1.k8s版本要1.18及其以上 2.能 ...
- MHA架构的实现方式
转载自:https://www.linuxprobe.com/centos7-mha-mysql5.html 安装mysql5.7,并配置好主从复制 第一:安装mysql57,并关闭防火墙 yum i ...
- PostgreSQL 创建表格
PostgreSQL 使用 CREATE TABLE 语句来创建数据库表格. 语法 CREATE TABLE 语法格式如下: CREATE TABLE table_name( column1 data ...
- vscode展示子文件夹
取消勾选设置-功能-compact Folders
- [基础]VS Code 基础操作 命令符
一.五种运行方式 1.点击IIS Express运行 实际上它开的是一个IIS Express服务器,就是说有一个小的代理服务器帮咱们运行,运行后就会启动一个IIS Express小型服务器,启动之后 ...