这段时间了解了隐马尔科夫算法,然后拼音输入法的核心就是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) #定义转移概率表,并定义两个类方法,一个是添加转移概率记录,一个是查询转移概率表+发