介绍

这篇文章主要是用 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中文纠错内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!