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的Django框架中的QuerySets
Apr 20 Python
Python抓取手机号归属地信息示例代码
Nov 28 Python
用Python设计一个经典小游戏
May 15 Python
python发送邮件脚本
May 22 Python
Python数据类型之列表和元组的方法实例详解
Jul 08 Python
python版百度语音识别功能
Jul 09 Python
处理Selenium3+python3定位鼠标悬停才显示的元素
Jul 31 Python
Django+zTree构建组织架构树的方法
Aug 21 Python
Python 函数用法简单示例【定义、参数、返回值、函数嵌套】
Sep 20 Python
Python netmiko模块的使用
Feb 14 Python
django项目中使用云片网发送短信验证码的实现
Jan 19 Python
pycharm配置QtDesigner的超详细方法
Jan 25 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
模仿OSO的论坛(三)
2006/10/09 PHP
PHP中使用php5-ffmpeg撷取视频图片实例
2015/01/07 PHP
thinkPHP5.0框架命名空间详解
2017/03/18 PHP
php学习笔记之字符串常见操作总结
2019/07/16 PHP
php和C#的yield迭代器实现方法对比分析
2019/07/17 PHP
php实现简单四则运算器
2020/11/29 PHP
在JavaScript中获取请求的URL参数[正则]
2010/12/25 Javascript
简单实用jquery版三级联动select示例
2013/07/04 Javascript
Knockout visible绑定使用方法
2013/11/15 Javascript
js实现百度联盟中一款不错的图片切换效果完整实例
2015/03/04 Javascript
jQuery Easyui学习之datagrid 动态添加、移除editor
2016/01/27 Javascript
TinyMCE汉化及本地上传图片功能实例详解
2016/05/31 Javascript
easyui tree带checkbox实现单选的简单实例
2016/11/07 Javascript
javascript数组去重常用方法实例分析
2017/04/11 Javascript
Vue+Element UI+vue-quill-editor富文本编辑器及插入图片自定义
2019/08/20 Javascript
小程序Scroll-view上拉滚动刷新数据
2020/06/21 Javascript
[01:05:00]2018国际邀请赛 表演赛 Pain vs OpenAI
2018/08/24 DOTA
Python解析xml中dom元素的方法
2015/03/12 Python
Python安装使用命令行交互模块pexpect的基础教程
2016/05/12 Python
Python之reload流程实例代码解析
2018/01/29 Python
Python3正则匹配re.split,re.finditer及re.findall函数用法详解
2018/06/11 Python
pyttsx3实现中文文字转语音的方法
2018/12/24 Python
python中hasattr()、getattr()、setattr()函数的使用
2019/08/16 Python
python tornado使用流生成图片的例子
2019/11/18 Python
Python如何使用BeautifulSoup爬取网页信息
2019/11/26 Python
用Python生成HTML表格的方法示例
2020/03/06 Python
Python基于DB-API操作MySQL数据库过程解析
2020/04/23 Python
kmart凯马特官网:美国最大的打折零售商和全球最大的批发商之一
2016/11/17 全球购物
Paradigit比利时电脑卖场:购买笔记本、电脑、平板和外围设备
2016/11/28 全球购物
巴西独家产品和现场演示购物网站:Shoptime
2019/07/11 全球购物
PatPat德国:妈妈的每日优惠
2019/10/02 全球购物
大学生职业生涯设计书
2014/01/02 职场文书
人民调解员培训方案
2014/06/05 职场文书
计算机应用应届生求职信
2014/07/12 职场文书
法院授权委托书范文
2014/08/02 职场文书
安全教育日主题班会
2015/08/13 职场文书