基于文本的卷积网络在电影推荐系统中的应用

2021-12-19 22:40付裕
电脑知识与技术 2021年32期
关键词:自然语言处理

付裕

摘要:当今互联网趋势下,实体服务行业越来越倾向于与线上的互联网进行深度合作,讲究服务以质量取胜、以人性化、个性化取胜。故在这样的背景下,以传统的打广告的模式来吸引观众去电影院看电影的方式在逐渐被更智能化、更具有针对性的精准推送的线上方式所取代。为了更好地服务喜欢看电影的观众,开发了这个基于文本的卷积神经的个性化电影推荐系统。此系统使用神经网络将自然语言处理与电影推荐相结合,利用MovieLens数据集训练一个基于文本的卷积神经网络,实现电影个性化推荐系统。最后使用django框架并结合豆瓣爬虫,搭建了推荐系统Web端服务。

关键词:个性化推荐系统;TensorFlow;文本卷积网络; MovieLens;自然语言处理

中图分类号:TP301   文献标识码:A

文章编号:1009-3044(2021)32-0113-04

Application of Text-based Convolutional Network in a Movie Recommendation System

FU Yu

(Yangtze University, Jingzhou 434000, China)

Abstract: In today's Internet trend, the entity service industry is more and more inclined to carry out in-depth cooperation with the online Internet and pay attention to service, win by quality, humanization, and personalization. Therefore, in this context, the traditional advertising mode to attract the audience to the cinema is gradually replaced by a more intelligent and targeted online way of precise push. Therefore, to better serve the audience who like to watch movies, I develop a personalized movie recommendation system based on a text convolution neural network. This system uses a neural network to combine natural language processing with movie recommendation, and uses movielens data set to train a convolution neural network based on text to realize a movie personalized recommendation system[1]. Finally, I use the Django framework and Douban crawler to build the web service of recommendation system.

Key words: personalized recommendation system; TensorFlow; text convolutional network; MovieLens; natural language processing

1  前言

當前的个性化推荐系统实际上与自然语言处理联系得非常紧密,特别是利用用户的评论等进行舆情化分析,以期达到更符合更大多数人需求的推荐。为了更好地服务观影用户,此项目主要是应用了当今热门的推荐技术来实现对观影用户的精准推送,以此来达到影片的观影次数和观众的观影体验的双提高的效果。主要实现了给用户推荐喜欢的电影、给用户推荐相似的电影、推荐看过的用户还喜欢看的电影这三个功能。

2  推荐系统简介

推荐系统是根据用户的历史信息和行为,向用户推荐他感兴趣的内容的一种系统[2]。理论上,当一个全新的用户进入系统后是无法实现个性化推荐的,只有当用户使用了这个系统后,系统收集了用户的信息和行为才能向用户提供个性化的推荐内容[3]。但在实际工程运用中,也可以通过各种手段解决“冷启动”这样的问题,来达到向系统新用户的粗略推荐。常见的推荐大致可以分为基于协同过滤的推荐和基于内容的相似推荐这两种[4]。其中,推荐系统包含的环节如下图1所示。

3 数据处理

本项目使用的是MovieLens 1M 数据集,包含6000个用户在近4000部电影上的1亿条评论。数据集分为三个文件:用户数据users.dat,电影数据movies.dat和评分数据ratings.dat[5]。

3.1 用户数据users.dat

用户ID:不用改变。性别字段:需要将‘F’和‘M’转换成0和1。年龄字段:要转成7个连续数字0~6。

3.2 电影数据movies.dat

电影ID字段:不用改变。流派Genres字段:是分类字段,要转成数字。首先将Genres中的类别转成字符串到数字的字典,然后再将每个电影的Genres字段转成数字列表,因为有些电影是多个Genres的组合。​  标题Title字段:处理方式跟Genres字段一样,首先创建文本到数字的字典,然后将Title中的描述转成数字的列表。另外Title中的年份也需要去掉。在实际代码的书写中Genres和Title字段需要将长度统一,这样在神经网络中方便处理。空白部分用‘< PAD >’对应的数字填充。

3.2 评分数据ratings.dat

数据处理完之后将三个表做 inner merge,并保存为模型文件 data_preprocess.pkl。

4 建模与模型训练

针对处理后数据的不同字段进行模型的搭建。相关模型结构设计如下图2所示。

4.1 嵌入层

根据上文,为了解决数据稀疏问题,One-hot的矩阵相乘可以简化为查表操作,这大大降低了运算量。不是每一个词用一个向量来代替,而是替换为用于查找嵌入矩阵中向量的索引,在网络的训练过程中,嵌入向量也会更新,也就可以探索在高维空间中词语之间的相似性。

​ 本系统使用tensorflow的tf.nn.embedding_lookup就是根据input_ids中的id寻找embeddings中的第id行。比如input_ids=[1,3,5],则找出embeddings中第1,3,5行,组成一个tensor返回。tf.nn.embedding_lookup不是简单的查表,id对应的向量是可以训练的,训练参数个数应该是 category num*embedding size,也可以说lookup是一种全连接层。

创建嵌入矩阵,要决定每一个索引需要分配多少个潜在因子,这大体上意味着想要多长的向量,通常使用的情况是长度分配为32和50[6],此处选择32和16,所以各字段嵌入矩阵的shape第1个维度,也就是第2个数字要么为32,要么为16;

而嵌入矩阵第0个纬度为6041、2、7、21,也就是嵌入矩陣的行数,也就代表着这四个字段unique值有多少个,例如Gender的值只有0和1(经过数据处理)其嵌入矩阵就有2行。

在上一点叙述过使用tf.nn.embedding_lookup与UserID字段的数据进行全连接(相当于查表操作),则每个嵌入层的shape应该是这样的(数据量,字段长度,索引长度),数据量可以设计为每个epoch的大小;对于User数据来说,字段长度都为1,因为用一个值就能表示该独一无二的值,如果对于文本,则可能需要使用数组来表示,即字段长度可能大于1;索引长度则是嵌入矩阵的潜在因子。

对数据集字段UserID、Gender、Age、JobID和电影数据的MovieID、Genres、Title分别构建嵌入矩阵和嵌入层。 Title嵌入层的shape是(?,15,32),“?”代表了一个epoch的数量,32代表了自定义选择的潜在因子数量,15则代表了该字段的每一个unique值都需要一个长度为15的向量来表示。Genres嵌入层的shape是(?,1,32),由于一个电影的Genres(电影的类型),可能属于多个类别,所以该字段的需要做特殊的处理,即把第1纬度上的向量进行加和,这样做其实削减了特征的表现,但是又防止比如仅仅推荐相关类型的电影。

综上,经过嵌入层,得到以下模型:

针对User数据,如表1所示。

针对Movie数据,如表2所示。

4.2 文本卷积层

网络的第一层是词嵌入层,由每一个单词的嵌入向量组成的嵌入矩阵。下一层使用多个不同尺寸(窗口大小)的卷积核在嵌入矩阵上做卷积,窗口大小指的是每次卷积覆盖几个单词[7]。这里跟对图像做卷积不太一样,图像的卷积通常用2x2、3x3、5x5之类的尺寸,而文本卷积要覆盖整个单词的嵌入向量,所以尺寸是(单词数,向量维度),比如每次滑动3个、4个或者5个单词。第三层网络是max pooling得到一个长向量,最后使用dropout做正则化,最终得到了电影Title的特征[7]。

卷积过程涉及以下几个参数,如表3所示。

将Title字段嵌入层的输出movie_title_embed_layer(shape=(?,15,32)),作为卷积层的输入,所以先把movie_title_embed_layer扩展一个维度,shape变为(?,15,32,1),四个参数分别为(batch,height,width,channels)

可以得到如表4所示数据。

考虑window_size=2的情况,首先得到嵌入层输出,并对其增加一个维度得到movie_title_embed_layer_expand(shape=(?,15,32,1)),其作为卷积层的输入。卷积核的参数filter_weights为(2,32,1,8),表示卷积核的高度为2,宽度为32,输入通道为1,输出通道为32。其中输出通道与上一层的输入通道相同。

卷积层在各个维度上的步长都为1,且padding的方式为VALID,则可得到卷积层的shape为(?,14,1,8)。 卷积之后使用relu函数进行激活,并且加上偏置,shape保持不变。最大池化的窗口为(1,14,1,1),且在每个维度上的步长都为1,即可得到池化后的shape为(?,1,1,8)。依次类推,当window_size为其他时,也能得到池化层输出shape为(?,1,1,8)。得到四个卷积、池化的输出之后将池化层的输出根据第三维(第四个参数)相连,变形为(?,1,1,32),再变形为三维(?,1,32)。最后为了正则化防止过拟合,经过dropout层处理,输出shape为(?,1,32)。

4.3 全连接层

对上文所得到的嵌入层的输出和卷积层的输出进行全连接。对User数据的嵌入层进行全连接,最终得到输出特征的shape为(?,200)。同理对Movie数据进行两层全连接,最终得到输出特征的shape为(?,200)。

4.4 构建计算图与模型训练

构建计算图,训练。问题回归为简单地将用户特征和电影特征做矩阵乘法得到一个预测评分,损失为均方误差。

1)模型保存

​保存的模型包括:处理后的训练数据、训练完成后的网络、用户特征矩阵、电影特征矩阵。

2)模型损失图像

训练集损失图像如图3所示。

测试集损失图像如图4所示。

经过简单的调参。batch_size 对Loss的影响较大,但是batch_size 过大,损失会有比较大的抖动情况。随着学习率逐渐减小,损失会先减小后增大,所以最终确定参数还是固定参数效果较好。

4.5 推荐

加了随机因素保证对相同电影推荐时推荐结果的不一致。

1)给用户推荐喜欢的电影:使用用户特征向量与电影特征矩阵计算所有电影的评分,取评分最高的 topK个。

2)推荐相似的电影:计算选择电影特征向量与整个电影特征矩阵的余弦相似度,取相似度最大的 topK 个。

3)推荐看过的用户还喜欢看的电影。

​(1)首先选出喜欢某个电影的 topK 个人,得到这几个人的用户特征向量。

​(2)计算这几个人对所有电影的评分。

​(3)选择每个人评分最高的电影作为推荐。

5 最终实验结果

因为数据集也未有电影的中文名称、图片等数据,所以在web项目中加了一个豆瓣的爬虫,每次推荐都请求数据,并进行相应的解析和封装。在服务器启动的时候就加载模型,并且把tensorflow的session提前封装好,在调用相关方法时,直接传入该全局session,避免了每次请求都加载模型。

给用户推荐喜欢的电影后台相关效果如图5所示。

给用户推荐相似的电影后台相关输出效果如图6所示。

为看过某部电影的用户推荐他可能还喜欢看的电影后台相关输出效果如图7所示。

6  项目总结与展望

本次项目实现了常用的推荐功能,将网络模型作为回归问题进行训练,得到训练好的用户特征矩阵和电影特征矩阵进行了推荐。并且此次项目把源码进行了面向对象封装,增强了源码的复用性和可用性,对推荐相关方法也进行了微小的调整,解决了模型多次加载问题,最后增加了该项目的Web展示端。

此次项目收获颇丰,但是该系统还存在一系列问题:如模型的局限性,即该系统只能对数据集中的电影和用户进行推荐,没有再找相关字段的数据,所以训练数据量相对较小,适用性也比较窄。希望将来能普适开来,能为更多有现实需求的用戶服务。

参考文献:

[1] 戴培,靳涵瑜,锦璇,等.基于语义分析和卷积神经网络的视频审查机制研究[J].信息与电脑(理论版),2019(12):116-118.

[2] 弗朗西斯科·里奇(Francesco Ricci),利奥·罗卡奇(Lior Rokach),布拉哈·夏皮拉(Bracha Shapira).推荐系统:技术、评估及高效算法[M].李艳民,等,译.北京:机械工业出版社,2018.

[3] 姜信景,齐小刚,刘立芳.个性化信息推荐方法研究[J].智能系统学报,2018,13(2):189-195.

[4] 常亮,曹玉婷,孙文平,等.旅游推荐系统研究综述[J].计算机科学,2017,44(10):1-6.

[5] 邓秀勤, 张翼飞, 江志华, 等. 一种基于节点分割的隐私属性(a, k)-匿名算法[J]. 数据挖掘, 2020,10(2):143-151.

[6] 胡思才,孙界平,琚生根,等.基于深度神经网络和概率矩阵分解的混合推荐算法[J].四川大学学报(自然科学版),2019,56(6):1033-1041.

[7] 易黎,肖青秀,汤鲲.基于双层注意力机制的深度学习电影推荐系统[J].计算机与现代化,2018(11):109-114.

【通联编辑:梁书】

猜你喜欢
自然语言处理
基于LSTM自动编码机的短文本聚类方法
自然语言处理与司法案例
国外基于知识库的问答系统相关研究进展及其启示
基于依存句法的实体关系抽取
基于组合分类算法的源代码注释质量评估方法
面向机器人导航的汉语路径自然语言组块分析方法研究
词向量的语义学规范化
汉哈机器翻译中的文字转换技术研究
HowNet在自然语言处理领域的研究现状与分析