基于HMM隐马尔可夫模型的汉子拼音输入法程序

原理及模型介绍

(一)HMM模型

对于一个随机事件,有一个可以观测到的值序列:

该事件的每一个观察到的值都对应一个生成他的状态,则其背后存在一个状态序列:

假设1:(马尔科夫假设)每一个状态的值都与其前n个状态的值相关

假设2:(不动性假设)状态与具体的时间无关

假设3:(输出独立性假设)输出只与当前状态有关

则一个HMM模型是一个五元组

其中

解码问题:对于给定的模型和观察值序列,求出最大可能性的状态序列

(二)拼音转汉字算法设计

拼音转汉字即对应HMM模型的解码问题。由已知的语料库训练出来汉字到汉字的转移概率和汉字到拼音的发射概率,然后用户输入拼音序列为已知的观察值序列,求大嘴可能性的汉字状态序列。

用一个简单的例子来表示这个识别的过程及原理。

若用户想在计算机得到汉字“我爱中国”,则需要往键盘敲入“wo ai zhong guo”这四个英文字符串。从HMM模型出发,“wo ai zhong guo”是观测值序列,如下观测流程图。

图1 我爱中国汉字拼音输入HMM观测过程

图中蓝色圆圈为隐藏的状态,即汉字,橙色圆圈代表可以观测到观测值,拼音。联系HMM模型,汉字“我”到汉字“爱”的过程是一个转移过程,如果用二元语法模型,则汉字“爱”在“我”的出现情况下有一个转移概率,如后汉字分析同理。同时,汉字我到拼音“wo”有一个发射过程,也有一个概率。则上图可变化为基于概率的识别流程图,如下。

图2 我爱中国汉字拼音输入基于概率的识别过程

但是,拼音“wo”的对应汉字处理“我”还有“卧”、“窝”等,拼音“ai”对应汉字处理“爱”,还有“哎”,“唉”等,那么“wo ai”的组成情况就还会出现“卧爱”、“窝爱”、“我哎”等。如次就出现了如下图3的基于隐马尔科夫模型HMM的拼音转汉字模型图。

如次,基于HMM模型的解码问题,可以求解出状态转移链中概率最大的一条路径,此条路径即所求的汉子序列。

图3 “wo ai zhong guo”拼音输入基于HMM的识别过程

(三)维特比算法

维特比(Viterbi)算法用于解码,在给定模型μ和观察序列O的条件下,使条件概率P(Q|O,μ)最大的状态序列,即

维特比算法运用动态规划的搜索算法求解这种最优状态序列。为了实现这种搜索,首先定义一个维特比变量

​维特比变量是在时间t时,HMM沿着某一条路径到达状态,并输出观察序列的最大概率:

有如下递归关系:

这种递归关系使我们能够运用动态规划搜索技术。为了记录在时间t时,HMM通过哪一条概率最大的路径到达状态

其伪代码如下:

-----------------------------------------------------------

*维特比算法(Viterbi algorithm)*

*初始化:*

*归纳计算*

*终结*

-----------------------------------------------------------

(四)模型实现与构建

其构建的流程如下图。

图4 项目模型构件图

1.语言模型训练

本处使用老师给的toutiao_cat_data.txt文件中的数据。

(1)语料清洗

由于文件中的文字段都是带有非法字符和大段文字的。所以这里本人使用了正则表达式来匹配中文字符,对于非中文字符都直接忽略,并切断句。

如此,即可得到如图5所示的规则汉字串。

图5 清洗非法字符后的汉字串

但是,HMM模型需要拼音到汉字的发射概率,现在我们还缺少汉字的标准注音。所以,本人调用了pypinyin第三方库来对所有的汉字注音。获得拼音列表。

(2)语言模型训练

基于如上的大量语料库文本,由一段文字可以得到文字库和拼音库,然后统计文字的频次、文字到拼音的频次、文字到文字的频次。如此,根据N-Gram 语言模型原理

得出一元语言模型和二元语言模型:

同时训练时采用加一平滑技术得到如下公式:

依照如上公式带入语料库文本信息则可以训练得到HMM模型的概率矩阵。同时,为方便HMM模型程序调用整理好的语料数据,将此些加工后的语料文件保存为python易使用的npy文件。

此外,为了方便使用如上的语言模型计算,这里保存了四个语料文件,分别为每一个拼音对应的所有已知汉字集合文件py2hanzi.npy、为汉字编码后的汉字编码字典文件my_hanzi_dict.npy、汉字编码到汉字编码二字词映射频次对应的二维矩阵文件my_moving_array.npy、单个汉字出现次数的列表文件my_hanzi_num.npy和汉字对应的各个拼音文件my_emission_dic。

其生成的代码如下:

统计汉字的出现频次,用于计算一元语言模型。

汉字的编码列表

汉字编码到汉字编码的次数映射,用于统计二元语法模型。

汉字到拼音的频数,其格式为{'了':{'le':5, 'liao':10},'屈':{'qu':5}}。

至此,所有的语料文件都已训练好并保存为npy格式的文件,方便调用。

2.HMM模型的构建

依照图4的模型,首先构建一个HMM的模型模块,输入为一串拼音序列,并判断“l”、“n”遇上元音“ü”的情况,替换“v”为“ü”,然后加载语料数据,构建HMM模型如图3,每一个汉字状态圆圈代表一个节点,节点存储此汉字和汉字对应拼音的语料数据。然后通过维特比算法获得最优的汉字序列,输出汉字序列。其伪代码如下:

*---------------------------------------------------------------*

*输入:拼音序列*

*过程:*

*1: 加载语料数据文件,获得汉字到汉字、拼音的概率表和汉字的概率表*

*2: 输入拼音*

*3: 若“l”、“n”遇上元音“ü”的替换“v”为“ü”*

*4: 初始化每个拼音的汉字状态节点,汉字状态节点初始化三类概率*

*5: 维特比算法求解*

*6: 输出汉字序列*

*---------------------------------------------------------------*

下面我们用代码实现如上的伪代码。

首先是加载语料数据文件。

然后是设计了一个Graph邮箱图类来存储HMM模型的结构。其初始化为将输入的拼音字符串分解,为每个拼音构建其汉字节点,然后将每个节点初始化。

其中每个汉字都是一个节点,节点也是一个类,保存了其汉字、次数、维特比变量和前一个节点等熟悉。

在初始化好HMM模型结构后,我们就可以开始用维特比算法计算每一个节点的维特比变量,来对整个模型的节点进行遍历计算。其中初始节点的维特比变量用一元语法模型计算,后续节点用二元语法模型状态,都是用的加一平滑技术。然后发射概率也是加一平滑的。

在训练完成后,HMM模型就可以找到最优的路径了,这时候利用每一个节点保存的最优上一节点可以反向遍历得到最佳的路径,也就是最优的字符串序列,期待吗如下。

至此,HMM模型已经训练完成和可以进行输入法预测功能。

(二)模型改进

在如上语料模型训练中,存在一些问题,最终会大幅度影响整个HMM模型的训练结果。其缺点主要有以下几点:

1.语料文件质量差。文中有大量非法字符,不得不用正则表达式去判断非法字符的位置,然后切断汉字串为两个汉字串。比如“我爱穿T恤,我好开心”,这里面有非法字符“T”和“,”,会将字符串切分为3个字符串段。

2.语料文件无拼音注释,第三方库添加错误率较高。因为语料文件没有拼音语料,所以不得不用第三方库Pypinyin来为所有的汉字串注音,但是此pypinyin可以的拼音准确度会直接影响我们的概率,同时其中有非常多的识别错误,也没有声母n、l跟韵母ü遇上的转换等过程。

3.语料文件中的汉字数量只有3000多字,而常用的汉字有8000字左右,相差较多,同理,其拼音数量也严重缺失,导致语言模型训练会出现大量的平滑。

实验结果及分析

1.基于实验语料文件的HMM训练与测试的结果

(1)基于toutiao_cat_data.txt文件训练后,对于实验给的测试集.txt文件进行测试如下图。可得到测试准确率在79.2%。

(2)基于toutiao_cat_data.txt文件训练后,对于github.com/THUzhangga的test_set.txt文件进行测试如下图。可得到测试准确率在67.58%。

2.基于改进后的语料文件的HMM训练与测试的结果

(1)基于github.com/THUzhangga的语料文件训练后,对于实验给的测试集.txt文件进行测试如下图。可得到测试准确率在87.61%,可明显看到准确率大幅度提升。

(2)基于github.com/THUzhangga的语料文件训练后对于github.com/THUzhangga的test_set.txt文件进行测试如下图。可得到测试准确率在75.56%,可明显看到准确率大幅度提升。

3.模型评价与分析

本文选取一些测试样例和搜狗输入法做比较,可以明显观察到长句的错误率较高,短句和常见的词组正确率一般都较高,同时搜狗输入法的长句错误率也较高。

此外,在运行时间和资源消耗的上,时间预测一个拼音字符串的主要时间消耗在数据文件的加载中,同时存储开销达到百兆的大小,并随着语料库的增加还会继续增大。

总体来说,本项目的正确率较高,但是项目的其他资源消耗太大,仅作为实验验证还是不错的。

表1 实验项目结果对比

*预测结果*

*搜狗输入法*

*正确答案*

虽然已经解决了建立新积分方法的首要问题

虽然已经解决乐见离心机芬芳发的首要问题

虽然已经解决了建立新积分方法的首要问题

建立了交易办机上的策独立伦

建立了交易班级上的测度理论

建立了较一般集上的测度理论

后面我们将成具有这种性质的函数为可测寒暑

后面我们将成具有这种性质的函数味可测函数

后面我们将称具有这种性质的函数为可测函数

今天也是好天气

今天也是好天气

今天也是好天气

中央已经决定了

中央已经决定了

中央已经决定了

文件结构

实验2-HMM模型拼音转汉字输入法.pdf

实验2-HMM模型拼音转汉字输入法.docx

src

data_train.py训练实验所给的语料文件

HMM_Typewriting.py基于实验所有的语料文件构建的HMM模型和拼音输入法程序

train_data

toutiao_cat_data.txt 实验所给的语料文件

data

基于实验所有的语料文件构建的语料数据库、测试集和训练结果

my_emission_dic.npy 发射概率npy

my_hanzi_dict.npy 汉字编码映射npy

my_hanzi_num.npy 汉字频次数组npy

my_moving_array.npy 汉字到汉字转移概率npy

py2hanzi.npy 拼音映射到汉字npy

my_output_answer.txt

my_output_answer_for test_set.txt

测试集.txt 老师给的测试集

test_set.txt 网上找的测试集

data2

emission_dic.npy

hanzi_num.npy

py2hanzi.npy hanzi_dict.npy

moving_array.npy

output_answer.txt 网上数据集的测试结果

output_answer_for_测试集.txt 老师给的数据集测试结果

hmm 流程图_GitHub - Qu-Xiangjun/HMM_Typewriting_Pinyin相关推荐

  1. iris流程图_GitHub - LeoIris/vue: vue源码逐行注释分析+40多m的vue源码程序流程图思维导图 (diff部分待后续更新)...

    vue源码业余时间差不多看了一年,以前在网上找帖子,发现很多帖子很零散,都是一部分一部分说,断章的很多,所以自己下定决定一行行看,经过自己坚持与努力,现在基本看完了 .这个vue源码逐行分析,我基本每 ...

  2. python自学流程-Python系统学习流程图,教你一步步学习python

    对于刚开始接触Python的小伙伴来说,没有思路方法,不知道从何开始学习,把软件环境安装好后就不知所措了!接下来我给大家分享下多位大牛倾力打造的python系统学习流程,一个月才设计完的! Pytho ...

  3. 时序分析:HMM模型(状态空间)

    关于HMM模型:时序分析:隐马尔科夫模型 HMM用于手势识别: 训练时每一种手势对应一个HMM-Model,识别率取最大的一个HMM即可.  类似于一个封装的完成多类识别器功能单层网络. 优点: 尤其 ...

  4. 搜索-Query Understanding (QU)

    往简单来讲,用户输入了搜索词,系统通过搜索词找到与搜索词相关的商品集合,系统通过用户及商品的情况进行排序,最终展现给用户. 0.找不到 但是在构建搜索系统的初期总是无法精准地帮助用户找到想要的商品主要 ...

  5. 汇编计算机钢琴流程图,键盘钢琴汇编语言程序设计

    键盘钢琴汇编语言程序设计 (27页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.9 积分 目录1总体方案设计与论证 21」课程设计程序功能分析 21 ...

  6. HMM(隐马尔科夫)用于中文分词

    什么是熵(Entropy) 简单来说,熵是表示物质系统状态的一种度量,用它老表征系统的无序程度.熵越大,系统越无序,意味着系统结构和运动的不确定和无规则:反之,,熵越小,系统越有序,意味着具有确定和有 ...

  7. viterbi维特比算法和隐马尔可夫模型(HMM)

    阅读目录 隐马尔可夫模型(HMM) 回到目录 隐马尔可夫模型(HMM) 原文地址:http://www.cnblogs.com/jacklu/p/7753471.html 本文结合了王晓刚老师的ENG ...

  8. HMM——维特比算法(Viterbi algorithm)

    1. 前言 维特比算法针对HMM第三个问题,即解码或者预测问题,寻找最可能的隐藏状态序列: 对于一个特殊的隐马尔可夫模型(HMM)及一个相应的观察序列,找到生成此序列最可能的隐藏状态序列. 也就是说给 ...

  9. G6实现标签拖动连线画流程图

    需求描述 列出所有的task标签,拖动task标签在一旁画流程图,打包task的任务名及id和任务的执行流程以json的格式发给后端. 技术栈 G6,vue,h5自带的draggable实现拖动.也稍 ...

最新文章

  1. 2018-3-20李宏毅机器学习笔记十----------Logistic Regression
  2. 从零开始一起学习SLAM | 为啥需要李群与李代数?
  3. 读书笔记《鸟哥的Linux私房菜-基础学习篇》man page 查询数据后数字的意思
  4. python彩色图像如何进行高斯滤波ValueError: correlate2d inputs must both be 2-D arrays解决方法
  5. 听说这里有让你膜拜的产品方法论?
  6. 数据库与表的操作之编辑表结构(ALTER TABLE)
  7. C# WinForm 只运行一个程序实例
  8. C++ vector 类学习笔记(转)
  9. 使用浏览器测试Webservers服务时出现提示“The test form is only available for requests from the local machine.”的解决办法
  10. MySQL-快速入门(3)运算符
  11. App制作开发工具源代码搭建网站转app网站
  12. L2-016 愿天下有情人都是失散多年的兄妹
  13. XSS攻击原理及防范
  14. 2021年电工(中级)考试资料及电工(中级)考试试题
  15. python .npy 存取 dict
  16. 利用PYTHON出小学数学题
  17. 常用正则验证 :手机号、验证码、密码、邮箱等验证
  18. outlook邮箱邮件大小限制_Outlook 中的邮件规则容量限制
  19. html入门基础-边框设计(入门级)
  20. python 实现翻译功能

热门文章

  1. PIC18F系列单片机外部中断
  2. linux 内核 ramdisk,linux中ramdisk的使用
  3. Redis事务失效的三种场景
  4. AV1编码器的优化及其在流媒体和实时通讯中的应用
  5. TRIM_UNUSED_KSYMS 和 ko 导出符号解耦
  6. 数码相机入门――成像原理
  7. KDGK-703S便携式综合校验仪(毫伏发生器)
  8. 汽车调节器matlab仿真,基于MATLAB汽车VCU控制器开发平台
  9. C语言实现雷克子波频谱
  10. 明日方舟游戏货币体系研究