基于Trie树进行拆分字符串变成拼音音节(二):字符串拼音拆分

一.前言

上一篇文章已经介绍了如何将所有中文拼音音节都基于Trie树生成模型,文章地址基于Trie树进行拆分字符串变成拼音音节(一):构建拼音音节模型,本篇文章主要介绍如何基于拼音模型将字符串进行拆分音节,下一篇文章将要介绍拼音识别拼音转功能.

二.代码流程

首先看一下拆分效果:输入zhuanye,打印
print(PinyinCut().cut(‘zhuanye’))
在这里插入图片描述
然后直接上代码:
先有一个遍历Trie树的类SearchIndex

class SearchIndex:
    def __init__(self, index, char=None, parent=None):
        self.index = index
        self.char = char
        self.parent = parent

初始化拼音分割类PinyinCut,导入拼音模型文件

class PinyinCut:
    def __init__(self):
        self.trie_path = Pinyin_Trie_Path
        self.trie = self.load_trie(self.trie_path)

导入拼音模型数据

    def load_trie(self, trie_path):
        fp = open(trie_path, 'rb')
        data = pickle.load(fp)
        return data

音节切分,总体思路就是根据索引来遍历拼音模型Trie树,找到一个完成的音节就用逗号’,'分开,以列表形式返回

    def cut(self, sent):
        # 获取总长度
        len_sent = len(sent)
        # 存储切分序列
        chars = []
        strs = ''
        # 存储候选序列,SearchIndex(0)表示第一个字符
        candidate_index = [SearchIndex(0)]
        # 当前单词的最后一个位置
        last_index = None
        while candidate_index:
            p = candidate_index.pop()
            # 如果当前字符所在索引为句子长度,那么最后一个index为本身,即直接到句子末尾。
            if p.index == len_sent:
                last_index = p
                break
            matches = self.trie.search(sent[p.index:])
            for m in matches:
                new_index = SearchIndex(len(m) + p.index, m, p)
                candidate_index.append(new_index)
        index = last_index
        while index:
            if index.parent:
                # print(join(index.char))
                chars.insert(0, index.char)
                # chars.append(index.char)
            index = index.parent
        new_str = ','.join(chars)
        return new_str

三.完整代码

class PinyinCut:
    def __init__(self):
        self.trie_path = Pinyin_Trie_Path
        self.trie = self.load_trie(self.trie_path)

    def load_trie(self, trie_path):
        fp = open(trie_path, 'rb')
        data = pickle.load(fp)
        return data

    # 音节切分
    def cut(self, sent):
        # 获取总长度
        len_sent = len(sent)
        # 存储切分序列
        chars = []
        strs = ''
        # 存储候选序列,SearchIndex(0)表示第一个字符
        candidate_index = [SearchIndex(0)]
        # 当前单词的最后一个位置
        last_index = None
        while candidate_index:
            p = candidate_index.pop()
            # 如果当前字符所在索引为句子长度,那么最后一个index为本身,即直接到句子末尾。
            if p.index == len_sent:
                last_index = p
                break
            matches = self.trie.search(sent[p.index:])
            for m in matches:
                new_index = SearchIndex(len(m) + p.index, m, p)
                candidate_index.append(new_index)
        index = last_index
        while index:
            if index.parent:
                # print(join(index.char))
                chars.insert(0, index.char)
                # chars.append(index.char)
            index = index.parent
        new_str = ','.join(chars)
        return new_str

有问题的,欢迎评论一起讨论!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值