独家实践 | 使用最新发布的 AllenNLP 训练一个词性标注模型
前言:
前日,人工智能圈的自然语言处理领域(NLP,Natural Language Processing)出了个大事情,著名的艾伦人工智能研究院开源了基于PyTorch的强大NLP处理工具包AllenNLP!NLP领域的研发者们都为之而兴奋。然而在大家都争相报道这条新闻的时候,却没有一家能给出使用AllenNLP搭建实用模型的教程。别人做不出的教程我们集智AI学园能!经过两日的整理与实践,今天我们就把AllenNLP实操教程呈现给大家!
在本教程中,我会带领大家使用AllenNLP构建一个词性标注模型,从搭建网络到训练以及评估,整个流程都非常简单,由此也看出 AllenNLP 是非常实用的 NLP 工具包。
本期内容:
使用 AllenNLP 训练一个词性标注模型
评估模型
使用模型进行词性预测
下期预告
附录一:笔者在安装 AllenNLP 时遇到的坑
附录二:本期模型配置文件
使用 AllenNLP 训练一个词性标注模型
要使用 AllenNLP,首先需要将它的源码下载到本地进行安装,安装方法可以参考“笔者在安装AllenNLP时遇到的坑”。
$ git clone https://github.com/allenai/allennlp.git
$ cd allennlp
本教程的所有命令默认都是在 allennlp 目录下执行的。
在使用 AllenNLP 之前,有两个概念需要科普一下:
1.在 allennlp/allennlp/models 目录下提供了一些定义好的模型,我们这次使用其中的“simple_tagger.py”模型,它由一个词嵌入层和一个LSTM层组成。
在 AllenNLP 中,模型的配置(包括超参数)是通过JSON配置文件来完成的。JSON配置文件是 AllenNLP 的特色之一。
我们本次使用的数据集是 Brown Corpus 语料库的一个子集。在本次实验中,我们将使用4000个随机选择的句子来训练模型,使用另外1000个随机选择的句子作为验证集。
本次实验的JSON配置文件已经定义好,我会在文章末尾附录这个配置文件。在下一篇教程中,我会给大家详细讲解这个配置文件的意义。
而目前,我们只需要注意其中的一部分内容:
"trainer": {
"num_epochs": 40,
"patience": 10,
"cuda_device": -1
}
这一部分内容指定了我们训练模型的参数。
这里 num_epochs 参数指定我们的训练数据集迭代次数。 在最新的Macbook电脑上上,每次迭代大约需要花费1分钟的时间,所以这个训练大概需要40分钟。 patience 参数控制在迭代完成前停止训练,如果验证数据集正确率在10个迭代周期内没有显著提高,则模型自动停止训练。cuda_device 代表是否使用GPU运算。如果有GPU,可以将cuda_device更改为0以使用它。
你可以对配置的参数进行微调,然后运行:
$ python -m allennlp.run train tutorials/getting_started/simple_tagger.json --serialization_dir /tmp/tutorials/getting_started
参数中:serialization_dir 指定了保存模型单词表和训练权重的位置。
此命令执行后将下载数据集并在本地缓存(数据集下载链接已经配置在JSON中了)。
数据集下载完毕后将开始训练模型并打印训练进度:
accuracy 代表模型预测词性标签的正确率,accuracy3 代表模型预测的“最可能的三种词性”里包含正确结果的概率,loss 就是交叉熵损失,训练的越低越好。
在我电脑上运行至第35个训练周期时,模型准确率趋于稳定,训练自动结束:
accuracy 达到92%,accuracy3 达到97%,其实并不是非常出众的结果,但是对咱们的这个小模型来说,这个正确率已经可以了。
现在模型被训练好了,在我们先前指定的 serialization_dir 目录下已经生成了很多文件。其中在 vocabulary 目录下的是模型生成的单词表,每个单词被编码成了一个整数。
在训练结束后会自动生成一个压缩包“model.tar.gz”,其中包含训练的配置,最佳权重,以及单词表。
评估模型
我们训练好模型后,可以在另一个数据集上对它进行评估。 AllenNLP 在文件 sentence.small.test 中准备了另外1000个句子,我们在命令中加入 URL 将它们下载下来。
我们可以使用 evaluate 命令来评估一个模型,在运行模型时指定给它“模型训练完毕生成的压缩文件的位置”和“评估数据集的位置”:
$ python -m allennlp.run evaluate --archive_file /tmp/tutorials/getting_started/model.tar.gz --evaluation_data_file https://allennlp.s3.amazonaws.com/datasets/getting-started/sentences.small.test
运行此操作时,将加载我们之前训练的模型,同时下载评估数据集,然后进行预测:
模型对评估数据的运行结果出来了,准确率还是相当高的(*^__^*)。
是真正用模型做预测的时间了!
要使用模型对语句进行词性预测,需要使用 predict 命令,同时还需要把输入语句以 JSON 文件的形式提供给模型。
下面是我们的输入文件,只有简单的两条语句。
运行命令,查看预测结果:
$ python -m allennlp.run predict /tmp/tutorials/getting_started/model.tar.gz inputs.txt
... lots of logging omitted
{"tags": ["ppss", "bem", "vbg", "at", "nn", "."], "class_probabilities": [[ ... ]]}
{"tags": ["jj", "nn", "nn", "bez", "jj", "."], "class_probabilities": [[ ... ]]}
这里的“标签”是每个句子的词性标签,“class_probabilities”是每个句子的标签的预测分布(太多了,所以上边省略,见下图)。
可以看到模型进行了正确的预测!Natural 被识别为形容词,language、processing、tutorial都被识别为了名词。
好,那到这里,我们就使用 AllenNLP 成功搭建了一个简单的词性预测模型。AllenNLP 作为一个最新发布的 NLP 处理工具,其功能当然不会仅限于此。所以我们会持续为大家推出探索 AllenNLP 强大功能的实操教程,欢迎大家保持关注!
下期预告
下期:AllenNLP 配置JSON文件解析
下下期:AllenNLP 基本模块 Datasets,Instances,Fields使用详解
还有下下下期:AllenNLP Vocabulary 使用详解
这么多精彩内容,还等什么?快快关注 集智AI学园 公众号!
附录
笔者在安装AllenNLP时趟过的坑
安装 AllenNLP 有多种方式,可以参考(https://github.com/allenai/allennlp/blob/master/tutorials/getting_started/installation.md)
我是通过源码来安装的 AllenNLP,安装命令如下:
$ git clone https://github.com/allenai/allennlp.git
$ cd allennlp/
$ INSTALL_TEST_REQUIREMENTS=true scripts/install_requirements.sh
需要注意的问题:
1.一定要使用 Python 3.6 的环境,3.5的环境会报出:
File "/Users/Alex/My/github/allennlp/allennlp/common/registrable.py", line 37
_registry: Dict[Type, Dict[str, Type]] = defaultdict(dict)
^
SyntaxError: invalid syntax
2.下载 en_core_web_sm-1.2.0.tar-2.gz 时出错
在从源码安装 AllenNLP 的过程中会自动执行“python -m spacy download en”命令去下载“en_core_web_sm-1.2.0.tar-2.gz”,此时我遇到了Http超时的错误。虽然错误没有导致 AllenNLP 安装失败,但还是感觉少点什么,所以决定手动下载。
解决方法:
我从 Spacy 官网上查到,上面要下载的其实是一个预训练的模型,可以自行下载安装包,再使用 pip 命令手动安装。
pip install /YourPath/en_core_web_md-1.2.1.tar.gz
安装包我帮你下好了,在集智AI学园公众号回复“spacyen”获取网盘地址。
训练本模型的JSON配置文件
{
"dataset_reader": {
"type": "sequence_tagging",
"word_tag_delimiter": "/",
"token_indexers": {
"tokens": {
"type": "single_id",
"lowercase_tokens": true
},
"token_characters": {
"type": "characters"
}
}
},
"train_data_path": "https://allennlp.s3.amazonaws.com/datasets/getting-started/sentences.small.train",
"validation_data_path": "https://allennlp.s3.amazonaws.com/datasets/getting-started/sentences.small.dev",
"model": {
"type": "simple_tagger",
"text_field_embedder": {
"tokens": {
"type": "embedding",
"embedding_dim": 50
},
"token_characters": {
"type": "character_encoding",
"embedding": {
"embedding_dim": 8
},
"encoder": {
"type": "cnn",
"embedding_dim": 8,
"num_filters": 50,
"ngram_filter_sizes": [5]
},
"dropout": 0.2
}
},
"stacked_encoder": {
"type": "lstm",
"input_size": 100,
"hidden_size": 100,
"num_layers": 2,
"dropout": 0.5,
"bidirectional": true
}
},
"iterator": {"type": "basic", "batch_size": 32},
"trainer": {
"optimizer": "adam",
"num_epochs": 40,
"patience": 10,
"cuda_device": -1
}
}
我们将在下期教程里为大家解析这个文件。
感谢大家的关注~
推荐阅读
教程 | Windows用户指南:如何用Floyd跑PyTorch
学员原创 | 人工智能产品经理的新起点(200页PPT下载)
吐血推荐:超级好用的深度学习云平台Floyd | 集智AI学园
关注集智AI学园公众号
获取更多更有趣的AI教程吧!
搜索微信公众号:swarmAI
集智AI学园QQ群:426390994
学园网站:campus.swarma.org
商务合作|zhangqian@swarma.org
投稿转载|wangjiannan@swarma.org