CRF原理说明请查看上篇博文
参考链接同上篇博文
- 定义CRF中的初始变量,包括特征函数, 特征函数的权重, 词性标注的label也就是状态序列,以及label_id字典。
def __init__(self, feature_functions, labels):
"""
:param feature_functions: 输入的特征函数
:param labels: 输入的训练数据标注
"""
# 特征函数
self.ft_func = feature_functions
# 特征函数的权值
self.w = np.random.rand(len(self.ft_func))
# labels
self.labels = labels
# label_id 的字典
self.label_id = {
value: idx for idx, value in enumerate(self.labels)}
- 定义由输入序列得到所有特征的函数。
也就是对于输入的序列X= {x1, x2,…x3},得到每一个元素 x i x_{i} xi中 ( y j − 1 , y j ) (y_{j-1},y_{j}) (yj−1,yj)组合的所有特征 f k f_{k} fk
(1)先遍历所有的特征函数,得到组合 ( y j − 1 , y j ) (y_{j-1},y_{j}) (yj−1,yj)的所有特征函数;
(2)遍历y也就是labels,得到 j-1时刻 y j − 1 y_{j-1} yj−1的下一时刻的所有可能 y
(3)遍历labels得到所有可能的 y j − 1 y_{j-1} yj−1
(4)输入序列的长度为T, 得到每一个时刻 t ∈ ( 0 , T ) t \in(0,T) t∈(0,T)的所有特征。
def get_all_features(self, x_vec):
"