使用Doc2Vec模型参加Kaggle的NLP比赛,最终score达到0.97,前2%。
本文所有的代码都可以在我的github上找到。
在上一篇博文中,我们使用了TF-IDF
,准确率达到了0.95
,已经进入前100,但还不够,我们试试使用更加高大上的Doc2Vec
结合神经网络模型,其准确率能否再次提升。
数据介绍
- 本数据来源于IMDB电影评论集,是Kaggle上一个入门的项目。
- 在Kaggle上详细使用了
word2vec
进行向量化,本文主要介绍Doc2Vec
模型的使用,并使用神经网络模型提高准确率。 - 数据包括
- **测试数据(testData):**25000条
- 未标注数据(unlabelData):5000条
- 训练数据(trainData):25000条(正负情感各一半)
- 每个电影的评论都不超过30条(测试集电影与训练集电影不相同)
- 我们使用所有数据来作为
doc2vect
模型的语料
- 本文主要使用python中的
pandas
、nltk
、gensim
、TensorFlow
库进行数据清理和分析。 - 注意,在kaggle上,针对此题的评分标准是按照
ROC
曲线(AUC) ,并不是硬分类,参考Wikipedia。
数据预处理
此部分的JupyterNotebook
可参考这里。
对于拿到的电影评论数据,我们需要进行数据清理以后才能使用doc2vec
进行向量化。
本文采用pandas
库进行数据预处理,好处是可以使用apply
函数对其进行并发操作,提高效率。
NLP的数据预处理一般包括以下几个部分:
- 如果是网页内容,首先需要去掉
Html tag
- 将文档分割成句子。
- 将句子分割成词语。
- 纠正拼写错误(可选)、替换缩写词(可选)。
Lemmatizer
、stemming
- 词型还原或词干提取,两者的差别可参考这里
- 去除停顿词,去除标点、转化为小写字母。
- 去掉长度过短的词语。
本项目没有纠正拼写错误(口语化词语太多)、没有去处数字(实测会提高精度)最后将训练集分开(pos
和neg
)。
Doc2vec
此部分的JupyterNotebook
可参考这里。
Doc2Vec
模型比较复杂,相对于word2vec
模型,它可以直接得到每个文档的向量,省略了将词向量转换为段向量的过程。
由于其直接是段向量,因此考虑了词之间的顺序,具有较好的语义信息。
而传统的word2vec
模型,使用平均词向量或聚类的方式得到的段向量没有考虑词的顺序。
输入数据
test.txt
:25000 条评论用于测试train