这是python 自然语言处理实战核心计算与算法那本书上3.3.2 HMM模型的代码,然后自己加了点备注。
# coding=utf-8
class HMM(object):
def __init__(self):
import os
#后面计算的发射概率,转移概率,和状态的初始概率会放在这里
self.model_file = r'E:\code\nlp\nlp3\hmm_model.pkl'
#状态值的集合,我们这边就是知道其观测值来预测最大可能的状态值,凭借状态值来进行分词
self.state_list=['B','M','E','S']
#参数的加载,用于判断是否需要加载Model_file
self.load_para = False
# 用来加载已计算的中间结果,当需要重新训练的时候需要初始化清空结果
def try_load_model(self,trained):
if trained:
import pickle
with open(self.model_file, 'rb') as f:
self.A_dic = pickle.load(f)
self.B_dic = pickle.load(f)
self.Pi_dic = pickle.load(f)
self.load_para = True
else:
# 状态转移概率(状态->状态的条件概率(也就是在t时刻是这个状态下t+1时刻变成另一个状态的概率)
self.A_dic = {}
# 发射概率(状态->词语的条件概率(也就是这个状态下出现这个词语的概率)
self.B_dic = {}
# 状态的初始概率(在一个句子的第一个字是某个状态的概率)
self.Pi_dic = {}
self.load_para = False
def train(self,path):
# 重置几个概率矩阵
self.try_load_model(False)
# 统计状态出现次数,求p(o)(计算某个状态出现的次数)
Count_dic = {}
#初始化参数
def init_parameters():
#四个状态循环,每个状态都要初始化。
#这边都是字典的形式,state相当于键值
for stat