付裕
摘要:當(dāng)今互聯(lián)網(wǎng)趨勢(shì)下,實(shí)體服務(wù)行業(yè)越來(lái)越傾向于與線(xiàn)上的互聯(lián)網(wǎng)進(jìn)行深度合作,講究服務(wù)以質(zhì)量取勝、以人性化、個(gè)性化取勝。故在這樣的背景下,以傳統(tǒng)的打廣告的模式來(lái)吸引觀眾去電影院看電影的方式在逐漸被更智能化、更具有針對(duì)性的精準(zhǔn)推送的線(xiàn)上方式所取代。為了更好地服務(wù)喜歡看電影的觀眾,開(kāi)發(fā)了這個(gè)基于文本的卷積神經(jīng)的個(gè)性化電影推薦系統(tǒng)。此系統(tǒng)使用神經(jīng)網(wǎng)絡(luò)將自然語(yǔ)言處理與電影推薦相結(jié)合,利用MovieLens數(shù)據(jù)集訓(xùn)練一個(gè)基于文本的卷積神經(jīng)網(wǎng)絡(luò),實(shí)現(xiàn)電影個(gè)性化推薦系統(tǒng)。最后使用django框架并結(jié)合豆瓣爬蟲(chóng),搭建了推薦系統(tǒng)Web端服務(wù)。
關(guān)鍵詞:個(gè)性化推薦系統(tǒng);TensorFlow;文本卷積網(wǎng)絡(luò); MovieLens;自然語(yǔ)言處理
中圖分類(lèi)號(hào):TP301 ? 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):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 ?前言
當(dāng)前的個(gè)性化推薦系統(tǒng)實(shí)際上與自然語(yǔ)言處理聯(lián)系得非常緊密,特別是利用用戶(hù)的評(píng)論等進(jìn)行輿情化分析,以期達(dá)到更符合更大多數(shù)人需求的推薦。為了更好地服務(wù)觀影用戶(hù),此項(xiàng)目主要是應(yīng)用了當(dāng)今熱門(mén)的推薦技術(shù)來(lái)實(shí)現(xiàn)對(duì)觀影用戶(hù)的精準(zhǔn)推送,以此來(lái)達(dá)到影片的觀影次數(shù)和觀眾的觀影體驗(yàn)的雙提高的效果。主要實(shí)現(xiàn)了給用戶(hù)推薦喜歡的電影、給用戶(hù)推薦相似的電影、推薦看過(guò)的用戶(hù)還喜歡看的電影這三個(gè)功能。
2 ?推薦系統(tǒng)簡(jiǎn)介
推薦系統(tǒng)是根據(jù)用戶(hù)的歷史信息和行為,向用戶(hù)推薦他感興趣的內(nèi)容的一種系統(tǒng)[2]。理論上,當(dāng)一個(gè)全新的用戶(hù)進(jìn)入系統(tǒng)后是無(wú)法實(shí)現(xiàn)個(gè)性化推薦的,只有當(dāng)用戶(hù)使用了這個(gè)系統(tǒng)后,系統(tǒng)收集了用戶(hù)的信息和行為才能向用戶(hù)提供個(gè)性化的推薦內(nèi)容[3]。但在實(shí)際工程運(yùn)用中,也可以通過(guò)各種手段解決“冷啟動(dòng)”這樣的問(wèn)題,來(lái)達(dá)到向系統(tǒng)新用戶(hù)的粗略推薦。常見(jiàn)的推薦大致可以分為基于協(xié)同過(guò)濾的推薦和基于內(nèi)容的相似推薦這兩種[4]。其中,推薦系統(tǒng)包含的環(huán)節(jié)如下圖1所示。
3 數(shù)據(jù)處理
本項(xiàng)目使用的是MovieLens 1M 數(shù)據(jù)集,包含6000個(gè)用戶(hù)在近4000部電影上的1億條評(píng)論。數(shù)據(jù)集分為三個(gè)文件:用戶(hù)數(shù)據(jù)users.dat,電影數(shù)據(jù)movies.dat和評(píng)分?jǐn)?shù)據(jù)ratings.dat[5]。
3.1 用戶(hù)數(shù)據(jù)users.dat
用戶(hù)ID:不用改變。性別字段:需要將‘F’和‘M’轉(zhuǎn)換成0和1。年齡字段:要轉(zhuǎn)成7個(gè)連續(xù)數(shù)字0~6。
3.2 電影數(shù)據(jù)movies.dat
電影ID字段:不用改變。流派Genres字段:是分類(lèi)字段,要轉(zhuǎn)成數(shù)字。首先將Genres中的類(lèi)別轉(zhuǎn)成字符串到數(shù)字的字典,然后再將每個(gè)電影的Genres字段轉(zhuǎn)成數(shù)字列表,因?yàn)橛行╇娪笆嵌鄠€(gè)Genres的組合。? ?標(biāo)題Title字段:處理方式跟Genres字段一樣,首先創(chuàng)建文本到數(shù)字的字典,然后將Title中的描述轉(zhuǎn)成數(shù)字的列表。另外Title中的年份也需要去掉。在實(shí)際代碼的書(shū)寫(xiě)中Genres和Title字段需要將長(zhǎng)度統(tǒng)一,這樣在神經(jīng)網(wǎng)絡(luò)中方便處理??瞻撞糠钟谩?lt; PAD >’對(duì)應(yīng)的數(shù)字填充。
3.2 評(píng)分?jǐn)?shù)據(jù)ratings.dat
數(shù)據(jù)處理完之后將三個(gè)表做 inner merge,并保存為模型文件 data_preprocess.pkl。
4 建模與模型訓(xùn)練
針對(duì)處理后數(shù)據(jù)的不同字段進(jìn)行模型的搭建。相關(guān)模型結(jié)構(gòu)設(shè)計(jì)如下圖2所示。
4.1 嵌入層
根據(jù)上文,為了解決數(shù)據(jù)稀疏問(wèn)題,One-hot的矩陣相乘可以簡(jiǎn)化為查表操作,這大大降低了運(yùn)算量。不是每一個(gè)詞用一個(gè)向量來(lái)代替,而是替換為用于查找嵌入矩陣中向量的索引,在網(wǎng)絡(luò)的訓(xùn)練過(guò)程中,嵌入向量也會(huì)更新,也就可以探索在高維空間中詞語(yǔ)之間的相似性。
? 本系統(tǒng)使用tensorflow的tf.nn.embedding_lookup就是根據(jù)input_ids中的id尋找embeddings中的第id行。比如input_ids=[1,3,5],則找出embeddings中第1,3,5行,組成一個(gè)tensor返回。tf.nn.embedding_lookup不是簡(jiǎn)單的查表,id對(duì)應(yīng)的向量是可以訓(xùn)練的,訓(xùn)練參數(shù)個(gè)數(shù)應(yīng)該是 category num*embedding size,也可以說(shuō)lookup是一種全連接層。
創(chuàng)建嵌入矩陣,要決定每一個(gè)索引需要分配多少個(gè)潛在因子,這大體上意味著想要多長(zhǎng)的向量,通常使用的情況是長(zhǎng)度分配為32和50[6],此處選擇32和16,所以各字段嵌入矩陣的shape第1個(gè)維度,也就是第2個(gè)數(shù)字要么為32,要么為16;
而嵌入矩陣第0個(gè)緯度為6041、2、7、21,也就是嵌入矩陣的行數(shù),也就代表著這四個(gè)字段unique值有多少個(gè),例如Gender的值只有0和1(經(jīng)過(guò)數(shù)據(jù)處理)其嵌入矩陣就有2行。
在上一點(diǎn)敘述過(guò)使用tf.nn.embedding_lookup與UserID字段的數(shù)據(jù)進(jìn)行全連接(相當(dāng)于查表操作),則每個(gè)嵌入層的shape應(yīng)該是這樣的(數(shù)據(jù)量,字段長(zhǎng)度,索引長(zhǎng)度),數(shù)據(jù)量可以設(shè)計(jì)為每個(gè)epoch的大小;對(duì)于User數(shù)據(jù)來(lái)說(shuō),字段長(zhǎng)度都為1,因?yàn)橛靡粋€(gè)值就能表示該獨(dú)一無(wú)二的值,如果對(duì)于文本,則可能需要使用數(shù)組來(lái)表示,即字段長(zhǎng)度可能大于1;索引長(zhǎng)度則是嵌入矩陣的潛在因子。
對(duì)數(shù)據(jù)集字段UserID、Gender、Age、JobID和電影數(shù)據(jù)的MovieID、Genres、Title分別構(gòu)建嵌入矩陣和嵌入層。 Title嵌入層的shape是(?,15,32),“?”代表了一個(gè)epoch的數(shù)量,32代表了自定義選擇的潛在因子數(shù)量,15則代表了該字段的每一個(gè)unique值都需要一個(gè)長(zhǎng)度為15的向量來(lái)表示。Genres嵌入層的shape是(?,1,32),由于一個(gè)電影的Genres(電影的類(lèi)型),可能屬于多個(gè)類(lèi)別,所以該字段的需要做特殊的處理,即把第1緯度上的向量進(jìn)行加和,這樣做其實(shí)削減了特征的表現(xiàn),但是又防止比如僅僅推薦相關(guān)類(lèi)型的電影。
綜上,經(jīng)過(guò)嵌入層,得到以下模型:
針對(duì)User數(shù)據(jù),如表1所示。
針對(duì)Movie數(shù)據(jù),如表2所示。
4.2 文本卷積層
網(wǎng)絡(luò)的第一層是詞嵌入層,由每一個(gè)單詞的嵌入向量組成的嵌入矩陣。下一層使用多個(gè)不同尺寸(窗口大?。┑木矸e核在嵌入矩陣上做卷積,窗口大小指的是每次卷積覆蓋幾個(gè)單詞[7]。這里跟對(duì)圖像做卷積不太一樣,圖像的卷積通常用2x2、3x3、5x5之類(lèi)的尺寸,而文本卷積要覆蓋整個(gè)單詞的嵌入向量,所以尺寸是(單詞數(shù),向量維度),比如每次滑動(dòng)3個(gè)、4個(gè)或者5個(gè)單詞。第三層網(wǎng)絡(luò)是max pooling得到一個(gè)長(zhǎng)向量,最后使用dropout做正則化,最終得到了電影Title的特征[7]。
卷積過(guò)程涉及以下幾個(gè)參數(shù),如表3所示。
將Title字段嵌入層的輸出movie_title_embed_layer(shape=(?,15,32)),作為卷積層的輸入,所以先把movie_title_embed_layer擴(kuò)展一個(gè)維度,shape變?yōu)椋ǎ浚?5,32,1),四個(gè)參數(shù)分別為(batch,height,width,channels)
可以得到如表4所示數(shù)據(jù)。
考慮window_size=2的情況,首先得到嵌入層輸出,并對(duì)其增加一個(gè)維度得到movie_title_embed_layer_expand(shape=(?,15,32,1)),其作為卷積層的輸入。卷積核的參數(shù)filter_weights為(2,32,1,8),表示卷積核的高度為2,寬度為32,輸入通道為1,輸出通道為32。其中輸出通道與上一層的輸入通道相同。
卷積層在各個(gè)維度上的步長(zhǎng)都為1,且padding的方式為VALID,則可得到卷積層的shape為(?,14,1,8)。 卷積之后使用relu函數(shù)進(jìn)行激活,并且加上偏置,shape保持不變。最大池化的窗口為(1,14,1,1),且在每個(gè)維度上的步長(zhǎng)都為1,即可得到池化后的shape為(?,1,1,8)。依次類(lèi)推,當(dāng)window_size為其他時(shí),也能得到池化層輸出shape為(?,1,1,8)。得到四個(gè)卷積、池化的輸出之后將池化層的輸出根據(jù)第三維(第四個(gè)參數(shù))相連,變形為(?,1,1,32),再變形為三維(?,1,32)。最后為了正則化防止過(guò)擬合,經(jīng)過(guò)dropout層處理,輸出shape為(?,1,32)。
4.3 全連接層
對(duì)上文所得到的嵌入層的輸出和卷積層的輸出進(jìn)行全連接。對(duì)User數(shù)據(jù)的嵌入層進(jìn)行全連接,最終得到輸出特征的shape為(?,200)。同理對(duì)Movie數(shù)據(jù)進(jìn)行兩層全連接,最終得到輸出特征的shape為(?,200)。
4.4 構(gòu)建計(jì)算圖與模型訓(xùn)練
構(gòu)建計(jì)算圖,訓(xùn)練。問(wèn)題回歸為簡(jiǎn)單地將用戶(hù)特征和電影特征做矩陣乘法得到一個(gè)預(yù)測(cè)評(píng)分,損失為均方誤差。
1)模型保存
?保存的模型包括:處理后的訓(xùn)練數(shù)據(jù)、訓(xùn)練完成后的網(wǎng)絡(luò)、用戶(hù)特征矩陣、電影特征矩陣。
2)模型損失圖像
訓(xùn)練集損失圖像如圖3所示。
測(cè)試集損失圖像如圖4所示。
經(jīng)過(guò)簡(jiǎn)單的調(diào)參。batch_size 對(duì)Loss的影響較大,但是batch_size 過(guò)大,損失會(huì)有比較大的抖動(dòng)情況。隨著學(xué)習(xí)率逐漸減小,損失會(huì)先減小后增大,所以最終確定參數(shù)還是固定參數(shù)效果較好。
4.5 推薦
加了隨機(jī)因素保證對(duì)相同電影推薦時(shí)推薦結(jié)果的不一致。
1)給用戶(hù)推薦喜歡的電影:使用用戶(hù)特征向量與電影特征矩陣計(jì)算所有電影的評(píng)分,取評(píng)分最高的 topK個(gè)。
2)推薦相似的電影:計(jì)算選擇電影特征向量與整個(gè)電影特征矩陣的余弦相似度,取相似度最大的 topK 個(gè)。
3)推薦看過(guò)的用戶(hù)還喜歡看的電影。
?(1)首先選出喜歡某個(gè)電影的 topK 個(gè)人,得到這幾個(gè)人的用戶(hù)特征向量。
?(2)計(jì)算這幾個(gè)人對(duì)所有電影的評(píng)分。
?(3)選擇每個(gè)人評(píng)分最高的電影作為推薦。
5 最終實(shí)驗(yàn)結(jié)果
因?yàn)閿?shù)據(jù)集也未有電影的中文名稱(chēng)、圖片等數(shù)據(jù),所以在web項(xiàng)目中加了一個(gè)豆瓣的爬蟲(chóng),每次推薦都請(qǐng)求數(shù)據(jù),并進(jìn)行相應(yīng)的解析和封裝。在服務(wù)器啟動(dòng)的時(shí)候就加載模型,并且把tensorflow的session提前封裝好,在調(diào)用相關(guān)方法時(shí),直接傳入該全局session,避免了每次請(qǐng)求都加載模型。
給用戶(hù)推薦喜歡的電影后臺(tái)相關(guān)效果如圖5所示。
給用戶(hù)推薦相似的電影后臺(tái)相關(guān)輸出效果如圖6所示。
為看過(guò)某部電影的用戶(hù)推薦他可能還喜歡看的電影后臺(tái)相關(guān)輸出效果如圖7所示。
6 ?項(xiàng)目總結(jié)與展望
本次項(xiàng)目實(shí)現(xiàn)了常用的推薦功能,將網(wǎng)絡(luò)模型作為回歸問(wèn)題進(jìn)行訓(xùn)練,得到訓(xùn)練好的用戶(hù)特征矩陣和電影特征矩陣進(jìn)行了推薦。并且此次項(xiàng)目把源碼進(jìn)行了面向?qū)ο蠓庋b,增強(qiáng)了源碼的復(fù)用性和可用性,對(duì)推薦相關(guān)方法也進(jìn)行了微小的調(diào)整,解決了模型多次加載問(wèn)題,最后增加了該項(xiàng)目的Web展示端。
此次項(xiàng)目收獲頗豐,但是該系統(tǒng)還存在一系列問(wèn)題:如模型的局限性,即該系統(tǒng)只能對(duì)數(shù)據(jù)集中的電影和用戶(hù)進(jìn)行推薦,沒(méi)有再找相關(guān)字段的數(shù)據(jù),所以訓(xùn)練數(shù)據(jù)量相對(duì)較小,適用性也比較窄。希望將來(lái)能普適開(kāi)來(lái),能為更多有現(xiàn)實(shí)需求的用戶(hù)服務(wù)。
參考文獻(xiàn):
[1] 戴培,靳涵瑜,錦璇,等.基于語(yǔ)義分析和卷積神經(jīng)網(wǎng)絡(luò)的視頻審查機(jī)制研究[J].信息與電腦(理論版),2019(12):116-118.
[2] 弗朗西斯科·里奇(Francesco Ricci),利奧·羅卡奇(Lior Rokach),布拉哈·夏皮拉(Bracha Shapira).推薦系統(tǒng):技術(shù)、評(píng)估及高效算法[M].李艷民,等,譯.北京:機(jī)械工業(yè)出版社,2018.
[3] 姜信景,齊小剛,劉立芳.個(gè)性化信息推薦方法研究[J].智能系統(tǒng)學(xué)報(bào),2018,13(2):189-195.
[4] 常亮,曹玉婷,孫文平,等.旅游推薦系統(tǒng)研究綜述[J].計(jì)算機(jī)科學(xué),2017,44(10):1-6.
[5] 鄧秀勤, 張翼飛, 江志華, 等. 一種基于節(jié)點(diǎn)分割的隱私屬性(a, k)-匿名算法[J]. 數(shù)據(jù)挖掘, 2020,10(2):143-151.
[6] 胡思才,孫界平,琚生根,等.基于深度神經(jīng)網(wǎng)絡(luò)和概率矩陣分解的混合推薦算法[J].四川大學(xué)學(xué)報(bào)(自然科學(xué)版),2019,56(6):1033-1041.
[7] 易黎,肖青秀,湯鯤.基于雙層注意力機(jī)制的深度學(xué)習(xí)電影推薦系統(tǒng)[J].計(jì)算機(jī)與現(xiàn)代化,2018(11):109-114.
【通聯(lián)編輯:梁書(shū)】