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列表append和+的区别浅析
Feb 02 Python
Python实现优先级队列结构的方法详解
Jun 02 Python
Python极简代码实现杨辉三角示例代码
Nov 15 Python
教大家玩转Python字符串处理的七种技巧
Mar 31 Python
python 文件操作删除某行的实例
Sep 04 Python
Django 根据数据模型models创建数据表的实例
May 27 Python
修复 Django migration 时遇到的问题解决
Jun 14 Python
将string类型的数据类型转换为spark rdd时报错的解决方法
Feb 18 Python
浅析python的Lambda表达式
Feb 27 Python
pycharm设置鼠标悬停查看方法设置
Jul 29 Python
python爬虫使用requests发送post请求示例详解
Aug 05 Python
Python常用base64 md5 aes des crc32加密解密方法汇总
Nov 06 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
不支持fsockopen但支持culr环境下下ucenter与modoer通讯问题
2011/08/12 PHP
微信扫描二维码登录网站代码示例
2013/12/30 PHP
PHP中使用CURL获取页面title例子
2015/01/07 PHP
php关闭warning问题的解决方法
2016/05/17 PHP
实例讲解YII2中多表关联的使用方法
2017/07/21 PHP
超级酷和最实用的jQuery实例收集(20个)
2010/04/21 Javascript
js类型检查实现代码
2010/10/29 Javascript
jquery左右滚动焦点图banner图片鼠标经过显示上下页按钮
2013/10/11 Javascript
jquery ztree实现树的搜索功能
2016/02/25 Javascript
js 获取范围内的随机数实例代码
2016/08/02 Javascript
关于js原型的面试题讲解
2016/09/25 Javascript
AngularJS入门示例之Hello World详解
2017/01/04 Javascript
原生js实现倒计时--2018
2017/02/21 Javascript
详解nodejs通过代理(proxy)发送http请求(request)
2017/09/22 NodeJs
css和js实现弹出登录居中界面完整代码
2017/11/26 Javascript
详解node.js 下载图片的 2 种方式
2018/03/02 Javascript
vue 本地服务不能被外部IP访问的完美解决方法
2018/10/29 Javascript
vue中beforeRouteLeave实现页面回退不刷新的示例代码
2019/11/01 Javascript
vue中实现高德定位功能
2019/12/03 Javascript
js实现QQ邮箱邮件拖拽删除功能
2020/08/27 Javascript
Openlayers绘制地图标注
2020/09/28 Javascript
antd Select下拉菜单动态添加option里的内容操作
2020/11/02 Javascript
在nuxt中使用路由重定向的实例
2020/11/06 Javascript
关于小程序优化的一些建议(小结)
2020/12/10 Javascript
python类定义的讲解
2013/11/01 Python
python3.3实现乘法表示例
2014/02/07 Python
Python爬虫实现百度翻译功能过程详解
2020/05/29 Python
Python批量修改xml的坐标值全部转为整数的实例代码
2020/11/26 Python
英国日常交易网站:Wowcher
2018/09/04 全球购物
Myprotein丹麦官网:欧洲第一运动营养品牌
2019/04/15 全球购物
AJAX的全称是什么
2012/11/06 面试题
车间副主任岗位职责
2013/12/24 职场文书
学习决心书
2014/03/11 职场文书
县委常委班子专题民主生活会查摆问题及整改措施
2014/09/27 职场文书
纪检监察立案决定书
2015/06/24 职场文书
遇事可以测出您的见识与格局
2019/09/16 职场文书