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常用的爬虫技巧总结
Mar 28 Python
JSON Web Tokens的实现原理
Apr 02 Python
python实现kNN算法
Dec 20 Python
使用python编写udp协议的ping程序方法
Apr 22 Python
Atom的python插件和常用插件说明
Jul 08 Python
django解决跨域请求的问题
Nov 11 Python
解决python3 Pycharm上连接数据库时报错的问题
Dec 03 Python
python算法题 链表反转详解
Jul 02 Python
python实现倒计时小工具
Jul 29 Python
Django微信小程序后台开发教程的实现
Jun 03 Python
python判断字符串以什么结尾的实例方法
Sep 18 Python
python机器学习Github已达8.9Kstars模型解释器LIME
Nov 23 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下关于中英数字混排的字符串分割问题
2010/04/06 PHP
PHP几个数学计算的内部函数学习整理
2011/08/06 PHP
PHP静态调用非静态方法的应用分析
2013/05/02 PHP
项目实践之javascript技巧
2007/12/06 Javascript
JavaScript国旗变换效果代码
2008/08/13 Javascript
提高网站信任度的技巧
2008/10/17 Javascript
IE8 下的Js错误HTML Parsing Error...
2009/08/14 Javascript
JavaScript 学习笔记之一jQuery写法图片等比缩放以及预加载
2012/06/28 Javascript
node.js中的定时器nextTick()和setImmediate()区别分析
2014/11/26 Javascript
jQuery实现图像旋转动画效果
2016/05/29 Javascript
再次谈论Javascript中的this
2016/06/23 Javascript
使用BootStrap实现悬浮窗口的效果
2016/12/13 Javascript
node.js平台下的mysql数据库配置及连接
2017/03/31 Javascript
BootStrap实现文件上传并带有进度条效果
2017/09/11 Javascript
jQuery实现ajax回调函数带入参数的方法示例
2018/06/26 jQuery
解决vue单页路由跳转后scrollTop的问题
2018/09/03 Javascript
vue + element-ui的分页问题实现
2018/12/17 Javascript
五分钟搞懂Vuex实用知识(小结)
2019/08/12 Javascript
javascript解析json格式的数据方法详解
2020/08/07 Javascript
Python的Flask框架中集成CKeditor富文本编辑器的教程
2016/06/13 Python
Python正则表达式如何进行字符串替换实例
2016/12/28 Python
详解Python中的相对导入和绝对导入
2017/01/06 Python
Python中的单继承与多继承实例分析
2018/05/10 Python
Python绘制的二项分布概率图示例
2018/08/22 Python
django 通过url实现简单的权限控制的例子
2019/08/16 Python
django自带serializers序列化返回指定字段的方法
2019/08/21 Python
python连接手机自动搜集蚂蚁森林能量的实现代码
2021/02/24 Python
销售找工作求职信
2013/12/20 职场文书
校园餐饮创业计划书
2014/01/10 职场文书
大学生暑期社会实践证明范本
2014/10/24 职场文书
党的群众路线教育实践活动总结大会主持词
2014/10/30 职场文书
2015年财务部年度工作总结
2015/05/19 职场文书
入党介绍人考察意见
2015/06/01 职场文书
新闻稿标题
2015/07/18 职场文书
2019个人工作自我评价范文(3篇)
2019/09/19 职场文书
Nginx中break与last的区别详析
2021/03/31 Servers