使用AllenNLP进行中文文本分类或者其他任务都非常方便,初学NLP的同学一定不要错过!
AllenNLP使用的分词工具主要是spacy,主要用于英文,不能用于中文,但是这个库是可以处理各种语言的,因此我们只需要新增中文的WordSplitter,就可以使用AllenNLP处理中文数据了。此外,该NLP库会将各种复杂的预处理以及后处理帮助你完成,多数情况下只需要自己编辑读取数据的DatasetReader、model以及配置文件,使用起来比较方便。
在前几篇文章中,我们实现了thulac和jieba的中文分词。
街道口扛把子:AllenNLP源码拓展——中文分词2zhuanlan.zhihu.com接下来,我尝试使用AllenNLP处理中文数据,实验选择最简单的中文分类,仅用来验证处理中文数据的可行性,不追求太高的准确度。
准备数据:
- THUCNews的一个子集(10类),形式是一行为一个标签和一段文本,中间用中文空格隔开。
![462db5188363a17f9373143979e3a8b6.png](https://i-blog.csdnimg.cn/blog_migrate/bbaac4a29435fbfa2eef1812960a431e.jpeg)
![83ca16614cffe403ffa58920561adefa.png](https://i-blog.csdnimg.cn/blog_migrate/c4548a99c51fb0c37289fea7b1b8f777.png)
2. 中文词向量,我选择了一个300维的,形式是一行为一个词加300个数字,中间用空格隔开。
https://github.com/Embedding/Chinese-Word-Vectorsgithub.com![5354417aa09f9fed4dd7aa5745650890.png](https://i-blog.csdnimg.cn/blog_migrate/5bada60c5e8e5f527572c53c5e7feea2.png)
3. 读取数据的DatasetReader。需要注意的就是这个数据集中,标签和文本是用中文空格隔开的。
https://github.com/Whu-wxy/allennlp/blob/master/allennlp/data/dataset_readers/text_classification_txt.pygithub.com4. 编辑config文件。这个我尝试了两个基于LSTM的模型,稍有不同。一个是embedding->seq2vec->classifier,另一个是embedding->seq2seq->seq2vec->classifier。
https://github.com/Whu-wxy/allennlp/blob/master/training_config/cnews.jsongithub.com https://github.com/Whu-wxy/allennlp/blob/master/training_config/cnews2.jsongithub.com训练模型:
1.分词速度对比
![1f8f625fe5cc798b34e35cf277d4e7db.png](https://i-blog.csdnimg.cn/blog_migrate/6f8ffefbed10825f9bb41b2dd8725269.jpeg)
![ea8f54ad4b3506976a28e11e7bd32a92.png](https://i-blog.csdnimg.cn/blog_migrate/8b680c2692e270d23b6e9cb6d53fecbd.jpeg)
![30ef96b3167da3da86420fd2a0c31543.png](https://i-blog.csdnimg.cn/blog_migrate/1b6acddf683a929e74e52da5fa9ea6e4.jpeg)
可以看出jieba比thulac分词速度快了好多,所以我最终选择用速度更快的jieba。
2. 训练
训练只需要在控制台输入
allennlp train ./path/config.json -s ./save_path
训练的超参数我仅参考了其他的config文件,随便设置了一下,最终得到的准确度还不错,验证集上最高都是大约95%。
![5f41da81cfab0956aede8cfaf662258b.png](https://i-blog.csdnimg.cn/blog_migrate/58afb1ba200b5d2ce2eb06d490865325.jpeg)
![3f652a08e83a5f9cf1c7f4028a82f833.png](https://i-blog.csdnimg.cn/blog_migrate/5627278d730862c5362fa928839c4039.png)
![29797c0d4889eaee76d496bf22d57688.png](https://i-blog.csdnimg.cn/blog_migrate/ff8a1808c0aacb3004113339272dd911.png)
可以看出效果还是很不错的。
3. Predict
训练完成后,可以在保存的目录下看到model.tar.gz,之后可以使用这个文件进行预测。但是仍然会遇到编码的问题,需要对predictor进行稍微修改。
亲测以下修改方法可行。
![a4093baf242d591f19958f266e9b9304.png](https://i-blog.csdnimg.cn/blog_migrate/1eeb3926e4e5b114e4e39f3624a8e5a1.jpeg)
然后将需要预测的文本保存到一个txt文件,格式是{"sentence":"预测内容"}
然后在控制台输入类似下面的命令进行预测。
allennlp predict ./cnews2/model.tar.gz ./pred.txt --cuda-device
0 --batch-size 1 --predictor text_classifier --output-file ./pred_output
得到的结果如下:
![f45660a25547f6ce53c6303add4d0b20.png](https://i-blog.csdnimg.cn/blog_migrate/aa97becc7174023df50ecbe073449108.jpeg)
我从新浪新闻随便找了几个新闻进行预测,结果如下图,感觉很有趣。
![e9583936c86d7a7d9915ac1f2d8bf0d2.png](https://i-blog.csdnimg.cn/blog_migrate/89af78620692418232979b2ceae0040b.jpeg)
![91a40d6bed747000598d84a19b10ffd1.png](https://i-blog.csdnimg.cn/blog_migrate/d1e2ccdb0598c47378bb3a769a5ea1cf.jpeg)
![afeeba1e2e606a68961fd9c2e3296cb4.png](https://i-blog.csdnimg.cn/blog_migrate/2a63472793fcbe5c75782809e634d74a.jpeg)