拼写纠错
拼写纠错步骤主要检查并改正两类文本错误,即单词的拼写错误(书写错误)和单词的语法使用错误。拼写错误纠正,首先检测词库外的单词识别为拼写错误单词,然后找出词库中与错误单词编辑距离最小的词作为改正项,替换它。而语法使用错误纠正,需借助语言模型实现。
1.1 单词拼写错误纠正实现
1.1.1 单词拼写错误纠正的原理性方法
编辑距离计算法方法:
import sys
from collections import defaultdict
class StrEditDistance():
"""
计算两英文字符串的编辑距离
"""
# 初始化
def __init__(self, edit_costs={'insert':1, 'delete':1, 'replace':1}):
self.str1 = ''
self.str2 = ''
self.c_dic = defaultdict(int) # 这是最稳定的DP结果记录数据结构
self._edit_costs = edit_costs
# 动态规划核心程序
def editCostFun(self, i, j):
# 判断是否已计算过
if self.c_dic[str(i)+','+str(j)] == -1:
# 基础条件
if i*j==0 and i+j==0:
self.c_dic[str(i)+','+str(j)] = 0
elif i*j==0 and i+j>0:
self.c_dic[str(i)+','+str(j)] = sys.maxsize
# 循环条件
else:
if self.str1[:i]==self.str2[:j]:
self.c_dic[str(i)+','+str(j)] = 0
else:
self.c_dic[str(i)+','+str(j)] = min([
self._edit_costs['insert'] + self.editCostFun(i, j-1),
self._edit_costs['insert'] + self.editCostFun(i-1, j),
self._edit_costs['insert'] + self.editCostFun(i-1, j-1)
])
return self.c_dic[str(i)+','+str(j)]
# 动规结果应用外壳
def transform(self, str1, str2):
# 初始化
self.str1 = str1
self.str2 = str2
m = len(self.str1)
n = len(self.str2)
for i in range(m+1):
for j in range(n+1):
self.c_dic[str(i)+','+str(j)] = -1 # 数值极小时容易出现内存溢出,导致数值出现错误
#
return self.editCostFun(m, n)
#
sed = StrEditDistance()
sed.transform('app', 'apple')
1.1.2 单词拼写错误纠正的工程实现方法
与给定字符串指定编辑距离的新字符串生成代码:
# 与给定字符串指定编辑距离的新字符串生成方法
def gen_editOne_str(str_: str):
"""
生成所有与给定字符串,编辑距离为1的字符串
"""
letters = 'abcdefghijklmnopqrstuvwxyz'
splits = [(str_[:i], str_[i:]) for i in range(len(str_)+1)]
inserts = [L+c+R for L,R in splits for c in letters]
deletes = [L+R[1:] for L,R in splits]
replaces = [L+c+R[1:] for L,R in splits for c in letters]
return set(inserts + deletes + replaces)
def gen_editTwo_str(str_: str):
"""
生成所有与给定字符串,编辑距离为2的字符串
"""
return {edTwo_str for edOne_str in gen_editOne_str(str_) for edTwo_str in gen_editOne_str(edOne_str)}