您的位置:首页 > 其它

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

2018-12-24 10:32 281 查看

 

 

为了预测电影评分,我们收集了豆瓣电影网站上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

 

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: