基于HMM的拼音转汉字程序
本文将讲述怎样利用HMM进行拼音转汉字。
准备阶段
python 2.7;
安装 python 工具包 ChineseTone,直接使用 pip install 安装;
运行程序的过程中,可能还会用到其他工具包,自行使用 pip install 安装即可;
下载拼音转汉字程序,https://github.com/letiantian/Pinyin2Hanzi;
原理讲述
HMM涉及三个问题,拼音转汉字程序是以下问题的应用:
在给定模型 μ=(A,B,π)μ=(A,B,π)\mu = \left ( A, B, \pi \right ) 和观察序列 O=O1,O2,⋯,OTO=O1,O2,⋯,OTO_{}= O_{1},O_{2},\cdots ,O_{T} 情况下,如何选择在一定意义下“最优”的状态序列 Q=q1q2⋯qTQ=q1q2⋯qTQ_{}= q_{1}q_{2}\cdots q_{T},使得该状态序列“最好地解释”观察序列?
对应到拼音转汉字程序:
状态序列:汉字序列
观察序列:拼音序列
A:状态转移概率矩阵,汉字转汉字的概率矩阵;
B:从某个状态观察到特定符号的概率分布矩阵,由某个汉字得到某个拼音的概率分布矩阵;
ππ \pi:初始状态概率分布,汉字的概率分布;
实验步骤
从 github 上下载的程序分别根据 HMM 和 DAG 实现了拼音转汉字的功能,这里我们只讲述 HMM 的实现步骤。
主要用到了 train 和 Pinyin2Hanzi 这两个文件夹中的内容:
train:根据外部语料,统计计算得到 HMM 的模型 μ=(A,B,π)μ=(A,B,π)\mu = \left ( A, B, \pi \right ),其实就是两个矩阵和一个向量;
Pinyin2Hanzi:根据模型 μ=(A,B,π)μ=(A,B,π)\mu = \left ( A, B, \pi \right ) 和 观察序列(输入的拼音序列),使用 Viterbi 算法,计算得到状态序列(输出的汉字序列,可以有多个);
步骤1:删除以下文件夹中的内容,以便更好的观察程序的输出:
Pinyin2Hanzi-master\Pinyin2Hanzi-master\train\hmm\result;
Pinyin2Hanzi-master\Pinyin2Hanzi-master\Pinyin2Hanzi\data;
步骤2:运行 process_article.py
功能:将 train\hmm\article 中的语料转换为句子;
输入:train\hmm\article 中的所有文件;
输出:train\hmm\result\sentence.txt;
错误:UnicodeDecodeError: ‘utf8’ codec can’t decode byte 0xc4 in position 1: invalid continuation byte;
解决方法:因为 train\hmm\article 中的文件名字含有中文,将其更名为0-6.txt;
步骤3:运行 process_hzpy.py
功能:统计 hanzipinyin.txt 中出现的所有汉字、拼音、每个拼音对应的所有汉字;
输入:train\hmm\hanzipinyin.txt;
输出:
train\hmm\result\all_states.txt;
train\hmm\result\all_observations.txt;
train\hmm\result\pinyin2hanzi.txt;
步骤4:运行 gen_base.py
功能:根据sentence.txt、word.txt、hanzipinyin.txt,统计计算得到三个文件;
输入:sentence.txt、word.txt、hanzipinyin.txt;
输出:
result/base_start.json,一个汉字出现在序列(sentence or word)开头的次数,为了计算初始状态概率分布;
result/base_emission.json,一个汉字对应的各种拼音(多音字)在语料 (sentence.txt、word.txt)中出现的次数,为了计算从某个状态观察到特定符号的概率分布矩阵;
result/base_transition.json,一个汉字后面出现某个汉字的次数,为了计算状态转移矩阵;
步骤5:运行 process_finally.py
功能:根据 pinyin2hanzi.txt 和步骤四输出的三个文件,统计计算得到模型对应的两个矩阵和一个向量,以及某个拼音(符号)对应的所有汉字(状态);
输入:pinyin2hanzi.txt、base_start.json、base_emission.json、base_transition.json;
输出:
Pinyin2Hanzi/data/hmm_py2hz.json,将 pinyin2hanzi.txt 中的无效行去掉;
Pinyin2Hanzi/data/hmm_start.json,将 base_start.json 中的次数转换为频率;
Pinyin2Hanzi/data/hmm_emission.json,将 base_emission.json 中的次数转换为频率;
Pinyin2Hanzi/data/hmm_transition.json,将 base_transition.json 中的次数转换为频率;
至此,我们已经根据 article 文件夹中的语料以及 word.txt、hanzipinyin.txt 统计计算得到了模型对应两个矩阵和一个向量
步骤6:有了模型和输入状态序列(拼音序列),我们就可以根据 viterbi 算法计算得到候选的符号序列(汉字序列),主要代码见 Pinyin2Hanzi\implement.py 和 Pinyin2Hanzi\viterbi.py
示例代码:
#coding:utf-8from Pinyin2Hanzi import DefaultHmmParams
from Pinyin2Hanzi import viterbihmmparams = DefaultHmmParams()## 2个候选
result = viterbi(hmm_params=hmmparams, observations=('ni', 'zhi', 'bu', 'zhi', 'dao'), path_num = 2)
for item in result:print(item.score, item.path)
'''输出
1.3155294593897203e-08 ['你', '知', '不', '知', '道']
3.6677865125992192e-09 ['你', '只', '不', '知', '道']
'''## 2个候选,使用对数打分
result = viterbi(hmm_params=hmmparams, observations=('ni', 'zhi', 'bu', 'zhi', 'dao'), path_num = 2, log = True)
for item in result:print(item.score, item.path)
'''输出
-18.14644152864202 ['你', '知', '不', '知', '道']
-19.423677486918002 ['你', '只', '不', '知', '道']
'''## 2个候选,使用对数打分
result = viterbi(hmm_params=hmmparams, observations=('ni', 'zhii', 'bu', 'zhi', 'dao'), path_num = 2, log = True)
for item in result:print(item.score, item.path)
# 发生KeyError,`zhii`不规范
请将以上代码放到目录 Pinyin2Hanzi-master\Pinyin2Hanzi-master 中运行。
基于HMM的拼音转汉字程序相关推荐
- 在PostgreSQL中实现按拼音、汉字、拼音首字母搜索的例子
在PostgreSQL中实现按拼音.汉字.拼音首字母搜索的例子 作者 digoal 日期 2016-11-09 标签 PostgreSQL , 拼音 , 中文分词 , tsvector , 拼音首字母 ...
- 如何实现拼音与汉字的互相转换
如何实现拼音与汉字的互相转换 发表于2个月前(2016-02-16 15:01) 阅读(58) | 评论(0) 6人收藏此文章, 我要收藏 赞0 4月23日,武汉源创会火热报名中,期待您的参与&g ...
- 基于马尔可夫HMM的拼音输入法自然语言处理实现
两个py文件,一个是利用文本训练并保存,另外一个是拼音转汉字,基于隐马尔可夫模型HMM,拼音输入法可以按注音符号与汉语拼音两种汉字拼音方案分成两大类.汉语拼音输入法的编码是依据汉语拼音方案(汉字的读音 ...
- python编程输出汉字_课内资源 - 基于Python的拼音汉字转换程序
1.实验内容利用统计语言模型实现拼音汉字转换 输入:拼音串,输出:对应的汉字串 给定10000字的测试语料,测试音字转换的准确率 针对音字转换结果中存在的问题给出具体分析 以图表的形式表示上述结果 2 ...
- 通过拼音模糊搜索汉字的功能实现
一.原由 前一段时间用php实现通讯录系统,需要用到拼音查找汉字功能,匹配通讯录的姓名字段,于是在网上搜索已有的开源代码,下面总结和分析一下思路和具体实现. 二.思路 查找了网上的多种解决方案,大致分 ...
- 使用完整拼音查找汉字(完整拼音,不是网上散布的首字符拼音那种方法)
注意:这绝不是网上散播的只能使用拼音首字符进行汉字查找的方案,这是一个真正的输入完整拼音得到相应汉字的解决办法. 大部分程序员眼中只有变量.函数--他们忽略生活中的一切,他们并不理解真正的优雅的程序解 ...
- 基于Hmm模型和Viterbi算法的中文分词和词性标注
使用 python 实现基于Hmm模型和Viterbi算法的中文分词及词性标注:使用 最大概率算法 进行优化.最终效果:人民日报语料:分词(F1:96.189%):词性标注(F1:97.934%) 完 ...
- 基于matlab的汽车牌照识别程序详细教程
设计一个基于matlab的汽车牌照识别程序,能够实现车牌图像预处理,车牌定位,字符分割,然后通过神经网络对车牌进行字符识别,最终从一幅图像中提取车牌中的字母和数字,给出文本形式的车牌号码. 关键词:车 ...
- 基于matlab的汽车牌照识别程序 (完整的代码+数据集+报告毕业设计)
设计一个基于matlab的汽车牌照识别程序,能够实现车牌图像预处理,车牌定位,字符分割,然后通过神经网络对车牌进行字符识别,最终从一幅图像中提取车牌中的字母和数字,给出文本形式的车牌号码. 关键词:车 ...
最新文章
- JavaEE基础(十四) /正则
- 如何周密规划决策制定过程
- 单链表的的逆置(带头结点)
- 为什么尽量使用常量引用
- yoast造成php内存,php – Yoast SEO |如何创建自定义变量
- spring 构造函数注入_Spring依赖注入–字段vs设置器vs构造函数注入
- 运算符重载为类的友元函数
- [转载] Python输入,输出,Python导入
- ManyCam Enterprise(摄像头特效软件)v6.7.0.34版
- Flex在线拍照功能
- 写给大家看的量子力学——量子通信、量子隐形传输技术简介
- C4D学习笔记1-动画-动画关键帧
- 微信红包随机算法转载
- 内核RDMA模块(siw)代码分析
- 谷歌浏览器调试前端功能时的三种刷新方式
- 112A.Petya and Strings
- 心得三、做事先做人(转载)
- silk lobe资源公众号_关于关注阿拉善盟公共资源交易中心微信公众号的通知
- AMD Opteron 185 + ATI RDX200 安装雪豹成功。
- opencv学习-均值滤波blur