隐马尔科夫算法之实现简易版的拼音输入法代码详解

本文通过分析一个GitHub上的拼音输入法代码,深入理解隐马尔科夫模型(HMM)在拼音输入法中的应用。采用维特比算法动态规划解决最优路径问题,讨论模型训练、数据存储以及代码存在的优化空间。
摘要由CSDN通过智能技术生成

这段时间了解了隐马尔科夫算法,然后拼音输入法的核心就是HMM,然后从github上找了一个输入法实现的代码来更透彻的理解算法,本文代码来源:https://github.com/LiuRoy/Pinyin_Demo,如果侵权,请联系我删除!!!

一、 拼音输入法的原理概述

1.主要原理

动态规划,用的是维特比算法实现的

2. 模型

3.  算法原理

 Y1,...,Yn为输入的拼音串,Wi1,Wi2,Win是第i个音Yi的候选汉字(用Wi代表第i个拼音的候选汉字),如上图所示,将候选字连接起来可以组成很多很多的句子,每个句子都有一条路径一一对应,拼音输入法就是要根据上下文在给定的拼音条件下找到一个最优的句子,即,对应到上图中就是寻找从起点到终点的一条最短距离:

     利用隐马尔科夫模型简化之得到:

 定义距离:D(Wi-1,Wi)=-logP(Wi|Wi-1)*P(Yi|Wi),以此作为两个节点间的距离计算公式,利用有限状态机和动态规划进行求解

二、代码解析

 1.模型训练

该代码使用sqlite数据库来保存模型参数,参数主要有初始概率、转移概率和发射概率,主要是数据库的一些知识:

1.1 定义数据表 (hmm_tables.py)

import os

from sqlalchemy import Column, String, Integer, Float, create_engine, desc
from sqlalchemy.orm import sessionmaker

from pinyin.model.common import current_dir, BaseModel

db_name = os.path.join(current_dir, 'hmm.sqlite')
engine = create_engine('sqlite:///{}'.format(db_name))
HMMSession = sessionmaker(bind=engine)

#定义转移概率表,并定义两个类方法,一个是添加转移概率记录,一个是查询转移概率表+发射概率表的连接表
# 查询的过程有两个表的连接过程,将转移表的后一个汉字和发射表的汉字作为键,连接在一起
#由于概率取了lg,概率相乘等于lg形式的概率相加

class Transition(BaseModel):

    __tablename__ = 'transition'

    id = Column(Integ
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值