0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何用隐马尔可夫模型实现中文拼音输入

马哥Linux运维 2017-12-11 16:22 次阅读

根据此训练得出隐马尔科夫模型,用维特比算法实现了一个简单的拼音输入法。

原理简介

隐马尔科夫模型

抄一段网上的定义:

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

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

viterbi算法

维特比算法,思想是动态规划,代码比较简单就不赘述。

代码解释

model定义

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

数据表定义如下:

classTransition(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)

classEmission(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)

classStarting(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,不写入数据库。有一点注意的是为了防止概率计算的时候因为越算越小导致计算机无法比较,所有的概率都进行了自然对数运算。统计的结果如下:

转移概率矩阵

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

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

发射概率矩阵

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

viterbi实现

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

def viterbi(pinyin_list):

"""

viterbi算法实现输入法

Aargs:

pinyin_list (list): 拼音列表

"""

start_char=Emission.join_starting(pinyin_list[0])

V={char:probforchar,probinstart_char}

foriinrange(1,len(pinyin_list)):

pinyin=pinyin_list[i]

prob_map={}

forphrase,probinV.iteritems():

character=phrase[-1]

result=Transition.join_emission(pinyin,character)

ifnotresult:

continue

state,new_prob=result

prob_map[phrase+state]=new_prob+prob

ifprob_map:

V=prob_map

else:

returnV

returnV

结果展示

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

问题统计:

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

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

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • python
    +关注

    关注

    55

    文章

    4778

    浏览量

    84439
  • 隐马尔科夫模型

    关注

    0

    文章

    4

    浏览量

    1338

原文标题:隐马尔科夫模型 python 实现简单拼音输入法

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于马尔模型的音频自动分类

    音频的自动分类,尤其是语音和音乐的分类,是提取音频结构和内容语义的重要手段之一,它在基于内容的音频检索、视频的检索和摘要以及语音文档检索等领域都有重大的应用价值.由于马尔
    发表于 03-06 23:50

    基于概率的统计分析马尔模型

    图解马尔模型(HMM)
    发表于 08-20 14:17

    马尔模型的组成

    自然语言处理——62 马尔模型
    发表于 10-14 06:46

    【PIMF】OpenHarmony啃论文俱乐部——OpenHarmony标准系统上输入法以及中文拼音输入法原理

    法。 拼音输入法是最合理的中文输入方法。拼音输入法属于一种编码输入法。其基本实现原理依赖于
    发表于 05-23 11:02

    谷歌拼音输入法2.3.14.85 最新版

    谷歌拼音输入法 谷歌拼音输入法1.0.19.0 最新版下载介绍: 聪明的谷歌拼音输入法五大特色: 智能组句:选词准确率高,能聪明地理解您的意图,短句长句都合适
    发表于 06-10 09:20 0次下载

    微软拼音输入法2007

    微软拼音输入法2007 支持 3 种不同的输入风格,微软拼音新体验、微软拼音经典和 ABC 输入风格。您可以从微软
    发表于 02-12 08:49 18次下载

    基于马尔模型的火焰检测

    提出一种利用马尔模型对普通视频中的火焰进行分析的方法,除应用运动和颜色分析对火焰进行识别外,还通过
    发表于 04-14 08:36 28次下载

    基于马尔的系统入侵检测方法

    针对入侵检测中普遍存在误报与漏报过高的问题,本文提出一种新的基于马尔模型的系统入侵检测方法。该方法以程序正常执行过程中产生的系统调用序
    发表于 08-05 09:47 8次下载

    51单片机的中文拼音输入法-c语言源程序

    51单片机的中文拼音输入法-c语言源程序:拼音输入法杳询函数: unsigned char code * py_ime(unsigned char input_py_val[]);input_py_val为已
    发表于 08-23 11:00 142次下载

    马尔模型(HMM)攻略(有具体例子-方便理解)

    马尔模型(HMM)攻略,手势识别算法
    发表于 12-07 18:00 0次下载

    基于改进的马尔模型的态势评估方法

    针对马尔模型(HMM)参数难以配置的问题,提出一种改进的基于
    发表于 12-03 10:24 0次下载
    基于改进的<b class='flag-5'>隐</b><b class='flag-5'>马尔</b><b class='flag-5'>可</b><b class='flag-5'>夫</b><b class='flag-5'>模型</b>的态势评估方法

    基于马尔模型的短波认知频率选择方法

    针对短波频谱利用率低下及频率选择不够智能的局限性,提出一种基于马尔模型( HMM)的短波认知频率选择方法。应用认知无线电原理,将短波传
    发表于 12-18 16:03 0次下载
    基于<b class='flag-5'>隐</b><b class='flag-5'>马尔</b><b class='flag-5'>可</b><b class='flag-5'>夫</b><b class='flag-5'>模型</b>的短波认知频率选择方法

    基于马尔模型的软件状态评估预测方法

    状态进行客观、准确地评估和预测,成为亟待解决的问题.为此,提出了一种基于马尔模型的软件系统状态评估预测方法.该方法基于软件系统外在特征
    发表于 01-05 10:56 1次下载
    基于<b class='flag-5'>隐</b><b class='flag-5'>马尔</b><b class='flag-5'>可</b><b class='flag-5'>夫</b><b class='flag-5'>模型</b>的软件状态评估预测方法

    基于马尔预测的功率博弈机制

    用户的需求是保障系统正常运行的关键。 为了解决无线资源竞争中功率博弈的博弈者获得的环境信息具有非对称性问题,提出了一种基于马尔预测的功率博弈机制。该机制通过建立
    发表于 02-02 14:23 0次下载
    基于<b class='flag-5'>隐</b><b class='flag-5'>马尔</b><b class='flag-5'>可</b><b class='flag-5'>夫</b>预测的功率博弈机制

    基于马尔模型的公交乘客出行链识别

    基于马尔模型的公交乘客出行链识别
    发表于 07-02 15:18 4次下载