1、输入输出文件
- 每一行称为一个token,每个token包含许多列,一般第0列是词本身,最后一列是输出的标记
- 中间的列是词的Pos,可以有多个,如词性、类别
2、特征模板(feature template)
举个栗子:
输入:
He PRP B-NP
reckons VBZ B-VP
the DT B-NP << CURRENT TOKEN
current JJ I-NP
account NN I-NP
template expanded feature
%x[0,0] the
%x[0,1] DT
%x[-1,0] reckons
%x[-2,1] PRP
%x[0,0]/%x[0,1] the/DT
ABC%x[0,1]123 ABCDT123
- 模板由%x[row,col]指定,row表示行偏移,col表示第col列。如,当前元素是the,%x[0,1]表示DT,%x[-1,0]表示reckons
3、模板类型
- Unigram
- 如果一个%x[0,1]模板(利用当前词的第一列(词性)去预测最后一列(输出)),会产生如下函数:
func1 = if (output = B-NP and feature="U01:DT") return 1 else return 0
func2 = if (output = I-NP and feature="U01:DT") return 1 else return 0
func3 = if (output = O and feature="U01:DT") return 1 else return 0
....
funcXX = if (output = B-NP and feature="U01:NN") return 1 else return 0
funcXY = if (output = O and feature="U01:NN") return 1 else return 0
...
当前词的U01特征是DT,当前词的输出是B-NP
当前词的U01特征是DT,当前词的输出是I-NP
当前词的U01特征是DT,当前词的输出是O
当前词的U01特征是NN,当前词的输出是B-NP
当前词的U01特征是NN,当前词的输出是O
#一行英文对应一行中文解释
- 一共由L*N个特征函数,L是输出的类别,N是expanded features的数目
###############################
- Bigram
- 会自动产生当前特征与前一个特征的合并,一共会有L*L*N个特征函数
Unigram与Bigram的区别:
- unigram:| output tag| x |all possible strings expanded with a maro|
- bigram:|output tag| x |output tag| x |all possible strings expanded with a macro|
4、CRF++参数
- iter:迭代次数
- serr:error rate with respect to sentences(or error sentences of all sentences)
- obj:current object value.when this value converges to a fixed point,CRF++ stops the iteration
- diff:relative difference from the previous object value
- -a CRF-L2 or CRF-L1 :正则化项,L2与L1
- -c float : 超参数,C越大,CRF拟合训练数据越好,所以C是一个权衡过拟合和欠拟合的参数
- -f NUM:参与训练特征的阈值,仅使用出现次数不小于NUM次的特征。默认是1。
- -p NUM:线程数,CRF++0.58版本中的默认是12线程。
模型训练:
# 3 crf train
crf_train = "/E/home/mayajun/PycharmProjects/CRF++-0.58/crf_learn -f 3 -p 24
-a CRF-L2 -c 1.5 template.txt dg_train.txt dg_model"
os.system(crf_train)
预测:
# 4 crf test
crf_test = "/E/home/mayajun/PycharmProjects/CRF++-0.58/crf_test -m dg_model dg_test.txt
-o dg_result.txt"
os.system(crf_test)