隐马尔可夫有三个问题,第三个问题就是利用已知模型和序列对隐状态序列I=(I1,I2,....In)进行预测.要想进行预测的话可以使用维特比算法,在写维特比算法的时候总是很多bug或者逻辑错误,之后代码会将每一步进行注释。
首先要初始化词典以及参数,主要就是做一个id与tag和word的相互转换,以及定义转移矩阵A,初始概率Π,以及观测概率B。
然后计算词频,并最后转换成概率,即train函数
最后就是利用维特比算法进行预测,这里是用了动态规划dp,并记录每一步最优概率的路径ptr.
import os
import sys
import numpy as np
import jieba
def log(v):
if v == 0:
return np.log(v + 0.000001)
return np.log(v)
class HMM_PosTagger():
def __init__(self):
# 初始化词典
self.id2tag, self.tag2id = {}, {}
self.word2id, self.id2word = {}, {}
# 初始化参数
self.implicit_num = 0
self.explicit_num = 0
self.pi = None
self.A = None
self.B = None
# 从数据中统计词典
def init_stat(self, textfile):
for line in open(textfile, 'r', encoding='utf-8'):