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 14 Python
Python中利用sqrt()方法进行平方根计算的教程
May 15 Python
python中字符串类型json操作的注意事项
May 02 Python
Python2/3中urllib库的一些常见用法
Dec 19 Python
tensorflow中next_batch的具体使用
Feb 02 Python
Python基于WordCloud制作词云图
Nov 29 Python
python3 求约数的实例
Dec 05 Python
Django通用类视图实现忘记密码重置密码功能示例
Dec 17 Python
python实现简单的购物程序代码实例
Mar 03 Python
使用Keras实现Tensor的相乘和相加代码
Jun 18 Python
python 可视化库PyG2Plot的使用
Jan 21 Python
python实现简单石头剪刀布游戏
Oct 24 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程序
2006/10/09 PHP
解析mysql 表中的碎片产生原因以及清理
2013/06/22 PHP
php中mail函数发送邮件失败的解决方法
2014/12/24 PHP
PHP用正则匹配form表单中所有元素的类型和属性值实例代码
2017/02/28 PHP
javascript读取xml
2006/11/04 Javascript
jQuery Ajax之$.get()方法和$.post()方法
2009/10/12 Javascript
JavaScript 学习笔记(十一)
2010/01/19 Javascript
有关JavaScript的10个怪癖和秘密分享
2011/08/28 Javascript
Tab页界面 用jQuery及Ajax技术实现(php后台)
2011/10/12 Javascript
JQuery入门——用one()方法绑定事件处理函数(仅触发一次)
2013/02/05 Javascript
JavaScript实现判断图片是否加载完成的3种方法整理
2015/03/13 Javascript
javascript动画算法实例分析
2015/07/31 Javascript
深入学习JavaScript的AngularJS框架中指令的使用方法
2016/03/05 Javascript
JavaScript数组的栈方法与队列方法详解
2016/05/26 Javascript
js实现带缓动动画的导航栏效果
2017/01/16 Javascript
Vue.js原理分析之observer模块详解
2017/02/17 Javascript
小发现之浅谈location.search与location.hash的问题
2017/06/23 Javascript
使用原生js+canvas实现模拟心电图的实例
2017/09/20 Javascript
vue.js  父向子组件传参的实例代码
2017/10/29 Javascript
vue项目中axios使用详解
2018/02/07 Javascript
JS正则表达式封装与使用操作示例
2019/05/15 Javascript
JavaScript中的Proxy对象
2020/11/27 Javascript
详细介绍Python中的偏函数
2015/04/27 Python
TensorFlow实现Batch Normalization
2018/03/08 Python
python实现图片识别汽车功能
2018/11/30 Python
Python将列表数据写入文件(txt, csv,excel)
2019/04/03 Python
python实现低通滤波器代码
2020/02/26 Python
python的json包位置及用法总结
2020/06/21 Python
Python之多进程与多线程的使用
2021/02/23 Python
巴西图书和电子产品购物网站:Saraiva
2017/06/07 全球购物
高考备战决心书
2014/03/11 职场文书
保护环境的建议书
2014/03/12 职场文书
介绍信样本
2015/01/31 职场文书
公司市场部岗位职责
2015/04/15 职场文书
实施意见格式范本
2015/06/05 职场文书
vue中三级导航的菜单权限控制
2021/03/31 Vue.js