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 相关文章推荐
python3访问sina首页中文的处理方法
Feb 24 Python
17个Python小技巧分享
Jan 23 Python
用Python编写一个简单的FUSE文件系统的教程
Apr 02 Python
Python字符串详细介绍
May 09 Python
Django ORM框架的定时任务如何使用详解
Oct 19 Python
Tensorflow 训练自己的数据集将数据直接导入到内存
Jun 19 Python
将pip源更换到国内镜像的详细步骤
Apr 07 Python
Python.append()与Python.expand()用法详解
Dec 18 Python
Pytorch Tensor的统计属性实例讲解
Dec 30 Python
keras 获取某层输出 获取复用层的多次输出实例
May 23 Python
Python 读取位于包中的数据文件
Aug 07 Python
django 获取字段最大值,最新的记录操作
Aug 09 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循环创建目录示例分享(php创建多级目录)
2014/03/04 PHP
php中time()与$_SERVER[REQUEST_TIME]用法区别
2014/11/19 PHP
php实现的简易扫雷游戏实例
2015/07/09 PHP
详解PHP执行定时任务的实现思路
2015/12/21 PHP
日期处理的js库(迷你版)--自建js库总结
2011/11/21 Javascript
javascript eval(func())使用示例
2013/12/05 Javascript
对JavaScript的全文搜索实现相关度评分的功能的方法
2015/06/24 Javascript
Vue.js中用webpack合并打包多个组件并实现按需加载
2017/02/17 Javascript
jquery编写日期选择器
2017/03/16 Javascript
jQuery实现分页功能(含ajax请求、后台数据、附完整demo)
2017/04/03 jQuery
基于JavaScript实现弹幕特效
2020/08/27 Javascript
vue父组件向子组件动态传值的两种方法
2017/11/11 Javascript
vue中子组件向父组件传递数据的实例代码(实现加减功能)
2018/04/20 Javascript
在Vue中使用icon 字体图标的方法
2019/06/14 Javascript
ES6的异步操作之promise用法和async函数的具体使用
2019/12/06 Javascript
JavaScript实现拖拽和缩放效果
2020/08/24 Javascript
Javascript如何实现扩充基本类型
2020/08/26 Javascript
vue路由切换时取消之前的所有请求操作
2020/09/01 Javascript
Vue3.0的优化总结
2020/10/16 Javascript
[16:43]Heroes19_剃刀(完美)
2014/10/31 DOTA
python使用chardet判断字符串编码的方法
2015/03/13 Python
解决django前后端分离csrf验证的问题
2019/02/03 Python
如何利用Python模拟GitHub登录详解
2019/07/15 Python
python 判断txt每行内容中是否包含子串并重新写入保存的实例
2020/03/12 Python
介绍一下MD5加密算法
2016/11/12 面试题
市场部规章制度
2014/01/24 职场文书
大二学生职业生涯规划书
2014/02/05 职场文书
趣味游戏活动方案
2014/02/07 职场文书
机关节能减排实施方案
2014/03/17 职场文书
师德先进个人事迹材料
2014/12/19 职场文书
运动会宣传稿100字
2015/07/23 职场文书
总经理致辞
2015/07/29 职场文书
《女娲补天》读后感5篇
2019/12/31 职场文书
PL350与SW11的比较
2021/04/22 无线电
Python3中PyQt5简单实现文件打开及保存
2021/06/10 Python
ECharts transform数据转换和dataZoom在项目中使用
2022/12/24 Javascript