1.介绍
序列标记模型在许多NLP任务中非常流行,如命名实体识别(Named Entity Recognition, NER)、词性标记(part-of-speech, POS)和分词。目前最先进的序列标记模型大多采用具有输入字特征的CRF结构。LSTM(或双向LSTM)是一种常用的基于深度学习的序列标记特征提取方法。CNN也可以使用,因为它的计算速度更快。此外,词内的特征也可以用来表示词,这些特征可以通过字符LSTM或字符CNN结构或人定义的神经特征来捕获。
ncrf++ 是一个基于PyTorch的框架,具有输入特性和输出结构的灵活选择。使用ncrf++的神经序列标记模型的设计完全可以通过配置文件进行配置,不需要任何代码工作。ncrf++可以看作是著名的统计CRF框架crf++的神经网络版本。
该框架已被ACL 2018作为演示文件。使用ncrf++的详细实验报告和分析被COLING 2018评为最佳论文。
ncrf++支持三个层次的不同结构组合:字符序列表示、字序列表示和推理层。
- 字符序列表示:字符LSTM、字符GRU、字符CNN和手工制作的单词特征。
- 词序列表示:词LSTM,词GRU,词CNN。
- 推理层:Softmax, CRF。
2. 要求
python:2或3
pytorch:1.0
3. 优点
- 完全可配置:所有的神经模型结构可以设置一个配置文件。
- 最先进的系统性能:与最先进的模型相比,基于ncrf++构建的模型可以提供相当或更好的结果。
- 灵活的功能:用户可以定义自己的功能和预先训练的功能嵌入。
- 运行速度快:ncrf++充分利用了批处理操作,使系统在GPU的帮助下变得高效(训练时>1000sent/s,解码时>2000sent /s)。
- N最佳输出:ncrf++支持nbest解码(及其概率)。
3.用法
ncrf++支持通过配置文件设计神经网络结构。程序可以在两种状态下运行;训练和解码。(此存储库中包含了示例配置和数据)
在训练中状态:
python main.py --config demo.train.config
在解码状态:
python main.py --config demo.decode.config
配置文件控制网络结构、I/O、训练设置和超参数。
这里列出了详细的配置和解释。
ncrf++分为三层(如下所示):字符序列层;字序列层和推理层。通过使用配置文件,可以很容易地复制大多数最先进的模型,而无需编码。另一方面,用户可以通过设计自己的模块来扩展每一层(例如,他们可能希望设计自己的神经结构,而不是CNN/LSTM/GRU)。我们的分层设计使得模块扩展更加方便,模块扩展指令可以在这里找到。
4. 数据格式
- 可以在sample_data中引用该数据格式。
- ncrf++同时支持BIO和BIOES(BMES)标签方案。
- 注意,IOB格式(不同于BIO)目前是不支持的,因为这个标签方案是旧的,工作比其他方案更差。
- 本文解释了这三种标签方案之间的区别论文地址点此位置。
- 有一个脚本,它在IOB/BIO/BIOES之间转换标签方案。欢迎试用。
5.性能
- 在相同结构下,CONLL 2003英语NER任务的结果优于SOTA。
- CharLSTM+WordLSTM+CRF: 91.20 vs 90.94 of Lample .etc, NAACL16;
- CharCNN+WordLSTM+CRF: 91.35 vs 91.21 of Ma .etc, ACL16.
By default 情况下,LSTM为双向LSTM。
ID | Model | Nochar | CharLSTM | CharCNN |
---|---|---|---|---|
1 | WordLSTM | 88.57 | 90.84 | 90.73 |
2 | WordLSTM+CRF | 89.45 | 91.20 | 91.35 |
3 | WordCNN | 88.56 | 90.46 | 90.30 |
4 | WordCNN+CRF | 88.90 | 90.70 | 90.43 |
在统计实验下比较了12个神经序列标记模型({charLSTM, charCNN, None} x {wordLSTM, wordCNN} x {softmax, CRF})在三个基准(POS, Chunking, NER)上,详细的结果和比较在COLING 2018论文 Design Challenges and Misconceptions in Neural Sequence Labeling.
6. 添加手工制作的特性
ncrf++集成了几种SOTA神经序列特征提取器:CNN (Ma .等,ACL16)、LSTM (Lample .等,NAACL16)和GRU (Yang .等,ICLR17)。此外,手工制作的功能已经被证明在序列标记任务中很重要。ncrf++允许用户设计自己的功能,比如大写、POS标签或其他功能。用户可以通过配置文件(特征嵌入大小、预训练特征嵌入等)来配置自定义的特征。
示例输入数据格式见train.cappos。bmes,它包括两个人类定义的特性[POS]和[Cap]。([POS]和[Cap]是两个例子,你可以给你的特性任何你想要的名称,只要遵循格式[xx]并在配置文件中用相同的名称配置特性。
用户可以使用命令对配置文件中的各个特性进行配置:
feature=[POS] emb_size=20 emb_dir=%your_pretrained_POS_embedding
feature=[Cap] emb_size=20 emb_dir=%your_pretrained_Cap_embedding
未经过预训练的嵌入特征将被随机初始化。
7. 速度
ncrf++采用全批处理计算实现,使得它在模型训练和解码方面都非常高效。利用ncrf++构建的LSTMCRF模型,在Nvidia GTX 1080 GPU和大批量的帮助下,在训练和解码状态下,LSTMCRF模型分别可以达到1000发送/s和2000发送/s
8.最好的解码
传统的CRF结构只解码一个具有最大概率的标签序列(即1-best输出)。虽然ncrf++可以提供很大的选择,但它可以解码具有前n个概率的n个标签序列(即n-最佳输出)。nbest译码得到了几种流行的统计CRF框架的支持。然而,据我们所知,ncrf++是唯一也是第一个支持nbest解码的神经CRF模型工具包。
在实现中,当nbest=10时,在ncrf++中构建的CharCNN+WordLSTM+CRF模型在CoNLL 2003 NER任务上可以得到97.47%的oracle F1值(当nbest=1时F1 = 91.35%)。
9.复制论文结果和超参数调整
为了重现COLING 2018论文中的结果,只需要在配置文件demo.train.config中将迭代=1设置为迭代=100,并在该配置文件中配置自己的文件目录。默认的配置文件描述了Char CNN + Word LSTM + CRF模型,可以通过修改相应的配置来构建自己的模型。这个演示配置文件中的参数在论文中是相同的。(注意Word CNN相关模型需要稍微不同的参数,细节可以在COLING论文中找到。)
如果想在新的任务或数据集中使用这个框架,这里有一些由@Victor0118提供的调优技巧。
10.论文
如果在论文中使用ncrf++,引用我们的ACL演示论文:
@inproceedings{yang2018ncrf,
title={NCRF++: An Open-source Neural Sequence Labeling Toolkit},
author={Yang, Jie and Zhang, Yue},
booktitle={Proceedings of the 56th Annual Meeting of the Association for Computational Linguistics},
Url = {http://aclweb.org/anthology/P18-4013},
year={2018}
}
如果使用ncrf++的实验结果和分析,引用我们的COLING论文:
@inproceedings{yang2018design,
title={Design Challenges and Misconceptions in Neural Sequence Labeling},
author={Yang, Jie and Liang, Shuailong and Zhang, Yue},
booktitle={Proceedings of the 27th International Conference on Computational Linguistics (COLING)},
Url = {http://aclweb.org/anthology/C18-1327},
year={2018}
}
11.未来工作
文本分类工作
支持API的使用
上传分词/词性标签/NER训练模型
启用加载预训练的ELMo参数
添加BERT特征提取层