HMM分词
理论至https://blog.csdn.net/weixin_42498517/article/details/102659784
训练语料为人民日报
# -*- coding:utf-8 -*-
# @Time : 2019/12/5 14:30
# @Author : Ray.X
"""
Use HMM for Chinese word segmentation
训练语料为人民日报
"""
import os
import pickle
class HMM:
def __init__(self):
"""
定义模型保存位置
状态集合[S, B, E, M] S 单独成词 B词首E词中M词尾
加载参数,判断是否需要重新训练
"""
self.module_file = 'model/hmm_model.pkl'
self.states_list = ['S', 'B', 'E', 'M']
self.load_para = False # 是否训练
self.trans_dic = {
} # 状态转移概率
self.emit_dic = {
} # 发射概率
self.start_dic = {
} # 初始概率
self.count_dic = {
} # 统计状态出现次数
self.V = [{
}] # 统计最大概率路径
def load_model(self, trained):
"""
@param trained: 判断是使用模型,还是训练模型。
@return: 训练模型则初始化清空初始概率、转移概率、发射概率
"""
if trained:
with open(self.module_file, 'rb') as f:
self.start_dic = pickle.load(f)
self.trans_dic = pickle.load(f)
self.emit_dic = pickle.load(f)
self.load_para = True
else: # 清空
self.load_para = False
self.trans_dic = {
}
self.emit_dic = {
}
self.start_dic = {
}
def init_parameters(self):
"""
初始化参数
@return:
"""
for state in self.states_list:
self.trans_dic[state] = {
s: 0.0 for s in self.states_list} # 初始化 状态转移矩阵
# {'S': {'S': 0.0, 'B': 0.0, 'E': 0.0, 'M': 0.0},
# 'B': {'S': 0.0, 'B': 0.0, 'E': 0.0, 'M': 0.0},
# 'E': {'S': 0.0, 'B': 0.0, 'E': 0.0, 'M': 0.0},
# 'M': {'S': 0.0, 'B': 0.0, 'E': 0.0, 'M': 0.0}}
self.emit_dic[state] = {
} # 初始化 状态发射矩阵
# {'S': {',': 3.0, '新': 1.0, '的': 2.0},
# 'B': {'中': 3.0, '儿': 1.0, '踏': 1.0},
# 'E': {'年': 1.0, '亿': 1.0, '华': 1.0},
# 'M': {'9': 1.0, '8': 1.0, '6': 1.0, '产': 1.0}}
self.start_dic[state] = 0.0 # 初始化 初始概率
# {'S': 0, 'B': 1, 'E': 0, 'M'}
self.count_dic[state] = 0 # 初始化每个状态出现次数
# {'S': 0, 'B': 1, 'E': 0, 'M'}
def train(self, path)