文本预处理:拼写纠错

拼写纠错

拼写纠错步骤主要检查并改正两类文本错误,即单词的拼写错误(书写错误)和单词的语法使用错误。拼写错误纠正,首先检测词库外的单词识别为拼写错误单词,然后找出词库中与错误单词编辑距离最小的词作为改正项,替换它。而语法使用错误纠正,需借助语言模型实现。

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)}
		
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值