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实现将DOC文档转换为PDF的方法
Jul 25 Python
单利模式及python实现方式详解
Mar 20 Python
Python2和Python3中urllib库中urlencode的使用注意事项
Nov 26 Python
Django如何自定义model创建数据库索引的顺序
Jun 20 Python
python动态进度条的实现代码
Jul 03 Python
django-filter和普通查询的例子
Aug 12 Python
Python和Anaconda和Pycharm安装教程图文详解
Feb 04 Python
python实现PCA降维的示例详解
Feb 24 Python
python微信公众号开发简单流程实现
Mar 09 Python
简单了解Java Netty Reactor三种线程模型
Apr 26 Python
Python pysnmp使用方法及代码实例
Aug 24 Python
Python 多线程之threading 模块的使用
Apr 14 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
dedecms模板标签代码官方参考
2007/03/17 PHP
php 中的4种标记风格介绍
2012/05/10 PHP
php实现天干地支计算器示例
2014/03/14 PHP
php中get_object_vars()方法用法实例
2015/02/08 PHP
PHP实现通过get方式识别用户发送邮件的方法
2015/07/16 PHP
静态图片的十一种滤镜效果--不支持Ie7及非IE浏览器。
2007/03/06 Javascript
实现png图片和png背景透明(支持多浏览器)的方法
2009/09/08 Javascript
前端开发过程中浏览器版本的两种判定方法
2013/10/30 Javascript
JavaScript制作的可折叠弹出式菜单示例
2014/04/04 Javascript
jquery分割字符串的方法
2015/06/24 Javascript
JavaScript算法系列之快速排序(Quicksort)算法实例详解
2016/09/04 Javascript
Bootstrap CSS组件之面包屑导航(breadcrumb)
2016/12/17 Javascript
利用Decorator如何控制Koa路由详解
2018/06/26 Javascript
微信小程序发送短信验证码完整实例
2019/01/07 Javascript
jquery插件实现轮播图效果
2020/10/19 jQuery
如何利用vue实现波谱拟合详解
2020/11/05 Javascript
再也不怕 JavaScript 报错了,怎么看怎么处理都在这儿
2020/12/09 Javascript
Python对两个有序列表进行合并和排序的例子
2014/06/13 Python
在Python中使用Neo4j数据库的教程
2015/04/16 Python
总结Python编程中三条常用的技巧
2015/05/11 Python
python编写Logistic逻辑回归
2020/12/30 Python
Python编写一个优美的下载器
2018/04/15 Python
基于wxPython的GUI实现输入对话框(2)
2019/02/27 Python
opencv3/C++ 平面对象识别&透视变换方式
2019/12/11 Python
python requests模拟登陆github的实现方法
2019/12/26 Python
Python Django form 组件动态从数据库取choices数据实例
2020/05/19 Python
python 批量将中文名转换为拼音
2021/02/07 Python
CSS3制作炫酷带方向感应的鼠标滑过图片3D动画
2016/03/16 HTML / CSS
美国领先的汽车轮胎和轮毂供应商:TireBuyer
2016/07/21 全球购物
如何用Python来进行查询和替换一个文本字符串
2014/01/02 面试题
应届生船舶驾驶求职信
2013/10/19 职场文书
公司应聘求职信
2014/06/21 职场文书
2014年档案管理工作总结
2014/11/17 职场文书
2019最新版试用期劳动合同模板!
2019/07/04 职场文书
手残删除python之后的补救方法
2021/06/26 Python
SQL Server 忘记密码以及重新添加新账号
2022/04/26 SQL Server