姓名:唐来宾  学号:17101223417

转载

http://mp.weixin.qq.com/s/bATbcnF-SO-sYClgNLHngw

【嵌牛鼻子】拼音输入,隐马尔可夫模型

【嵌牛导读】隐马尔可夫模型 (Hidden Markov Model) 是一种统计模型,用来描述一个含有隐含未知参数的马尔可夫过程。其难点是从可观察的参数中确定该过程的隐含参数,然后利用这些参数来作进一步的分析。拼音输入法中可观察的参数就是拼音,隐含的参数就是对应的汉字。

【嵌牛提问】如何学好算法?

【嵌牛正文】在网上看到一篇关于隐马尔科夫模型的介绍,觉得简直不能再神奇,又在网上找到大神的一篇关于如何用隐马尔可夫模型实现中文拼音输入的博客(http://sobuhu.com/ml/2013/03/07/hmm-pinyin-input-method.html),无奈大神没给可以运行的代码,只能纯手动网上找到了结巴分词的词库,根据此训练得出隐马尔科夫模型,用维特比算法实现了一个简单的拼音输入法。githuh地址:https://github.com/LiuRoy/Pinyin_Demo

原理简介

隐马尔科夫模型

抄一段网上的定义:

隐马尔可夫模型 (Hidden Markov Model) 是一种统计模型,用来描述一个含有隐含未知参数的马尔可夫过程。其难点是从可观察的参数中确定该过程的隐含参数,然后利用这些参数来作进一步的分析。

拼音输入法中可观察的参数就是拼音,隐含的参数就是对应的汉字。

viterbi算法

参考 https://zh.wikipedia.org/wiki/维特比算法,思想是动态规划,代码比较简单就不赘述。

代码解释

model定义

代码见model/table.py文件,针对隐马尔科夫的三个概率矩阵,分别设计了三个数据表存储。这样的好处很明显,汉字的转移概率矩阵是一个非常大的稀疏矩阵,直接文件存储占用空间很大,并且加载的时候也只能一次性读入内存,不仅内存占用高而且加载速度慢。此外数据库的join操作非常方便viterbi算法中的概率计算。

数据表定义如下:

class Transition(BaseModel):

__tablename__ = 'transition'

id = Column(Integer, primary_key=True)

previous = Column(String(1), nullable=False)

behind = Column(String(1), nullable=False)

probability = Column(Float, nullable=False)

class Emission(BaseModel):

__tablename__ = 'emission'

id = Column(Integer, primary_key=True)

character = Column(String(1), nullable=False)

pinyin = Column(String(7), nullable=False)

probability = Column(Float, nullable=False)

class Starting(BaseModel):

__tablename__ = 'starting'

id = Column(Integer, primary_key=True)

character = Column(String(1), nullable=False)

probability = Column(Float, nullable=False)

模型生成

代码见train/main.py文件,里面的initstarting,initemission,init_transition分别对应于生成隐马尔科夫模型中的初始概率矩阵,发射概率矩阵,转移概率矩阵,并把生成的结果写入sqlite文件中。训练用到的数据集是结巴分词里的词库,因为没有训练长句子,最后运行的结果也证明只能适用于短句输入。

初始概率矩阵

统计初始化概率矩阵,就是找出所有出现在词首的汉字,并统计它们出现在词首的次数,最后根据上述数据算出这些汉字出现在词首的概率,没统计的汉字就认为出现在词首的概率是0,不写入数据库。有一点注意的是为了防止概率计算的时候因为越算越小导致计算机无法比较,所有的概率都进行了自然对数运算。统计的结果如下:

图片发自简书App

转移概率矩阵

此处用到的是最简单的一阶隐马尔科夫模型,即认为在一个句子里,每个汉字的出现只和它前面的的一个汉字有关,虽然简单粗暴,但已经可以满足大部分情况。统计的过程就是找出字典中每个汉字后面出现的汉字集合,并统计概率。因为这个概率矩阵非常的大,逐条数据写入数据库过慢,后续可以优化为批量写入,提高训练效率。结果如下:

上图展示的一后面出现概率最高的十个字,也挺符合日常习惯。

发射概率矩阵

通俗点就是统计每个汉字对应的拼音以及在日常情况下的使用概率,已暴举例,它有两个读音:bao和pu,难点就是找bao和pu出现的概率。此处统计用到了pypinyin模块,把字典中的短语转换为拼音后进行概率统计,但是某些地方读音也不完全正确,最后运行的输入法会出现和拼音不匹配的结果。统计结果如下:

图片发自简书App

viterbi实现

代码建input_method/viterbi.py文件,此处会找到最多十个局部最优解,注意是十个局部最优解而不是十个全局最优解,但是这十个解中最优的那个是全局最优解,代码如下:

def viterbi(pinyin_list):

"""

viterbi算法实现输入法

Aargs:

pinyin_list (list): 拼音列表

"""

start_char = Emission.join_starting(pinyin_list[0])

V = {char: prob for char, prob in start_char}

for i in range(1, len(pinyin_list)):

pinyin = pinyin_list[i]

prob_map = {}

for phrase, prob in V.iteritems():

character = phrase[-1]

result = Transition.join_emission(pinyin, character)

if not result:

continue

state, new_prob = result

prob_map[phrase + state] = new_prob + prob

if prob_map:

V = prob_map

else:

return V

return V

结果展示

运行input_method/viterbi.py文件,简单的展示一下运行结果:

图片发自简书App

问题统计:

统计字典生成转移矩阵写入数据库的速度太慢,运行一次要将近十分钟。

发射概率矩阵数据不准确,总有一些汉字的拼音不匹配。

训练集太小,实现的输入法不适用于长句子。

python怎么隐藏输入法_用隐马尔科夫模型 python 实现简单拼音输入法相关推荐

  1. Python语音基础操作--10.2隐马尔科夫模型的孤立字识别

    <语音信号处理试验教程>(梁瑞宇等)的代码主要是Matlab实现的,现在Python比较热门,所以把这个项目大部分内容写成了Python实现,大部分是手动写的.使用CSDN博客查看帮助文件 ...

  2. python地图匹配_基于隐马尔科夫模型(HMM)的地图匹配(Map-Matching)算法

    1. 摘要 本篇博客简单介绍下用隐马尔科夫模型(Hidden Markov Model, HMM)来解决地图匹配(Map-Matching)问题.转载请注明网址. 2. Map-Matching(MM ...

  3. 隐马尔科夫模型python代码详解

    1.前向概率算法的实现 import numpy as npO = [0,1,0] Pi= np.array([0.2, 0.4,0.4]) A = np

  4. 隐马尔科夫模型(HMM)笔记(公式+代码)

    文章目录 1. 基本概念 1.1 HMM模型定义 1.2 盒子和球模型 1.3 观测序列生成过程 1.4 HMM模型3个基本问题 2. 概率计算问题 2.1 直接计算法 2.2 前向算法 2.2.1 ...

  5. hmm 求隐藏序列_自然语言处理(3)隐马尔科夫模型 HMM

    1 前言 隐马尔科夫模型(Hidden Markov Model,以下简称 HMM)是比较经典的机器学习模型了,它在语音识别,自然语言处理,模式识别等领域得到广泛的应用.隐马尔科夫模型继承了马尔科夫链 ...

  6. python做马尔科夫模型预测法_李航《统计学习方法》第十章——用Python实现隐马尔科夫模型...

    相关文章: 李航<统计学习方法>第二章--用Python实现感知器模型(MNIST数据集) 李航<统计学习方法>第三章--用Python实现KNN算法(MNIST数据集) 李航 ...

  7. Python隐形马尔科夫实战_隐马尔科夫模型的Python3实现代码

    下面给出计算隐马尔科夫模型的编程代码:from hmmlearn.hmm importGaussianHMMimportdatetimeimportnumpy as npfrom matplotlib ...

  8. 一文读懂NLP之隐马尔科夫模型(HMM)详解加python实现

    一文读懂NLP之隐马尔科夫模型(HMM)详解加python实现 1 隐马尔科夫模型 1.1 HMM解决的问题 1.2 HMM模型的定义 1.2.1HMM的两个假设 1.2.2 HMM模型 1.3 HM ...

  9. 【转】隐马尔科夫模型(HMM)及其Python实现

    原文链接https://applenob.github.io/hmm.html 隐马尔科夫模型(HMM)及其Python实现 目录 1.基础介绍 形式定义 隐马尔科夫模型的两个基本假设 一个关于感冒的 ...

  10. 隐马尔科夫模型,第三种问题解法,维比特算法(biterbi) algorithm python代码

    上篇介绍了隐马尔科夫模型 本文给出关于问题3解决方法,并给出一个例子的python代码 回顾上文,问题3是什么, 下面给出,维比特算法(biterbi) algorithm 下面通过一个具体例子,来说 ...

最新文章

  1. 关于各种回归评价指标MSE、RMSE、MAE、R-Squared、Standard Deviation(标准差)
  2. 安卓9.0刷linux,Ubuntu系统下编译Android 9.0系统
  3. iisapp 查看PID所对应的IIS应用程序池及详细介绍
  4. java12/6作业1
  5. adb 重命名_adb中常用的命令
  6. Icon+启动图尺寸
  7. 魔域手游安卓修改服务器地址,魔域手游服务端商业版
  8. uploader.php,使用uploader上传拍摄的图片php后端代码出错~求助~
  9. 新能源车如何走出“一票否决”的窠臼?
  10. lamp一键安装包+linux,linux下的lanmp/lamp/lnmp一键安装包
  11. 专转本-矩阵的初等变换与线性方程组
  12. 解决近期Windows11更新后无法上网的问题
  13. 分享几个搜索电子书网站
  14. 工程项目管理系统-专注项目数字化管理-工程管理
  15. 【C++课程设计项目】歌手评分系统(代码量1500行含设计文档)
  16. cli sti cld std
  17. DBA所需要具备技能
  18. Redis学习(三)redis的持久化
  19. 如何利用Pycharm将工程文件上传到服务器
  20. PPC WM6.1智能手机上使用日语辞典浅谈

热门文章

  1. Windows字符和字符串处理
  2. Mac 开机慢、反应慢,可清理缓存
  3. form表单提交到controller时出现404的尴尬问题(或链接不到.action、链接不到.do跳404的问题)
  4. 把人脑“森林”上传到计算机:人类脑计划只是一个科幻野心?
  5. 《Excel高手捷径:一招鲜,吃遍天》一第18招 怎样在Excel中插入方框内打勾符号(√)和方框内打叉符号(×)...
  6. STC51单片机串口设置波特率分析对比与ISP程序烧录设置
  7. 航空航天行业工作站应用---EDA仿真计算工作站
  8. 1345: 国际象棋
  9. 中望3d快捷键命令大全_中望3D快捷键设置
  10. win7 计算机定时关机脚本,Win7定时关机命令 win7系统怎么设置定时关机