NLP的项目流程比较繁琐,正好现在又AllenNLP这个基于PyTorch的工具可以用于规范数据处理,模型构建、训练和测试,感觉不错。之前看了一篇论文,作者用TensorFlow 1.13版本写的一个NLP项目,感觉实在是复杂。
AllenNLP概要
先看一下AllenNLP(https://allennlp.org/)在GitHub页面中的概要,关键就是下面这个表格:
allennlp | an open-source NLP research library, built on PyTorch |
---|---|
allennlp.commands | functionality for a CLI and web service |
allennlp.data | a data processing module for loading datasets and encoding strings as integers for representation in matrices |
allennlp.models | a collection of state-of-the-art models |
allennlp.modules | a collection of PyTorch modules for use with text |
allennlp.nn | tensor utility functions, such as initializers and activation functions |
allennlp.training | functionality for training models |
AllenNLP主要分为六个模块:
- commands:处理命令行和网络服务的一些函数;
- data:数据处理,数据集加载,将字符串表示为整数;
- models:一些state-of-the-art模型;
- modules:一些用于处理文本的PyTorch模块;
- nn:张量操作的一些函数,包括初始化、激活函数等等;
- training:用于训练模型的一些函数;
AllenNLP官方样例代码
先看看官方给出的样例代码,简化版的tutorial。这份代码是写在一个Python文件中的,实际项目中会分成各个文件和文件夹。
导入库
from typing import Iterator, List, Dict
import torch
import torch.optim as optim
import numpy as np
from allennlp.data import Instance
from allennlp.data.fields import TextField, SequenceLabelField
from allennlp.data.dataset_readers import DatasetReader
from allennlp.common.file_utils import cached_path
from allennlp.data.token_indexers import TokenIndexer, SingleIdTokenIndexer
from allennlp.data.tokenizers import Token
from allennlp.data.vocabulary import Vocabulary
from allennlp.models import Model
from allennlp.modules.text_field_embedders import TextFieldEmbedder, BasicTextFieldEmbedder
from allennlp.modules.token_embedders import Embedding
from allennlp.modules.seq2seq_encoders import Seq2SeqEncoder, PytorchSeq2SeqWrapper
from allennlp.nn.util import get_text_field_mask, sequence_cross_entropy_with_logits
from allennlp.training.metrics import CategoricalAccuracy
from allennlp.data.iterators import BucketIterator
from allennlp.training.trainer import Trainer
from allennlp.predictors import SentenceTaggerPredictor
torch.manual_seed(1)
typing
库是Python标准库中用于提供类型注释的,torch
库就是PyTorch。allennlp.data
用来组织模型处理的数据,其中每个训练样本被组织成Instance
,每个Instance
中有不同的字段Field
s,这里用的是TxetField
和SequenceLabelField
;allennlp.data.dataset_readers.DatasetReader
是用于读取数据的类,大多数AllenNLP代码必须实现的两个类之一,另一个是allennlp.models.Model
;allennlp.common.file_utils.cached_path
是用于下载文件的,也可以指定本地的文件;allennlp.data
中的几个token相关的类是用来将文本的token映射为indices(就当是一个token映射到一个整数,token->id),allennlp.data.vocabularly
用来将这些映射组合起来构成单词表;allennlp.modules
和allennlp.nn.util
中的几个Embedding相关的类,是用来给模型添加词嵌入层的;allennlp.training.metrics
中的类是用来评测模型的;allennlp.data.iterator
中的DataIterator
类是数据读取的迭代