摘要
NCRFpp是jiesutd在Github开源的序列标注工具:
NCRF++, a Neural Sequence Labeling Toolkit. Easy use to any sequence labeling tasks (e.g. NER, POS, Segmentation). It includes character LSTM/CNN, word LSTM/CNN and softmax/CRF components.
作者jiesutd为了兼顾项目各种运行情况,代码写得非常的周全。但这也为理解整个项目的结构带来了一些困难。本文将围绕序列标注任务对该项目的结构做一个简析,希望有助于大家快速掌握。
模型整体结构
首先,NCRFpp项目本身较为复杂,要详细的梳理、讲述清楚并不容易。
从项目Github主页介绍中可以看到,使用了两种特征:字符和词语(也可以视为字符级别和词语级别的两种分布式表示);然后使用softmax层或者CRF层作为推理层。
项目的运行文件是main.py,因此从main.py开始。main.py打开后,直接滑动到文件最低端。在main函数里面,主要的流程就是:
- 创建一个Data实例(第524行)
- 判断运行环境,并修改Data实例中的选项(545-542行)
- 判断运行目的(train or decode),Data实例生成相应的数据集(547行之后)
- 调用train函数,准备训练(以train运行目的为例,第554行)
- 在train函数中,model = SeqLabel(data)创建一个SeqLabel模型,并将data传入进行初始化设置(第363行)
- 设置优化