Torchnlp是用于NLP任务的深度学习库。建立在Pytorch和torchtext上,是一种尝试提供可重复使用的组件,这些组件可以跨任务起作用。当前,它可用于具有双向LSTM CRF模型和变压器网络模型的命名实体识别(NER)和块任务。它可以支持使用Conll 2003格式的任何数据集。更多任务将很快添加
Model类并实施forward()和loss()方法分别返回预测和损失HParams类轻松定义模型的超参数Evaluator和Trainer类以使用模型,数据集迭代器和指标。检查ner.py以获取详细信息Model :处理型号的加载和节省以及相关的超参数HParams :定义超参数的通用类。可以持续Trainer :在数据集上培训给定模型。支持预定义的学习率衰减时间表和提早停止等功能Evaluator :评估数据集和多个预定义或自定义指标上的模型。get_input_processor_words :在推理期间使用将输入字符串快速转换为可以通过模型处理的格式transformer.Encoder , transformer.Decoder :注意的是您需要的全部CRF :有条件的随机场层,可以用作最终输出TransformerTagger :使用变压器网络和CRF实现的序列标记模型BiLSTMTagger :使用双向LSTM和CRF实现的序列标记模型Torchnlp最少需要Python 3.5,并且Pytorch 0.4.0才能运行。检查pytorch的安装步骤。克隆此存储库,并安装其他依赖关系,例如TorchText:
pip install -r requirements.txt
转到项目的根源,并使用Pytest检查完整性:
pytest
安装此项目:
python setup.py
Torchnlp设计用于在Python解释器内部使用,以使其更易于实验而无需键入笨重的命令行参数。
NER任务
NER任务可以在确认CONLL 2003格式的任何数据集上运行。要使用CONLL 2003 NER数据集将数据集文件放在工作空间root的以下目录结构中:
.data
|
|---conll2003
|
|---eng.train.txt
|---eng.testa.txt
|---eng.testb.txt
使用eng.testa.txt验证数据集, eng.testb.txt用作测试数据集。
在设置导入的Python shell中启动NER模块:
python -i -m torchnlp.ner
Task: Named Entity Recognition
Available models:
-------------------
TransformerTagger
Sequence tagger using the Transformer network (https://arxiv.org/pdf/1706.03762.pdf)
Specifically it uses the Encoder module. For character embeddings (per word) it uses
the same Encoder module above which an additive (Bahdanau) self-attention layer is added
BiLSTMTagger
Sequence tagger using bidirectional LSTM. For character embeddings per word
uses (unidirectional) LSTM
Available datasets:
-------------------
conll2003: Conll 2003 (Parser only. You must place the files)
>>>
在Conll 2003数据集上训练变压器模型:
>>> train('ner-conll2003', TransformerTagger, conll2003)
第一个参数是任务名称。您需要在评估和推理期间使用相同的任务名称。默认情况下,火车功能将使用5个窗口的F1指标来提早停止。要更改早期停止标准,请将PREFS全球变量设置为以下内容:
>>> PREFS.early_stopping='lowest_3_loss'
现在,这将使用验证损失作为3个时代窗口的停止标准。模型文件保存在Taskname-modelname目录下。在这种情况下,它是NER-CONLL2003-TRANSFORMERTAGGER
评估测试B数据集拆分上训练的模型:
>>> evaluate('ner-conll2003', TransformerTagger, conll2003, 'test')
它将显示准确性,序列准确性,F1等的指标
进行NER任务的交互式运行训练的模型:
>>> interactive('ner-conll2003', TransformerTagger)
...
Ctrl+C to quit
> Tom went to New York
I-PER O O I-LOC I-LOC
您可以使用BiLSTMTagger类同样地训练双向LSTM CRF模型。自定义超参数非常简单。让我们看一下TransformerTagger的超参数:
>>> h2 = hparams_transformer_ner()
>>> h2
Hyperparameters:
filter_size=128
optimizer_adam_beta2=0.98
learning_rate=0.2
learning_rate_warmup_steps=500
input_dropout=0.2
embedding_size_char=16
dropout=0.2
hidden_size=128
optimizer_adam_beta1=0.9
embedding_size_word=300
max_length=256
attention_dropout=0.2
relu_dropout=0.2
batch_size=100
num_hidden_layers=1
attention_value_channels=0
attention_key_channels=0
use_crf=True
embedding_size_tags=100
learning_rate_decay=noam_step
embedding_size_char_per_word=100
num_heads=4
filter_size_char=64
现在让我们禁用CRF层:
>>> h2.update(use_crf=False)
Hyperparameters:
filter_size=128
optimizer_adam_beta2=0.98
learning_rate=0.2
learning_rate_warmup_steps=500
input_dropout=0.2
embedding_size_char=16
dropout=0.2
hidden_size=128
optimizer_adam_beta1=0.9
embedding_size_word=300
max_length=256
attention_dropout=0.2
relu_dropout=0.2
batch_size=100
num_hidden_layers=1
attention_value_channels=0
attention_key_channels=0
use_crf=False
embedding_size_tags=100
learning_rate_decay=noam_step
embedding_size_char_per_word=100
num_heads=4
filter_size_char=64
使用它重新培训模型:
>>> train('ner-conll2003-nocrf', TransformerTagger, conll2003, hparams=h2)
与模型一起,还保存了超参数,因此在评估过程中无需通过HParams对象。另请注意,默认情况下,它不会覆盖任何现有的模型目录(将改为重命名)。更改该行为设置PERFS变量:
>>> PREFS.overwrite_model_dir = True
PREFS变量自动在prefs.json中持续存在
分块任务
CONLL 2000数据集可用于分区任务。数据集将自动从公共存储库下载,因此您无需手动下载它。
开始块任务:
python -i -m torchnlp.chunk
训练变压器模型:
>>> train('chunk-conll2000', TransformerTagger, conll2000)
存储库中没有提供验证分区,因此培训集的10%用于验证。
评估测试集的模型:
>>> evaluate('chunk-conll2000', TransformerTagger, conll2000, 'test')
transformer.Encoder , transformer.Decoder和CRF模块可以独立导入,因为它们仅依赖于Pytorch:
from torchnlp.modules.transformer import Encoder
from torchnlp.modules.transformer import Decoder
from torchnlp.modules.crf import CRF
请参阅源代码中的评论以获取有关使用情况的更多详细信息