一.前言
上一篇文章已经介绍了如何将所有中文拼音音节都基于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
有问题的,欢迎评论一起讨论!