模型训练好之后,可以利用模型计算训练数据的维特比分隔,得到抽取后的模板
命令如下
python chsmm.py \
-data data/labee2e/ \
-emb_size 300 \
-hid_size 300 \
-layers 1 \
-K 55 \
-L 4 \
-log_interval 200 \
-thresh 9 \
-emb_drop \ # true dropout on embeddings
-bsz 16 \
-max_seqlen 55 \
-lr 0.5 \
-sep_attn \ # true
-max_pool \ # true, for word-fields
-unif_lenps \ # true?
-one_rnn \ # true?
-Kmul 5 \
-mlpinp \ # true
-onmt_decay \ #true?
-cuda \
-load models/e2e-55-5.pt # 训练好的模型
-label_train \ # true
| tee segs/seg-e2e-300-55-5.txt # 保存标准输出
label_train
对每一个训练样本,它的格式之前介绍过
第一个是词,seqlen x bsz
第二项是label,bsz x (start, end, label)
第三项是生成的特征 bsz x nfields x nfeats,
第四项是生成句子每一个词对标数据的位置seqlen x bsz x max_locs
第五项是生成句子每一个词含有go、end的特征seqlen x bsz x max_locs x nfeats
这里除了第二项,在这个函数中都用到了。
经历了:
- 把copy信息和数据编码在一起
- 把unknown词处理掉
- 把用到的Field去重后,长度处理统一
- 编码
- 求转移概率
- 求观测概率
- 前向后向传播求观察概率
- 维特比算法求得分隔片段
这个过程是把最终生成的文案,变成模板,就是把槽位抠取出来。