python 单词拆音节_基于Trie树进行拆分字符串变成拼音音节(一):构建拼音音节模型...
一.前言
在智能客服领域,需要具备识别用户输入拼音并将其转为中文,进而来搜索与之相关问题,但用户输入的拼音内容是一个长字符串,此时需要把字符串进行中文拼音音节拆分,用逗号’,'将每个音节分开,因此本篇文章主要介绍构建基于Trie的拼音音节模型,在下篇文章介绍拆分音节,再下下篇文章介绍拼音识别成中文
二.构建模型
2.1 Trie树简要介绍
Trie树形结构属于字典树,整个树的根节点是空的, 根节点的子节点可以有多个,每个子节点智能存放单个元素,用于我们拼音模型就是根节点的子结点有26个,分别由a-z组成,每个子节点又可以当作其下的根节点,Trie字典树节点的结构为:
class TrieNode:
def __init__(self):
self.value = None
self.children = {}
Trie树结构例图
2.2 构建拼音模型
首先我们需要中文拼音词库pinyin.txt,里面包含各种音节,将这些音节加入到trie树,变成拼音字典树,例如:
a
ai
aing
an
ang
ao
ba
bai
ban
bang
bao
bei
.
.
.
初始化字典树:
class Trie:
def __init__(self):
self.root = TrieNode() # 初始化节点
self.trie_path = Pinyin_Trie_Path # 生成模型的目录文件
self.pinyin_path = Pinyin_Path # 中文拼音库目录文件
插入trie节点:
def insert(self, key):
node = self.root
for char in key:
if char not in node.children:
child = TrieNode()
node.children[char] = child
node = child
else:
node = node.children[char]
node.value = key
遍历音节字符串获取单个字母i,如果trie树已存在该单个字母,则继续在该字母节点的子节点中添加,例如:目前有音节zhao,而trie树已有zh,则遍历zhao,添加a作为h的子节点,再添加o作为a的子节点.如果字母i不属于子节点中,则需要新建一个TrieNode节点,存放新的字母.
def build_trie(self):
trie = Trie()
for line in open(self.pinyin_path):
word = line.strip().lower()
trie.insert(word)
with open(self.trie_path, 'wb') as f:
pickle.dump(trie, f)
此段代码是构建拼音模型的代码,它逐行读取中文拼音词库pinyin.txt的拼音并转换成小写,并调用insert()方法插入Trie树中,最后导出拼音模型文件pinyin_Trie.model
def search(self, key):
node = self.root
matches = []
for char in key:
if char not in node.children:
break
node = node.children[char]
if node.value:
matches.append(node.value)
return matches
该代码主要功能是根据新输入的拼音去查找比对trie树的内容,比如输入zhuanye,比对trie后,会把[zhu,zhua,zhuan],[ye]返回
三.全部代码
Proj_path = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
Pinyin_Trie_Path = os.path.join(Proj_path, "main/pinyin_Trie.model")
Pinyin_Path = os.path.join(Proj_path, "main/assets/dataset/pinyin.txt")
# 定义trie字典树节点
class TrieNode:
def __init__(self):
self.value = None
self.children = {}
class Trie:
def __init__(self):
self.root = TrieNode()
self.trie_path = Pinyin_Trie_Path
self.pinyin_path = Pinyin_Path
# 添加树节点Pinyin_Path
def insert(self, key):
node = self.root
for char in key:
if char not in node.children:
child = TrieNode()
node.children[char] = child
node = child
else:
node = node.children[char]
node.value = key
# 查找节点
def search(self, key):
node = self.root
matches = []
for char in key:
if char not in node.children:
break
node = node.children[char]
if node.value:
matches.append(node.value)
return matches
def build_trie(self):
trie = Trie()
for line in open(self.pinyin_path):
word = line.strip().lower()
trie.insert(word)
with open(self.trie_path, 'wb') as f:
pickle.dump(trie, f)
有问题的,欢迎评论一起讨论!
python 单词拆音节_基于Trie树进行拆分字符串变成拼音音节(一):构建拼音音节模型...相关推荐
- 基于Trie树进行拆分字符串变成拼音音节(二):字符串拼音拆分
一.前言 上一篇文章已经介绍了如何将所有中文拼音音节都基于Trie树生成模型,文章地址基于Trie树进行拆分字符串变成拼音音节(一):构建拼音音节模型,本篇文章主要介绍如何基于拼音模型将字符串进行拆分 ...
- 基于Trie 树实现简单的中文分词
中文分词简介 中文分词是中文自然语言处理的基础,中文分词的正确率如何直接影响后续的词性标注(也有些词性标注算法不需要事先分词,但标注效果往往比先分词后标注差),实体识别.句法分析.语义分析.常用的分词 ...
- 基于Trie树的拼音切分算法
基于Trie树的拼音切分算法 Trie树也叫做单词查找树,是一个非常有效的索引结构,trie是由retrieval演化而来的.具体介绍请参看–> [ 维基百科 ] Trie树结构的简单说明 Tr ...
- 字符串匹配算法 -- AC自动机 基于Trie树的高效的敏感词过滤算法
文章目录 1. 算法背景 2. AC自动机实现原理 2.1 构建失败指针 2.2 依赖失败指针过滤敏感词 3. 复杂度及完整代码 1. 算法背景 之前介绍过单模式串匹配的高效算法:BM和KMP 以及 ...
- 怎样实现基于Trie树和字典的分词功能
前言 目前做分词比较流行的是用深度学习来做,比如用循环神经网络和条件随机场,也有直接用条件随机场或隐马尔科夫模型的.前面也实现过上面几种,效果挺不错,基于隐马尔科夫模型的差一点,条件随机场的效果较好, ...
- python实现Trie 树+朴素匹配字符串+RK算法匹配字符串+kmp算法匹配字符串
一.trie树应用: 相应leetcode 常用于搜索提示,如当输入一个网址,可以自动搜索出可能的选择.当没有完全匹配的搜索结果,可以返回前缀最相似的可能. 例如三个单词app, apple, add ...
- 用python做炒股软件-python程序源码_基于python的炒股软件
股票模拟交易系统设计与实现 不但能够进行界面的设计,还可以实现各个窗口的关联,通过WPF实现和其余窗口的关联,而且WPF中的类不但能够和其中一个窗口进行关联,还可以跟许多功能操作接口,WPF在对窗口对 ...
- python爱因斯坦的问题_基于Python3的趣味数学问题
基于Python3的趣味数学问题 Pro1. 数独(Sudoku)根据九宫格盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个宫(3*3)内的数字均含1-9这9个数字. Pro2 ...
- python实现3d扫描_基于3D扫描、机器人和物联技术的自动化逆向工程解决方案
逆向工程技术(Reverse Engineering)作为工程师重要的研发工具,在近几年来变得越来越举足轻重.在非自动化的逆向工程流程中,工程师需要耗费大量人工重复劳动,并且需要具有相当多的专业知识. ...
- python游戏开发引擎_基于Python的网络游戏脚本系统的设计与实现
基于 Python 的网络游戏脚本系统的设计与实现 摘要:传统的网络游戏开发采用 c/c++ 实现游戏的逻辑功能,随 着游戏内容越来越丰富以及快速变化的市场需要, c/c ++ 已经不能 满足开发者对 ...
最新文章
- render函数和redirect函数的区别+反向解析
- Windows Vista Ultimate 版测试结果汇整
- 理工科毕业设计献礼,MATLAB从入门到精通之矩阵是如何实现寻访与赋值的
- NIO : selector、channel、buffer的实例
- axure 鼠标样式,Axure8-动态面板+简单鼠标事件实现单页面应用
- 关于通信matlab 仿真,关于MATLAB在通信仿真系统中的运用
- Oracle服务器连接
- 2021年山西副高考试成绩查询,中国卫生人才网2021年山西卫生资格考试成绩查询...
- 数字水印技术的原理、实现及其应用
- thinkadmin默认ckeditor富文本配置修改
- html编辑器贴吧,推荐HTML编辑器
- JSP页面和html页面中文乱码的解决
- 解决Unable to find encoder for type stored in a Dataset问题
- html按住语音如何看前面内容,单音语音内容.html
- “33岁转行软件测试还来得及吗?”怎么去转行软件测试?
- 小程序利用云函数发送电子邮件功能详解
- 视频网站服务器用什么配置好?
- 一个计算机爱好者的不完整回忆(四十五)无心插柳的收获
- 没想到 Shell 命令竟然还能这么玩?| Shell 玩转大数据分析
- 第一手知识——切身体验
热门文章
- P2627 [USACO11OPEN]Mowing the Lawn G(单调队列)
- 百度程序员开发避坑指南(前端篇)
- RHCE(八)ansible基础配置学习
- 数据分析报表设计开发要素
- python爬取豆瓣读书界面的书名、作者、价格、导入数据库_python爬虫:利用正则表达式爬取豆瓣读书首页的book...
- 【基于LM358和LM386的话音放大器设计】
- 生物信息学入门之基本概念之蛋白质同源检测和折叠识别
- Kinect驱动识别及SDK下载问题
- 如何将根证书预置到chromium浏览器中
- 基于[三星6818]I2C驱动开发的0.96寸oled屏