Python中文纠错的简单实现

介绍
这篇文章主要是用 Python 实现了简单的中文分词的同音字纠错,目前的案例中只允许错一个字,自己如果有兴趣可以继续优化下去。具体步骤如下所示:

  • 先准备一个文件,里面每一行中放一个中文分词,我这里的文件是下面代码中的 /Users/wys/Desktop/token.txt ,你们可以改成自己,再运行代码
  • 将构建一个前缀树类,实现插入功能,将所有的标准分词都插入到前缀树中,另外实现一个搜索功能,用来搜索分词
  • 将输入的错误分词中的每个字都找出 10 个同音字,将每个字都用 10 个同音字替换,结果可以最多得到 n*10 个分词,n 为分词的长度,因为有的音可能没有 10 个同音字。
  • 将这些分词都经过前缀树的查找,如果能搜到,将其作为正确纠正就过返回
代码
import re,pinyinfrom Pinyin2Hanzi import DefaultDagParamsfrom Pinyin2Hanzi import dagclass corrector():def __init__(self):self.re_compile = re.compile(r'[\u4e00-\u9fff]')self.DAG = DefaultDagParams()# 将文件中的词读取def getData(self):words = []with open("/Users/wys/Desktop/token.txt") as f:for line in f.readlines():word = line.split(" ")[0]if word and len(word) > 2:res = self.re_compile.findall(word)if len(res) == len(word): ## 保证都是汉字组成的分词words.append(word)return words# 将每个拼音转换成同音的 10 个候选汉字,def pinyin_2_hanzi(self, pinyinList):result = []words = dag(self.DAG, pinyinList, path_num=10)for item in words:res = item.path# 转换结果result.append(res[0])return result# 获得词经过转换的候选结结果def getCandidates(self, phrase):chars = {}for c in phrase:chars[c] = self.pinyin_2_hanzi(pinyin.get(c, format='strip', delimiter=',').split(','))replaces = []for c in phrase:for x in chars[c]:replaces.append(phrase.replace(c, x))return set(replaces)# 获得纠错之后的正确结果def getCorrection(self, words):result = []for word in words:for word in self.getCandidates(word):if Tree.search(word):result.append(word)breakreturn resultclass Node:def __init__(self):self.word = Falseself.child = {}class Trie(object):def __init__(self):self.root = Node()def insert(self, words):for word in words:cur = self.rootfor w in word:if w not in cur.child:cur.child[w] = Node()cur = cur.child[w]cur.word = Truedef search(self, word):cur = self.rootfor w in word:if w not in cur.child:return Falsecur = cur.child[w]if cur.word == False:return Falsereturn Trueif __name__ == '__main__':# 初始化纠正器c = corrector()# 获得单词words = c.getData()# 初始化前缀树Tree = Trie()# 将所有的单词都插入到前缀树中Tree.insert(words)# 测试print(c.getCorrection(['专塘街道','转塘姐道','转塘街到']))

【Python中文纠错的简单实现】结果

打印结果为:
['转塘街道', '转塘街道', '转塘街道']
可以看出都纠正成功了,有一定的效果 ,之后会继续优化。
到此这篇关于Python中文纠错的简单实现的文章就介绍到这了,更多相关Python中文纠错内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    推荐阅读