一.前言

在智能客服领域,需要具备识别用户输入拼音并将其转为中文,进而来搜索与之相关问题,但用户输入的拼音内容是一个长字符串,此时需要把字符串进行中文拼音音节拆分,用逗号’,'将每个音节分开,因此本篇文章主要介绍构建基于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树进行拆分字符串变成拼音音节(一):构建拼音音节模型...相关推荐

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

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

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

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

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

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

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

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

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

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

  6. python实现Trie 树+朴素匹配字符串+RK算法匹配字符串+kmp算法匹配字符串

    一.trie树应用: 相应leetcode 常用于搜索提示,如当输入一个网址,可以自动搜索出可能的选择.当没有完全匹配的搜索结果,可以返回前缀最相似的可能. 例如三个单词app, apple, add ...

  7. 用python做炒股软件-python程序源码_基于python的炒股软件

    股票模拟交易系统设计与实现 不但能够进行界面的设计,还可以实现各个窗口的关联,通过WPF实现和其余窗口的关联,而且WPF中的类不但能够和其中一个窗口进行关联,还可以跟许多功能操作接口,WPF在对窗口对 ...

  8. python爱因斯坦的问题_基于Python3的趣味数学问题

    基于Python3的趣味数学问题 Pro1. 数独(Sudoku)根据九宫格盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个宫(3*3)内的数字均含1-9这9个数字. Pro2 ...

  9. python实现3d扫描_基于3D扫描、机器人和物联技术的自动化逆向工程解决方案

    逆向工程技术(Reverse Engineering)作为工程师重要的研发工具,在近几年来变得越来越举足轻重.在非自动化的逆向工程流程中,工程师需要耗费大量人工重复劳动,并且需要具有相当多的专业知识. ...

  10. python游戏开发引擎_基于Python的网络游戏脚本系统的设计与实现

    基于 Python 的网络游戏脚本系统的设计与实现 摘要:传统的网络游戏开发采用 c/c++ 实现游戏的逻辑功能,随 着游戏内容越来越丰富以及快速变化的市场需要, c/c ++ 已经不能 满足开发者对 ...

最新文章

  1. render函数和redirect函数的区别+反向解析
  2. Windows Vista Ultimate 版测试结果汇整
  3. 理工科毕业设计献礼,MATLAB从入门到精通之矩阵是如何实现寻访与赋值的
  4. NIO : selector、channel、buffer的实例
  5. axure 鼠标样式,Axure8-动态面板+简单鼠标事件实现单页面应用
  6. 关于通信matlab 仿真,关于MATLAB在通信仿真系统中的运用
  7. Oracle服务器连接
  8. 2021年山西副高考试成绩查询,中国卫生人才网2021年山西卫生资格考试成绩查询...
  9. 数字水印技术的原理、实现及其应用
  10. thinkadmin默认ckeditor富文本配置修改
  11. html编辑器贴吧,推荐HTML编辑器
  12. JSP页面和html页面中文乱码的解决
  13. 解决Unable to find encoder for type stored in a Dataset问题
  14. html按住语音如何看前面内容,单音语音内容.html
  15. “33岁转行软件测试还来得及吗?”怎么去转行软件测试?
  16. 小程序利用云函数发送电子邮件功能详解
  17. 视频网站服务器用什么配置好?
  18. 一个计算机爱好者的不完整回忆(四十五)无心插柳的收获
  19. 没想到 Shell 命令竟然还能这么玩?| Shell 玩转大数据分析
  20. 第一手知识——切身体验

热门文章

  1. P2627 [USACO11OPEN]Mowing the Lawn G(单调队列)
  2. 百度程序员开发避坑指南(前端篇)
  3. RHCE(八)ansible基础配置学习
  4. 数据分析报表设计开发要素
  5. python爬取豆瓣读书界面的书名、作者、价格、导入数据库_python爬虫:利用正则表达式爬取豆瓣读书首页的book...
  6. 【基于LM358和LM386的话音放大器设计】
  7. 生物信息学入门之基本概念之蛋白质同源检测和折叠识别
  8. Kinect驱动识别及SDK下载问题
  9. 如何将根证书预置到chromium浏览器中
  10. 基于[三星6818]I2C驱动开发的0.96寸oled屏