CRF++源码分析——模型的加载
接触CRF++有一段时间了,也看了一些CRF++的一些源码,再次打算对CRF++的源码进行分析,整理下以前对CRF++的理解。对CRF++的分析主要分为三部分:
1-模型的训练
2-模型的加载
3-任务的应用
由于模型训练的分析比较复杂,所以我打算放在最后来分析,按2->3->1的顺序来讲。关于CRF++的一些基本知识不再单独讲解,不熟悉的可以参考CRF++自带的说明文档,或者和说明文档比较接近的这篇文章来了解!本文以CRF++中自带样例中的一个(/example/chunking下)来分析。
由于知识储备有限,分析的有问题的地方还请见谅和指教!
CRF++在执行具体任务(对各种序列打标签)之前会将学习到的模型加载到自己的内存中,本模块主要分析CRF++加载模型的过程!
1、特征值
为了下面的讲解方便,我们引入特征值的概念。
我们知道对于Unigram类型的特征模板,产生的特征函数的数量是L.N,对于Bigram类型的特征模板,产生特征函数的数量是L.L.N(其中L是标注集中类别数量,N是从模板中扩展处理的字符串种类)。我们在特征模板与特征函数之间增加一层概念。
设x是特征模板t扩展处理的字符串集X(t)(上边的N表示的是本集合的大小\势)元素,我们将x应用于T(即将T所指定的位置的字符串指定为x)得到T的一个特征值。我们有(Y表示标注集,Y的大小为L):
- 特征值是包括特征模板与对应位置字符串组成的二元组,特征模板t生成的特征值集合为
V(t)={ (t,x)|x∈X(t)},|V(t)|=|X(t)|=N V ( t ) = { ( t , x ) | x ∈ X ( t ) } , | V ( t ) | = | X ( t ) | = N。
- Unigram特征函数是包括特征模板,对应位置字符串和标注组成的三元组,U特征模板t生成的特征函数的集合
F(t)={ (t,x,y)|x∈X(t),y∈Y}={ (v,y)|v∈V(t),y∈Y},|F(t)|=|V(t)|.|Y|=NL F ( t )