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多线程扫描端口示例
Jan 16 Python
python使用百度翻译进行中翻英示例
Apr 14 Python
Python中动态获取对象的属性和方法的教程
Apr 09 Python
想学python 这5本书籍你必看!
Dec 11 Python
Python读取stdin方法实例
May 24 Python
python通过txt文件批量安装依赖包的实现步骤
Aug 13 Python
python运用pygame库实现双人弹球小游戏
Nov 25 Python
安装Anaconda3及使用Jupyter的方法
Oct 27 Python
python爬取招聘要求等信息实例
Nov 20 Python
pandas实现导出数据的四种方式
Dec 13 Python
Python 将代码转换为可执行文件脱离python环境运行(步骤详解)
Jan 25 Python
Django中template for如何使用方法
Jan 31 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/06/01 PHP
PHP编程计算日期间隔天数的方法
2017/04/26 PHP
基于jQuery的固定表格头部的代码(IE6,7,8测试通过)
2010/05/18 Javascript
jQuery的学习步骤
2011/02/23 Javascript
JS仿百度搜索自动提示框匹配查询功能
2013/11/21 Javascript
jquery获取颜色在ie和ff下的区别示例介绍
2014/03/28 Javascript
jQuery基于当前元素进行下一步的遍历
2014/05/20 Javascript
jquery简单图片切换显示效果实现方法
2015/01/14 Javascript
javascript实现随时变化着的背景颜色
2015/04/02 Javascript
js获取url传值的方法
2015/12/18 Javascript
浏览器复制插件zeroclipboard使用指南
2016/03/26 Javascript
如何写好你的JavaScript【推荐】
2017/03/02 Javascript
Vue.js bootstrap前端实现分页和排序
2017/03/10 Javascript
浅谈angular2路由预加载策略
2017/10/04 Javascript
详解微信小程序实现跑马灯效果(附完整代码)
2019/04/29 Javascript
javascript面向对象创建对象的方式小结
2019/07/29 Javascript
ckeditor一键排版功能实现方法分析
2020/02/06 Javascript
jQuery实现简单全选框
2020/09/13 jQuery
TensorFlow模型保存/载入的两种方法
2018/03/08 Python
简单谈谈python基本数据类型
2018/09/26 Python
Python解析、提取url关键字的实例详解
2018/12/17 Python
python导包的几种方法(自定义包的生成以及导入详解)
2019/07/15 Python
numpy.meshgrid()理解(小结)
2019/08/01 Python
弄懂这56个Python使用技巧(轻松掌握Python高效开发)
2019/09/18 Python
TensorFlow Autodiff自动微分详解
2020/07/06 Python
Pandas DataFrame求差集的示例代码
2020/12/13 Python
Python实现一个论文下载器的过程
2021/01/18 Python
如何用Django处理gzip数据流
2021/01/29 Python
铭万公司.net面试题笔试题
2014/07/20 面试题
linux面试题参考答案(7)
2014/07/24 面试题
会计出纳员的自我评价
2014/01/15 职场文书
2019求职信:应届生求职信范文
2019/04/24 职场文书
MySQL系列之九 mysql查询缓存及索引
2021/07/02 MySQL
漫画「日和酱的要求是绝对的」第3卷封面公开
2022/03/21 日漫
python神经网络ResNet50模型
2022/05/06 Python
Windows7下FTP搭建图文教程
2022/08/05 Servers