NLP实战|如何用280多万条豆瓣影评预测电影评分?

2,457 阅读3分钟


为了预测电影评分,我们收集了豆瓣电影网站上2.8万名用户对5万多部电影的280万条评论...


真实目的,其实是为了让大家能够通过这次的教程,更加了解自然语言处理。


所以,使用电影评论来预测电影评分,到底需要分几步?



项目简介

本项目只使用电影评论来预测电影评分。

由于豆瓣电影网站的评分为1-5的整数,因此将该问题转化为5个输出类别的分类问题。


数据集

此数据集包含豆瓣电影网站上2.8万名用户对5万多部电影的280万条评论。数据共有6列,包括用户名,电影名,时间戳,电影评论,电影评分和评论被点赞数。

具体可在https://www.flyai.com 项目中查找


项目过程

数据处理

搭建神经网络

定义损失函数,选择优化器

训练神经网络并保存最优的网络


数据处理

为了将电影评论输入到神经网络中,需要将原始的评论句子进行分词,然后将词转化为词向量。本项目使用了清华大学开发的thulac分词器。要使用此分词器,首先使用pip安装thulac库:

在python中创建分词器实例,设置分词器模式为仅分词,对每条评论 (comment) 进行分词:

将分好的词与预处理的词嵌入模型 (vocab) 比对,并获得词向量,词向量维度为200。

为了使每个batch的输入大小一致,需要对句子长度进行统一,设置句子最大长度为20,若句子长度超过20个词则保留前20个词,否则将空余的词补零。

输入的评分 (rating) 为1-5的整型数字,而pytorch进行分类时,类别索引必须从0开始,因此对输入评分做简单处理:

搭建神经网络

本项目使用了LSTM + 全连接层 来解决句子的分类问题。在PyTorch中搭建LSTM网络非常简单,只需要定义输入词向量维度,LSTM隐单元个数,LSTM层数即可。在LSTM层后,使用两个全连接层将LSTM输出的所有整个句子映射到5个类别上:

定义损失函数和优化

由于此项目为分类问题,使用CrossEntropy交叉熵作为损失函数,并选用Adam优化器。设置学习速率为0.001。

训练神经网络并保存最优的网络

为了让代码能够同时在cpu和gpu上运行,首先判断gpu是否可用,并由此设置pytorch计算所使用的硬件:

完整的训练过程如下所示,当训练集上准确率高于当前最高的准确率时,保存当前网络模型:

其中,eval()的作用为计算训练集上的准确率:


结语

本项目基于PyTorch框架,完成了根据汉语文字评论预测评分的任务。其中使用的网络简单,高效,适合NLP初学者进行学习。


获取更多相关项目代码 请访问:https://www.flyai.com




— END —

完整代码样例请访问:https://www.flyai.com/d/MovieRatings