Python中文纠错的简单实现


Posted in Python onJuly 07, 2021

介绍

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

  • 先准备一个文件,里面每一行中放一个中文分词,我这里的文件是下面代码中的 /Users/wys/Desktop/token.txt ,你们可以改成自己,再运行代码
  • 将构建一个前缀树类,实现插入功能,将所有的标准分词都插入到前缀树中,另外实现一个搜索功能,用来搜索分词
  • 将输入的错误分词中的每个字都找出 10 个同音字,将每个字都用 10 个同音字替换,结果可以最多得到 n*10 个分词,n 为分词的长度,因为有的音可能没有 10 个同音字。
  • 将这些分词都经过前缀树的查找,如果能搜到,将其作为正确纠正就过返回

代码

import re,pinyin
from Pinyin2Hanzi import DefaultDagParams
from Pinyin2Hanzi import dag

class 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)
                    break
        return result

class Node:
    def __init__(self):
        self.word = False
        self.child = {}


class Trie(object):
    def __init__(self):
        self.root = Node()

    def insert(self, words):
        for word in words:
            cur = self.root
            for w in word:
                if w not in cur.child:
                    cur.child[w] = Node()
                cur = cur.child[w]

            cur.word = True

    def search(self, word):
        cur = self.root
        for w in word:
            if w not in cur.child:
                return False
            cur = cur.child[w]

        if cur.word == False:
            return False
        return True

if __name__ == '__main__':
    # 初始化纠正器
    c = corrector()
    # 获得单词
    words = c.getData()
    # 初始化前缀树
    Tree = Trie()
    # 将所有的单词都插入到前缀树中
    Tree.insert(words)
    # 测试
    print(c.getCorrection(['专塘街道','转塘姐道','转塘街到']))

结果

打印结果为:
['转塘街道', '转塘街道', '转塘街道']

可以看出都纠正成功了,有一定的效果 ,之后会继续优化。

到此这篇关于Python中文纠错的简单实现的文章就介绍到这了,更多相关Python中文纠错内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python随机生成指定长度密码的方法
Apr 04 Python
Python全局变量操作详解
Apr 14 Python
在Django的视图中使用数据库查询的方法
Jul 16 Python
关于python下cv.waitKey无响应的原因及解决方法
Jan 10 Python
django模板加载静态文件的方法步骤
Mar 01 Python
PyQt4实时显示文本内容GUI的示例
Jun 14 Python
Python参数类型以及常见的坑详解
Jul 08 Python
python脚本之一键移动自定格式文件方法实例
Sep 02 Python
150行python代码实现贪吃蛇游戏
Apr 24 Python
keras处理欠拟合和过拟合的实例讲解
May 25 Python
为什么相对PHP黑python的更少
Jun 21 Python
Python读取文件夹下的所有文件实例代码
Apr 02 Python
python树莓派通过队列实现进程交互的程序分析
Python多线程 Queue 模块常见用法
Jul 04 #Python
python 中yaml文件用法大全
Jul 04 #Python
python3实现常见的排序算法(示例代码)
用Python编写简单的gRPC服务的详细过程
Jul 04 #Python
python中__slots__节约内存的具体做法
Jul 04 #Python
python中Matplotlib绘制直线的实例代码
Jul 04 #Python
You might like
一些php技巧与注意事项分析
2011/02/03 PHP
php4与php5的区别小结(配置异同)
2011/12/20 PHP
微信公众平台消息接口校验与消息接口响应实例
2014/12/23 PHP
PHP正则验证Email的方法
2015/06/15 PHP
PHP实现获取并生成数据库字典的方法
2016/05/04 PHP
避免回车键导致的页面无意义刷新的解决方法
2011/04/12 Javascript
jQuery中阻止冒泡事件的方法介绍
2014/04/12 Javascript
js自动生成的元素与页面原有元素发生堆叠的解决方法
2014/09/04 Javascript
js预加载图片方法汇总
2015/06/15 Javascript
js实现滚动条滚动到页面底部继续加载
2015/12/19 Javascript
浅谈JavaScript前端开发的MVC结构与MVVM结构
2016/06/03 Javascript
AngularJS ng-change 指令的详解及简单实例
2016/07/30 Javascript
JavaScript实现短暂提示框功能
2018/04/04 Javascript
vue基本使用--refs获取组件或元素的实例
2019/11/07 Javascript
Vue中通过vue-router实现命名视图的问题
2020/04/23 Javascript
python去掉字符串中重复字符的方法
2014/02/27 Python
python使用循环实现批量创建文件夹示例
2014/03/25 Python
Python字符串切片操作知识详解
2016/03/28 Python
python实现NB-IoT模块远程控制
2018/06/20 Python
浅谈pyqt5中信号与槽的认识
2019/02/17 Python
Python中使用pypdf2合并、分割、加密pdf文件的代码详解
2019/05/21 Python
python实现车牌识别的示例代码
2019/08/05 Python
python实现监控阿里云账户余额功能
2019/12/16 Python
Python实现计算图像RGB均值方式
2020/06/04 Python
HTML5-WebSocket实现聊天室示例
2016/12/15 HTML / CSS
Stefania Mode英国:奢华设计师和时尚服装
2017/10/23 全球购物
继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么?
2015/11/18 面试题
专业实习自我鉴定
2013/10/29 职场文书
公司周年庆典邀请函
2014/01/12 职场文书
自我鉴定注意事项
2014/01/19 职场文书
《问银河》教学反思
2014/02/19 职场文书
《故乡》教学反思
2014/04/10 职场文书
小学亲子活动总结
2014/07/01 职场文书
村主任群众路线教育实践活动个人对照检查材料思想汇报
2014/10/01 职场文书
习近平在党的群众路线教育实践活动总结大会上的讲话
2014/10/21 职场文书
致运动员的广播稿
2015/08/19 职场文书