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查看zip包中文件及大小的方法
Jul 09 Python
Python多线程编程之多线程加锁操作示例
Sep 06 Python
详解Python Matplot中文显示完美解决方案
Mar 07 Python
django-初始配置(纯手写)详解
Jul 30 Python
python 字符串常用方法汇总详解
Sep 16 Python
Django实现WebSSH操作物理机或虚拟机的方法
Nov 06 Python
python3 简单实现组合设计模式
Jul 02 Python
Python实现数字的格式化输出
Aug 01 Python
python使用yaml 管理selenium元素的示例
Dec 01 Python
python 指定源路径来解决import问题的操作
Mar 04 Python
Python一行代码实现自动发邮件功能
May 30 Python
Django+Nginx+uWSGI 定时任务的实现方法
Jan 22 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/02/23 PHP
destoon之一键登录设置
2014/06/21 PHP
初探jquery——表单应用范例
2007/02/20 Javascript
客户端限制只能上传jpg格式图片的js代码
2010/12/09 Javascript
js保留两位小数使用toFixed实现
2013/07/29 Javascript
javascript动态向网页中添加表格实现代码
2014/02/19 Javascript
javascript写的一个模拟阅读小说的程序
2014/04/04 Javascript
jquery简单实现图片切换效果的方法
2015/05/12 Javascript
js实现大转盘抽奖游戏实例
2015/06/24 Javascript
jquery获取img的src值的简单实例
2016/05/17 Javascript
基于JavaScript定位当前的地理位置
2017/04/11 Javascript
Servlet3.0与纯javascript通过Ajax交互的实例详解
2018/03/18 Javascript
在vue-cli的组件模板里使用font-awesome的两种方法
2018/09/28 Javascript
Javascript 实现 Excel 导入生成图表功能
2018/10/22 Javascript
JavaScript实现图片的放大缩小及拖拽功能示例
2019/05/14 Javascript
八种Vue组件间通讯方式合集(推荐)
2020/08/18 Javascript
jQuery实现动态向上滚动
2020/12/21 jQuery
[01:32]寻找你心中的那团火 DOTA2 TI9火焰传递活动今日开启
2019/05/16 DOTA
Python2.x与Python3.x的区别
2016/01/14 Python
实例讲解Python的函数闭包使用中应注意的问题
2016/06/20 Python
Python设计实现的计算器功能完整实例
2017/08/18 Python
python实现感知器
2017/12/19 Python
matplotlib简介,安装和简单实例代码
2017/12/26 Python
在unittest中使用 logging 模块记录测试数据的方法
2018/11/30 Python
Python提取特定时间段内数据的方法实例
2019/04/01 Python
Python搭建Keras CNN模型破解网站验证码的实现
2020/04/07 Python
html5 touch事件实现触屏页面上下滑动(一)
2016/03/10 HTML / CSS
HTML5的结构和语义(1):前言
2008/10/17 HTML / CSS
妇联领导班子剖析材料
2014/08/21 职场文书
乡领导班子四风问题对照检查材料
2014/09/25 职场文书
元宵节寄语大全
2015/02/27 职场文书
幼儿园教师师德承诺书
2015/04/28 职场文书
家庭贫困证明
2015/06/16 职场文书
高考满分作文赏析(2篇)
2019/08/12 职场文书
导游词之嵊泗列岛
2019/10/30 职场文书
Vue中foreach数组与js中遍历数组的写法说明
2021/06/05 Vue.js