本篇文章将学习paddlepaddle一个sentiment analysis的例子。
主要分为几步:
一、下载imdb数据集并进行数据拷贝
运行get_imdb.sh脚本。在虚拟机中用wget方式下载太慢了,我是直接在本机下载后,ftp上传到虚拟机的,稍微修改一下脚本即可。其中imdb是一个著名的互联网电影数据库,这里下载的是Stanford大学提供的数据语料。
二、imdb数据集目录结构及说明
- test
- neg
- 0_2.txt
- …
- pos
- 1_10.txt
- …
- labeledBow.feat
- urls_neg.txt
- urls_pos.txt
- neg
- train
- neg
- 0_3.txt
- …
- pos
- 1_10.txt
- …
- unsup
- 2_0.txt
- …
- labeledBow.feat
- unsupBow.feat
- urls_neg.txt
- urls_pos.txt
- urls_unsup.txt
- neg
- imdb.vocab
- imdbEr.txt
- README
数据集说明:
1、总共50000条电影评论及评分语料,25000条用于train训练,25000条用于test测试,属于典型的平衡语料库。
2、imdb.vocab是整个语料的词典,可用于分词,也用于查询单词的id;imdbEr.txt是词典中每个单词的average polarity(类似于TDF之类)。
3、正面pos的评分范围是大于等于7分(总分10分),负面neg的评分范围是小于等于4分。
4、在test和train测试集中,正面pos和负面neg数据各为12500条,数据格式均为文本格式,命名规则为{文件id}_{评分}txt,如:1_10.txt代表id为1的文章,评分是10分。
5、在train测试集中,还有一个未标注的数据集unsup,共50000条,每个文章的评分均是0,此数据集用于非监督学习之用。
6、*.feat文件中存储的是libSVM所需的数据格式,如下:
每一行代表一个评论的特征,第一列,如10,代表得分,第二列以后代表特征(词)及其频次,如0:7代表词典(imdb.vocab)中第一个单词(即the)出现了7次。
7、urls_*.txt是评论的url地址,暂时未用到。
8、详细说明,可参看其README文件及paddlepaddle官方文档。
三、数据预处理
这里只用到了标注好的训练和测试数据,运行demo/sentiment/preprocess.sh脚本:
set -e
echo "Start to preprcess..."
data_dir="./data/imdb"
python preprocess.py -i $data_dir
echo "Done."
执行后,会生成一些数据文件:
1、dict.txt:在训练数据基础上生成的词典,它与上面imdb的imdb.vocab不一样,这里分词根本没有用到imdb.vocab。
2、labels.list:就两行数据。
neg 0
pos 1
3、test.list和train.list:分别为一行数据。
./data/pre-imdb/test_part_000
./data/pre-imdb/train_part_000
4、test_part_000和train_part_000:标注好的测试和训练数据,其中,训练数据被随机打乱顺序。
test_part_000数据
train_part_000数据
四、训练数据
运行 demo/sentiment/train.sh:
由于是虚拟机单CPU进行训练,每一轮(200个batch)时间较长。每一轮训练完成后,会把模型文件存储到model_output文件夹,如上图。总共跑了七轮,以下是第七轮的log:
I0923 02:12:09.063531 9787 TrainerInternal.cpp:162] Batch=10 samples=1280 AvgCost=0.000370172 CurrentCost=0.000370172 Eval: classification_error_evaluator=0 CurrentEval: classification_error_evaluator=0
I0923 02:17:40.628078 9787 TrainerInternal.cpp:162] Batch=20 samples=2560 AvgCost=0.000381622 CurrentCost=0.000393071 Eval: classification_error_evaluator=0 CurrentEval: classification_error_evaluator=0
I0923 02:23:12.219902 9787 TrainerInternal.cpp