一打开控制台窗口就中文输入_AllenNLP——有史以来最便捷的中文文本分类

使用AllenNLP进行中文文本分类或者其他任务都非常方便,初学NLP的同学一定不要错过!

AllenNLP使用的分词工具主要是spacy,主要用于英文,不能用于中文,但是这个库是可以处理各种语言的,因此我们只需要新增中文的WordSplitter,就可以使用AllenNLP处理中文数据了。此外,该NLP库会将各种复杂的预处理以及后处理帮助你完成,多数情况下只需要自己编辑读取数据的DatasetReader、model以及配置文件,使用起来比较方便。

在前几篇文章中,我们实现了thulac和jieba的中文分词。

街道口扛把子:AllenNLP源码拓展——中文分词2​zhuanlan.zhihu.com
街道口扛把子:AllenNLP源码拓展——中文分词​zhuanlan.zhihu.com

接下来,我尝试使用AllenNLP处理中文数据,实验选择最简单的中文分类,仅用来验证处理中文数据的可行性,不追求太高的准确度。

准备数据:

  1. THUCNews的一个子集(10类),形式是一行为一个标签和一段文本,中间用中文空格隔开。
中文文本分类问题:THUCNews数据集 - qq_36047533的博客 - CSDN博客​blog.csdn.net

462db5188363a17f9373143979e3a8b6.png

83ca16614cffe403ffa58920561adefa.png

2. 中文词向量,我选择了一个300维的,形式是一行为一个词加300个数字,中间用空格隔开。

https://github.com/Embedding/Chinese-Word-Vectors​github.com

5354417aa09f9fed4dd7aa5745650890.png

3. 读取数据的DatasetReader。需要注意的就是这个数据集中,标签和文本是用中文空格隔开的。

https://github.com/Whu-wxy/allennlp/blob/master/allennlp/data/dataset_readers/text_classification_txt.py​github.com

4. 编辑config文件。这个我尝试了两个基于LSTM的模型,稍有不同。一个是embedding->seq2vec->classifier,另一个是embedding->seq2seq->seq2vec->classifier。

https://github.com/Whu-wxy/allennlp/blob/master/training_config/cnews.json​github.com https://github.com/Whu-wxy/allennlp/blob/master/training_config/cnews2.json​github.com

训练模型:

1.分词速度对比

1f8f625fe5cc798b34e35cf277d4e7db.png
jieba

ea8f54ad4b3506976a28e11e7bd32a92.png
jieba

30ef96b3167da3da86420fd2a0c31543.png
thulac

可以看出jieba比thulac分词速度快了好多,所以我最终选择用速度更快的jieba。

2. 训练

训练只需要在控制台输入

allennlp train ./path/config.json -s ./save_path

训练的超参数我仅参考了其他的config文件,随便设置了一下,最终得到的准确度还不错,验证集上最高都是大约95%。

5f41da81cfab0956aede8cfaf662258b.png
得到的中文词典

3f652a08e83a5f9cf1c7f4028a82f833.png
config1训练曲线

29797c0d4889eaee76d496bf22d57688.png
config2训练曲线

可以看出效果还是很不错的。

3. Predict

训练完成后,可以在保存的目录下看到model.tar.gz,之后可以使用这个文件进行预测。但是仍然会遇到编码的问题,需要对predictor进行稍微修改。

亲测以下修改方法可行。

a4093baf242d591f19958f266e9b9304.png

然后将需要预测的文本保存到一个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
左边是源文件,右边是输出结果的文件

我从新浪新闻随便找了几个新闻进行预测,结果如下图,感觉很有趣。

e9583936c86d7a7d9915ac1f2d8bf0d2.png

91a40d6bed747000598d84a19b10ffd1.png

afeeba1e2e606a68961fd9c2e3296cb4.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值