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 制作图片转pdf工具
Jan 30 Python
在Python的Django框架中创建和使用模版
Jul 15 Python
Python连接mysql数据库的正确姿势
Feb 03 Python
Python注释详解
Jun 01 Python
sublime text 3配置使用python操作方法
Jun 11 Python
通过pykafka接收Kafka消息队列的方法
Dec 27 Python
opencv实现简单人脸识别
Feb 19 Python
Python实现socket非阻塞通讯功能示例
Nov 06 Python
使用python代码进行身份证号校验的实现示例
Nov 21 Python
Python 可视化神器Plotly详解
Dec 26 Python
Pytest中skip和skipif的具体使用方法
Jun 30 Python
使用Python解决图表与画布的间距问题
Apr 11 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中通过正则表达式下载内容中的远程图片的函数代码
2012/01/10 PHP
PHP获取不了React Native Fecth参数的解决办法
2016/08/26 PHP
php 生成加密公钥加密私钥实例详解
2017/06/16 PHP
PHP实现随机数字、字母的验证码功能
2018/08/01 PHP
PHP与Web页面的交互示例详解二
2020/08/04 PHP
JavaScript浏览器选项卡效果
2010/08/25 Javascript
基于jquery animate操作css样式属性小结
2015/11/27 Javascript
JavaScript实现点击按钮字体放大、缩小
2016/02/29 Javascript
js实现页面跳转的几种方法小结
2016/05/16 Javascript
使用three.js 画渐变的直线
2016/06/05 Javascript
Bootstrap页面布局基础知识全面解析
2016/06/13 Javascript
原生js获取iframe中dom元素--父子页面相互获取对方dom元素的方法
2016/08/05 Javascript
用js控件div的滚动条,让它在内容更新时自动滚到底部的实现方法
2016/10/27 Javascript
Vue.js原理分析之observer模块详解
2017/02/17 Javascript
解决vue多个路由共用一个页面的问题
2018/03/12 Javascript
vue.js响应式原理解析与实现
2020/06/22 Javascript
angularJS1 url中携带参数的获取方法
2018/10/09 Javascript
解决vue elementUI中table里数字、字母、中文混合排序问题
2020/01/07 Javascript
原生js实现简单轮播图
2020/10/26 Javascript
[03:27]《辉夜杯》线下训练营 导师CU和海涛指点迷津
2015/10/23 DOTA
浅谈django开发者模式中的autoreload是如何实现的
2017/08/18 Python
Python爬虫实现百度图片自动下载
2018/02/04 Python
Python编程快速上手——选择性拷贝操作案例分析
2020/02/28 Python
keras做CNN的训练误差loss的下降操作
2020/06/22 Python
python中lower函数实现方法及用法讲解
2020/12/23 Python
is_file和file_exists效率比较
2021/03/14 PHP
廉价航班、机票和酒店:JustFly
2018/02/07 全球购物
美国运动鞋和服装网上商店:YCMC
2018/09/15 全球购物
abstract class和interface有什么区别?
2012/01/03 面试题
写给女朋友的道歉信
2014/01/08 职场文书
低碳环保标语
2014/06/12 职场文书
企业趣味活动方案
2014/08/21 职场文书
银行党的群众路线教育实践活动对照检查材料
2014/09/25 职场文书
总经理岗位职责
2015/02/04 职场文书
2014年度个人工作总结范文
2015/03/09 职场文书
golang实现一个简单的websocket聊天室功能
2021/10/05 Golang