一.前言

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

二.代码流程

首先看一下拆分效果:输入zhuanye,打印
print(PinyinCut().cut(‘zhuanye’))

然后直接上代码:
先有一个遍历Trie树的类SearchIndex

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

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

class PinyinCut:def __init__(self):self.trie_path = Pinyin_Trie_Pathself.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 = Nonewhile candidate_index:p = candidate_index.pop()# 如果当前字符所在索引为句子长度,那么最后一个index为本身,即直接到句子末尾。if p.index == len_sent:last_index = pbreakmatches = 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_indexwhile index:if index.parent:# print(join(index.char))chars.insert(0, index.char)# chars.append(index.char)index = index.parentnew_str = ','.join(chars)return new_str

三.完整代码

class PinyinCut:def __init__(self):self.trie_path = Pinyin_Trie_Pathself.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 = Nonewhile candidate_index:p = candidate_index.pop()# 如果当前字符所在索引为句子长度,那么最后一个index为本身,即直接到句子末尾。if p.index == len_sent:last_index = pbreakmatches = 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_indexwhile index:if index.parent:# print(join(index.char))chars.insert(0, index.char)# chars.append(index.char)index = index.parentnew_str = ','.join(chars)return new_str

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

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

  1. 基于Trie树的拼音切分算法

    基于Trie树的拼音切分算法 Trie树也叫做单词查找树,是一个非常有效的索引结构,trie是由retrieval演化而来的.具体介绍请参看–> [ 维基百科 ] Trie树结构的简单说明 Tr ...

  2. 字符串匹配算法 -- AC自动机 基于Trie树的高效的敏感词过滤算法

    文章目录 1. 算法背景 2. AC自动机实现原理 2.1 构建失败指针 2.2 依赖失败指针过滤敏感词 3. 复杂度及完整代码 1. 算法背景 之前介绍过单模式串匹配的高效算法:BM和KMP 以及 ...

  3. 基于Trie 树实现简单的中文分词

    中文分词简介 中文分词是中文自然语言处理的基础,中文分词的正确率如何直接影响后续的词性标注(也有些词性标注算法不需要事先分词,但标注效果往往比先分词后标注差),实体识别.句法分析.语义分析.常用的分词 ...

  4. C++字符串完全指引之二 —— 字符串封装类

    C++字符串完全指引之二 -- 字符串封装类 原著:Michael Dunn 作者:Chengjie Sun 原文出处:CodeProject:The Complete Guide to C++ St ...

  5. 怎样实现基于Trie树和字典的分词功能

    前言 目前做分词比较流行的是用深度学习来做,比如用循环神经网络和条件随机场,也有直接用条件随机场或隐马尔科夫模型的.前面也实现过上面几种,效果挺不错,基于隐马尔科夫模型的差一点,条件随机场的效果较好, ...

  6. 数据结构与算法之美笔记——基础篇(下):图、字符串匹配算法(BF 算法和 RK 算法、BM 算法和 KMP 算法 、Trie 树和 AC 自动机)

    图 如何存储微博.微信等社交网络中的好友关系?图.实际上,涉及图的算法有很多,也非常复杂,比如图的搜索.最短路径.最小生成树.二分图等等.我们今天聚焦在图存储这一方面,后面会分好几节来依次讲解图相关的 ...

  7. 字符串匹配数据结构 --Trie树 高效实现搜索词提示 / IDE自动补全

    文章目录 1. 算法背景 2. Trie 树实现原理 2.1 Trie 树的构建 2.2 Trie树的查找 2.3 Trie树的遍历 2.4 Trie树的时间/空间复杂度 2.5 Trie 树 Vs ...

  8. 自然语言--Trie树详解及其应用

    链接:http://blog.csdn.net/hackbuteer1/article/details/7964147 参考链接:https://segmentfault.com/a/11900000 ...

  9. 【图解算法】Trie树

    欢迎来到我的算法专栏,今天我们来讲一种常见的数据结构:Trie树. 我们会对Trie树的性质,相关操作,应用进行讲解,并模拟实现一个简版的Trie树. 目录 1. Trie树 简介 2. Trie树的 ...

最新文章

  1. 【c语言】蓝桥杯算法训练 大小写判断
  2. 从Python代码到APP,你只需要一个小工具:GitHub已超3000星
  3. sql server 2005 sa登录失败解决方法
  4. JavaScript 里 window, document, screen, body 这几个名词的区别
  5. postgresql 不同数据库不同模式下的数据迁移
  6. 运算符面试题(剑指offer,面试宝典,牛客网)
  7. MMKV集成与原理,先收藏了
  8. mysql innodb redolog_MySQL · 引擎特性 · InnoDB redo log漫游(转)
  9. 网络编程之 application/x-www-form-urlencoded MIME编码
  10. 【ElasticSearch】Es 源码之 NodeConnectionsService 源码解读
  11. 漫射光层析成像的正问题理论模型(一)——蒙特卡洛模型概述
  12. Nacos:快速不停打印获取配置 c.a.n.client.config.impl.ClientWorker : get changedGroupKeys[${dataId}+${grou
  13. ​下一代无服务器的发展形态:Serverless2.0
  14. Java多线程模拟医院排号叫号系统
  15. OpenCV之光流法运动目标跟踪
  16. PhpSpreadsheet常用操作
  17. 解决:操作必须使用一个可更新的查询
  18. 在win7安装theano
  19. STM32 HAL库 CubeMx 按键中断控制LED
  20. Apache HTTP Server 2.4.49 路径穿越漏洞复现及利用

热门文章

  1. mtk平台typec模拟耳机补丁
  2. 【android 应用】Android(安卓)APP(应用)如何推广?整理
  3. R语言医学实例分析:代码解析
  4. 黑灰产程序员被抓,背后隐藏的黑色产业链怎么破?
  5. java 判断cmyk_Java判断图片是grb还是cmyk
  6. 如何用python处理excel中时间重合_python读取Excel文件中的时间,并计算时间间隔...
  7. Oracle 12cR1 RAC 在VMware Workstation上安装(上)—OS环境配置
  8. 4pics1word android,4 Pics 1 word Answers
  9. 重磅!被称“新材料之王”“黑黄金”,中石化大丝束碳纤维投产,全球仅4家能产 | 美通社头条...
  10. Vue Echarts绘制世界地图