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的装饰器的运用
May 05 Python
Python两个内置函数 locals 和globals(学习笔记)
Aug 28 Python
python 中random模块的常用方法总结
Jul 08 Python
Python随机函数random()使用方法小结
Apr 29 Python
pyqt5 实现工具栏文字图片同时显示
Jun 13 Python
python 杀死自身进程的实现方法
Jul 01 Python
python读写csv文件方法详细总结
Jul 05 Python
用python3读取python2的pickle数据方式
Dec 25 Python
解决keras模型保存h5文件提示无此目录问题
Jul 01 Python
opencv+pyQt5实现图片阈值编辑器/寻色块阈值利器
Nov 13 Python
Python并发编程实例教程之线程的玩法
Jun 20 Python
Python实现视频自动打码的示例代码
Apr 08 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判断网络文件是否存在的方法
2015/03/12 PHP
PHP实现163邮箱自动发送邮件
2016/03/29 PHP
PHP通过引用传递参数用法分析
2016/12/01 PHP
PHP搭建大文件切割分块上传功能示例
2017/01/04 PHP
ThinkPHP实现简单登陆功能
2017/04/28 PHP
实现复选框全选/全不选切换
2006/12/23 Javascript
javascript 定义初始化数组函数
2009/09/07 Javascript
ExtJs使用总结(非常详细)
2012/03/22 Javascript
JavaScript中setAttribute用法介绍
2013/07/20 Javascript
Node.js安装教程和NPM包管理器使用详解
2014/08/16 Javascript
jQuery实现的网格线绘制方法
2016/06/20 Javascript
Javascript获取随机数的实现方法
2016/06/22 Javascript
jQuery stop()用法实例详解
2016/07/28 Javascript
nodejs和C语言插入mysql数据库乱码问题的解决方法
2017/04/14 NodeJs
Angular 容器部署的方法
2018/04/17 Javascript
React Native基础入门之初步使用Flexbox布局
2018/07/02 Javascript
jQuery+Datatables实现表格批量删除功能【推荐】
2018/10/24 jQuery
[02:53]2018年度DOTA2最佳战队-完美盛典
2018/12/17 DOTA
[01:02:04]EG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
Eclipse和PyDev搭建完美Python开发环境教程(Windows篇)
2016/11/16 Python
带你了解python装饰器
2017/06/15 Python
Python操作MongoDB数据库的方法示例
2018/01/04 Python
详解python使用Nginx和uWSGI来运行Python应用
2018/01/09 Python
python实现日常记账本小程序
2018/03/10 Python
5款Python程序员高频使用开发工具推荐
2019/04/10 Python
keras实现多种分类网络的方式
2020/06/11 Python
美国围栏公司:Walpole Outdoors
2019/11/19 全球购物
软件缺陷的分类都有哪些
2014/08/22 面试题
军校制空专业毕业生自我鉴定
2013/11/16 职场文书
大学专科自荐信
2014/06/17 职场文书
传承焦裕禄精神思想汇报2014
2014/09/10 职场文书
服务员岗位职责范本
2015/04/09 职场文书
事业单位工作人员2015年度思想工作总结
2015/10/15 职场文书
优质服务心得体会(共4篇)
2016/01/22 职场文书
MySQL库表太大怎么办? 数据库分库分表项目实践
2022/04/11 MySQL
TaiShan 200服务器安装Ubuntu 18.04的图文教程
2022/06/28 Servers