王卓嵐 張雨琦 陳鳴宇 蘇意淇 宋 凱 董春玲
(中國傳媒大學(xué),北京 100024)

隨著我國經(jīng)濟的騰飛,擁有百余年歷史的我國電影產(chǎn)業(yè)呈現(xiàn)出迅猛發(fā)展的態(tài)勢。大數(shù)據(jù)時代的互聯(lián)網(wǎng)為網(wǎng)絡(luò)用戶提供了豐富的影音資源,新冠疫情背景下,線上、線下觀影模式融合互補。與此同時,海量的電影數(shù)據(jù)也給用戶便捷獲取自己喜愛的電影帶來了挑戰(zhàn)。因而,如何精準地為網(wǎng)絡(luò)用戶推薦電影變成了流媒體平臺重點關(guān)注的問題。
個性化電影推薦系統(tǒng)研究的主要問題是如何從互聯(lián)網(wǎng)海量電影數(shù)據(jù)中找到每個用戶感興趣的電影,并將這些電影推送給用戶。本文依據(jù)知識圖譜可存儲豐富數(shù)據(jù)及數(shù)據(jù)間關(guān)系的特點,將其引入電影推薦系統(tǒng)進行模型構(gòu)建。該方法在解決數(shù)據(jù)稀疏性問題、語義匹配精準度、推薦多樣化和結(jié)果可解釋性方面都有較好的效果,對電影推薦技術(shù)的發(fā)展有一定現(xiàn)實意義。
近年來,不少相關(guān)人士針對電影推薦系統(tǒng)進行了學(xué)術(shù)研究,同時也提出了相關(guān)推薦算法。傳統(tǒng)推薦算法可分為四類:協(xié)同過濾推薦、基于內(nèi)容的推薦、基于人口統(tǒng)計學(xué)的推薦和混合推薦。毛德磊等人在論文中改進了協(xié)同過濾算法,基于用戶行為一致性、區(qū)別性和正負偏好信息提取用戶偏好,融合偏好相似性與評分相似性進行協(xié)同過濾推薦;呂學(xué)強等人在論文中利用Text Rank、Wor d2 Vec等技術(shù)對影評進行關(guān)鍵詞抽取和詞向量構(gòu)建,提出一種結(jié)合影評內(nèi)容相似度和長短期興趣模型來計算電影相似度的推薦方法;鄧存彬等人在論文中利用動態(tài)協(xié)同過濾算法融入時間特征,運用深度學(xué)習(xí)模型學(xué)習(xí)用戶和電影特征信息,最后將形成的隱向量融入動態(tài)協(xié)同過濾算法中進行電影推薦。
協(xié)同過濾算法依賴用戶自身或用戶其他已知的歷史數(shù)據(jù)為該用戶推薦喜愛的電影,當新用戶或者新電影出現(xiàn)時,個性化電影推薦會因為缺乏歷史數(shù)據(jù)而出現(xiàn)冷啟動問題。同時,電影發(fā)明一個多世紀以來,網(wǎng)絡(luò)相關(guān)數(shù)據(jù)庫中生成了海量電影資源,其中僅有少數(shù)電影被用戶觀看并評分過,這就造成用戶—電影評分矩陣中大量數(shù)據(jù)為空值,隨之出現(xiàn)了難以避免的數(shù)據(jù)稀疏問題。因此依據(jù)評分矩陣進行推薦后的結(jié)果準確率較低,推薦質(zhì)量也無法保證。
基于內(nèi)容的推薦算法,其核心在于根據(jù)用戶的興趣與偏好,為用戶推薦與其先前喜好內(nèi)容相似的資源。在電影研究方面,該算法的缺點在于電影特征需要人工標注和提取,同時推薦系統(tǒng)還難以發(fā)現(xiàn)用戶新的興趣點。例如,某觀影者過去僅傾向于觀看愛情類電影,那么基于內(nèi)容的推薦算法就會為其推送更多的愛情電影,而無法發(fā)掘出觀影者對于科技類電影的潛在興趣。此外,基于內(nèi)容的推薦算法與協(xié)同過濾算法相似,由于缺少新用戶的喜好歷史,無法提取相應(yīng)的電影特征信息,進而難以為新用戶進行精準推薦。
基于人口統(tǒng)計學(xué)的推薦算法根據(jù)用戶的基本信息進行推薦,而針對電影推薦問題的特殊性,用戶基本信息與用戶喜好并無緊密關(guān)聯(lián),因此該方法存在較大的語義失配問題。
混合推薦算法雖解決了單一推薦的局限性問題,但由于其實現(xiàn)過程復(fù)雜且投入成本過高,目前并未被廣泛采用。
2.3.1 彌補數(shù)據(jù)稀疏性干擾問題
針對電影評分數(shù)據(jù)存在的稀疏性問題,近年來不少研究將交互記錄以外的輔助信息引入推薦系統(tǒng),從而對用戶和電影進行更精準、豐富的畫像。此外,用戶的注冊信息、社交關(guān)系、標簽等屬性也可以為該方法提供更加精確的預(yù)測模型,但往往充分獲取相關(guān)輔助信息需要付出很大的代價。
知識圖譜中蘊含了豐富的電影及用戶相關(guān)數(shù)據(jù),尤其是其中的屬性信息和用戶間關(guān)系,可作為一類重要的輔助信息引入電影推薦系統(tǒng),很好地彌補了數(shù)據(jù)稀疏性干擾問題,與此同時也減少了獲取并存儲龐大輔助信息的代價。
2.3.2 實現(xiàn)精準的語義匹配
在知識圖譜中經(jīng)由簡單的知識推理即可發(fā)現(xiàn)眾多實體或特征之間的語義匹配和關(guān)聯(lián),這一優(yōu)點可以為電影推薦系統(tǒng)產(chǎn)生更準確的推薦結(jié)果。例如,對于電影 《勇敢傳說》與 《魔發(fā)奇緣》的語義關(guān)聯(lián)問題,可以通過電影類型圖譜 (存有電影類型與影片名稱的關(guān)系)發(fā)現(xiàn)如圖1所示的語義鏈,從而將兩部電影聯(lián)系起來。

圖1 電影類型語義鏈
2.3.3 完成多樣化電影推薦
知識圖譜引入了更多的語義關(guān)系,可以深層次地發(fā)現(xiàn)用戶興趣。基于知識圖譜的電影推薦可以發(fā)現(xiàn)電影間的異質(zhì)關(guān)聯(lián),從而從不同維度推薦電影。例如,在圖2中若用戶曾經(jīng)觀看過電影 《超凡蜘蛛俠》,依據(jù)知識圖譜中電影導(dǎo)演、演員和電影類型這三種不同屬性的關(guān)聯(lián),推薦系統(tǒng)可以向該用戶推薦《和莎莫的500天》(都由馬克·韋布導(dǎo)演)、《血戰(zhàn)鋼鋸嶺》(都由安德魯·加菲爾德主演)和 《復(fù)仇者聯(lián)盟》(都是科幻片)三部完全不同風格的電影。

圖2 多樣化電影推薦
2.3.4 提供可解釋性依據(jù)
知識圖譜中存有的不同電影間的關(guān)聯(lián)信息可用作電影推薦結(jié)果的可解釋性依據(jù)。還以上例中看過電影 《超凡蜘蛛俠》的用戶為例,將推薦系統(tǒng)推薦出的三部電影與 《超凡蜘蛛俠》的關(guān)聯(lián)直接展現(xiàn)給用戶,能夠讓用戶更直觀地了解系統(tǒng)如此推薦的理由,從而增強了接受該推薦結(jié)果的主觀意愿。
在知識圖譜中,假定我們用節(jié)點集合E代表實體或者概念。其中,實體代表具有可區(qū)別性且獨立存在的某類事物,概念指具有同種特性的實體構(gòu)成的集合,每個實體或者概念用一個唯一的ID標識;邊R代表實體或概念之間的各種語義關(guān)系。由此,一個三元組 (h,r,t)就可以表示兩個實體之間的某種關(guān)系,也可以稱其為一條知識,其中h表示知識的頭節(jié)點,t表示尾節(jié)點,r表示關(guān)系。即S={(h,r,t)|h?E,r?R,t?E}。
若干三元組的集合構(gòu)成了一個知識圖譜。如圖3,知識圖譜可以清晰地表示出影片、影片題材、導(dǎo)演和主演之間的關(guān)系。隨著實體或概念種類的增加,知識圖譜可表示的信息會更加全面。

圖3 知識圖譜樣例
電影知識圖譜構(gòu)建的關(guān)鍵步驟是如何實現(xiàn)將數(shù)據(jù)從不同的數(shù)據(jù)源中抽取出來,按照一定規(guī)則加入到知識圖譜中,這個過程我們稱為知識抽取。知識抽取主要分為兩個方面,分別是命名實體識別和關(guān)系抽取。最初在技術(shù)發(fā)展不成熟時,命名實體識別和關(guān)系抽取主要以人工編寫規(guī)則或借用模板的方式進行抽取。但構(gòu)造規(guī)則的方法會耗費大量的人力物力,并且一套規(guī)則僅適用于一種領(lǐng)域,其遷移性和泛化性很低。
知識抽取面向的數(shù)據(jù)分為結(jié)構(gòu)化數(shù)據(jù)與非結(jié)構(gòu)化數(shù)據(jù),下面將簡單介紹面向這兩類數(shù)據(jù)的知識抽取。
3.2.1 面向結(jié)構(gòu)化數(shù)據(jù)的知識抽取
結(jié)構(gòu)化數(shù)據(jù)類似于關(guān)系庫中以表格形式存儲的數(shù)據(jù),數(shù)據(jù)各項之間往往存在明確的對應(yīng)關(guān)系,可以將其轉(zhuǎn)化為RDF(Resource Description Fra mewor k)或其他形式的知識庫內(nèi)容。
3.2.2 面向非結(jié)構(gòu)化數(shù)據(jù)的知識抽取
非結(jié)構(gòu)化數(shù)據(jù)的實體抽取較為復(fù)雜。舉例來說,在非結(jié)構(gòu)化數(shù)據(jù)文本中,實體抽取對象應(yīng)選取文本中的原子信息元素,通常包含任命、組織/機構(gòu)名、地理位置、事件/日期、字符值、金額值等標簽,具體的標簽定義可根據(jù)任務(wù)不同而調(diào)整。實體抽取的任務(wù)是找到命名實體名并進行分類;關(guān)系抽取是從文本中抽取出兩個或多個實體之間的語義關(guān)系。其抽取方法包括:基于規(guī)則的方法、監(jiān)督學(xué)習(xí)的方法、半監(jiān)督學(xué)習(xí)或無監(jiān)督學(xué)習(xí)的方法。
余弦相似度又稱為余弦相似性,是通過計算兩個向量的夾角余弦值來評估它們的相似度。其計算公式為:

式 (1)中,A和B分別表示向量A、B的各分量。相似性的范圍是從-1到1。-1代表兩個向量指向的方向相反,1代表兩個向量指向的方向相同,0通常代表兩個向量之間是獨立的。而在-1到1間的其余值則表示中間的相似性或相異性。
本文中的h和t用于存放用戶ID、電影名稱、電影類型以及出品方等屬性信息,r則代表每對屬性信息之間的關(guān)系。本文構(gòu)建了多個知識圖譜,分別包含電影—類型、電影—關(guān)鍵詞、電影—出品方以及用戶—電影等信息。
基于知識圖譜的電影推薦系統(tǒng)構(gòu)建主要分為四步:首先獲取電影和用戶數(shù)據(jù);然后對原始數(shù)據(jù)進行處理 (即知識抽取),構(gòu)建知識圖譜三元組;接下來將處理后的數(shù)據(jù)導(dǎo)入Neo4j圖數(shù)據(jù)庫進行可視化;最后根據(jù)構(gòu)建出來的知識圖譜進行電影推薦。
4.1.1 數(shù)據(jù)獲取
電影和用戶數(shù)據(jù)來源于Kaggle上兩個較為經(jīng)典的數(shù)據(jù)集:T MDB(The Movie Database)和Netfil x Prize。T MDB數(shù)據(jù)集存儲電影的各類屬性信息,如電影名稱、電影類型、電影關(guān)鍵詞、電影時長、票房收入等各種信息;Netfilx Prize數(shù)據(jù)集存儲用戶對電影的評分數(shù)據(jù) (評分等級從低到高依次為0~5),包含用戶ID及其對電影的評分信息。
4.1.2 數(shù)據(jù)處理和知識抽取
本文對T MDB、Netflix Prize數(shù)據(jù)庫以面向結(jié)構(gòu)化數(shù)據(jù)的抽取方式進行知識抽取。首先獲取各項之間存在的較為明確的對應(yīng)關(guān)系,進而實現(xiàn)RDF數(shù)據(jù)集的創(chuàng)建和數(shù)據(jù)對象序列化。然后基于python編寫解析程序進行數(shù)據(jù)解析和規(guī)范,對關(guān)鍵屬性進行提取,從而生成屬性數(shù)據(jù)集。
從T MDB數(shù)據(jù)集中提取出每一個電影對象所需要的屬性值 (包括電影名稱、電影類型、電影關(guān)鍵字、電影出品方),將其表示為節(jié)點,其中,電影名稱為主要節(jié)點,其他屬性為電影名稱節(jié)點的信息節(jié)點。其次是關(guān)系的構(gòu)建,節(jié)點關(guān)系定義了兩個節(jié)點之間存在的特定關(guān)聯(lián),在知識圖譜中,它可以被描述為兩個節(jié)點實體間的有形邊。以構(gòu)造電影類型三元組為例,表1中Avatar、Spectre等字段為電影名稱節(jié)點,Action、Adventure等屬性字段為電影類型節(jié)點,Genre即為Avatar節(jié)點 (電影名稱)和Action節(jié)點 (電影類型)之間的邊,其含義為:電影(《阿凡達》)的類型為Action。本例中實際存儲數(shù)據(jù)集文件時,只用存儲兩個節(jié)點即可,節(jié)點關(guān)系由Neo4j存儲時使用cypher語言說明。

表1 電影類型數(shù)據(jù)集 (部分)
從Netfil x Prize數(shù)據(jù)集中提取出用戶對電影的評分矩陣,將電影名稱和用戶ID作為節(jié)點 (實體),以用戶對該電影的評分值作為邊,進行電影名稱節(jié)點和用戶ID節(jié)點間的關(guān)系創(chuàng)建。如表2中,用戶684(用戶ID)和電影(《伴郎》)(電影名稱)之間的邊 (關(guān)系)值為4,其含義為:用戶684對電影(《伴郎》)的評分等級為4。

表2 用戶評分數(shù)據(jù)集 (部分)
其他三元組的構(gòu)建也應(yīng)用上述方法。這樣就構(gòu)建出了知識圖譜中實體以及實體之間的關(guān)系,本文構(gòu)建的電影知識圖譜實體以及關(guān)系如表3所示。

表3 實體關(guān)系表
以上就是數(shù)據(jù)處理和知識圖譜的構(gòu)建過程。處理過后的數(shù)據(jù)集是符合Neo4j導(dǎo)入要求的CSV文件,文件中包含電影名稱、電影關(guān)鍵詞、電影類型、電影出品方、用戶ID等實體以及電影名稱與電影類型、電影名稱與出品方、電影名稱與電影關(guān)鍵詞、用戶ID與電影名稱 (包含用戶給電影的評分)等實體關(guān)系。
4.2.1 Neo4j存儲的優(yōu)點
目前知識圖譜的存儲方式主要有關(guān)系型數(shù)據(jù)庫、圖數(shù)據(jù)庫和基于RDF結(jié)構(gòu)的存儲方式。圖數(shù)據(jù)庫存儲方式最大的優(yōu)點在于,圖結(jié)構(gòu)即為知識圖譜結(jié)構(gòu):圖中的節(jié)點代表知識圖譜的對象,圖中的邊代表知識圖譜對象之間的關(guān)系。目前使用最廣泛的圖數(shù)據(jù)庫為Neo4j。
Neo4j圖數(shù)據(jù)庫以圖形結(jié)構(gòu)的形式存儲信息,關(guān)聯(lián)的數(shù)據(jù)本身就是它所包含的數(shù)據(jù),因此它可以直接顯示關(guān)聯(lián)數(shù)據(jù)特征以及數(shù)據(jù)之間的關(guān)系。Neo4j導(dǎo)入節(jié)點的數(shù)量大、速度快、支持查詢算法,并且相較于傳統(tǒng)的關(guān)系型數(shù)據(jù)庫,Neo4j的遍歷算法設(shè)計借助圖結(jié)構(gòu)自然伸展的特點,不需要復(fù)雜的連接運算,因此數(shù)據(jù)及其關(guān)系復(fù)雜程度的增加不會導(dǎo)致搜索效率的下降。
4.2.2 知識導(dǎo)入
將數(shù)據(jù)導(dǎo)入Neo4j主要使用以下三種方法:第一種是使用cypher CREATE語句,為每條數(shù)據(jù)創(chuàng)建一條CREATE語句;第二種是使用cypher語法中的LOAD CSV語句;第三種是使用Neo4j官方提供的neo4j-i mport工具。cypher語言的LOAD CSV語句可以適用于任何情況下的數(shù)據(jù)導(dǎo)入。本文通過LOAD CSV語句將經(jīng)過數(shù)據(jù)預(yù)處理后的電影CSV文件導(dǎo)入到Neo4j數(shù)據(jù)庫中 (需要將處理好的數(shù)據(jù)放到Neo4j安裝路徑下的i mport文件夾中)。
4.2.2 .1 導(dǎo)入數(shù)據(jù)并創(chuàng)建節(jié)點
節(jié)點導(dǎo)入模型:
variable:Lable{key1:val ue1,…,key N:value N}
節(jié)點標簽對應(yīng)關(guān)系型數(shù)據(jù)庫的表名,而屬性對應(yīng)關(guān)系型數(shù)據(jù)庫中表的列。在被創(chuàng)建時,每個節(jié)點都會自動獲得一個默認的內(nèi)部屬性ID,其值為整數(shù)。同時,節(jié)點的ID屬性值在圖數(shù)據(jù)庫中是逐次遞增且唯一的。
以 “用戶”和 “電影”兩個節(jié)點的導(dǎo)入為例,具體的語句為:
LOAD CSV WITH HEADERS FROM'file:///grade.csv'AScsv
MERGE(m:電影{title:csv.title})
MERGE(u:用戶{id:toInteger(csv.user_id)})
4.2.2 .2 創(chuàng)建節(jié)點之間的關(guān)系
關(guān)系構(gòu)建模型:
(start Node)-[variable:relationship Type{key1:value1,…,key N:value N}]→ (end-Node)
關(guān)系模型中圓括號內(nèi)字段表示節(jié)點,方括號內(nèi)字段表示關(guān)系,花括號內(nèi)字段表示關(guān)系的屬性。關(guān)系類型形式上類似于節(jié)點標簽,且在創(chuàng)建新關(guān)系時,關(guān)系類型必須被唯一指定。在cypher語言中,關(guān)系可分為兩種:使用一對短橫線 (即--)表示一個無方向的關(guān)系;若在無方向關(guān)系的一端加上箭頭 (即→或 ←)則表示一個有方向的關(guān)系。
以上面構(gòu)建的 “用戶”和 “電影”兩個節(jié)點為例,構(gòu)建兩個節(jié)點之間的關(guān)系,即用戶給電影的評分。具體語句為:
CREATE(用 戶)-[:RATED{grading:toInteger(csv.grade)評分}]→ (電影)
當上例中節(jié)點與節(jié)點關(guān)系創(chuàng)建成功,如圖4所示。

圖4 三元組
橙色 (右)表示為 (電影(《紅磨坊》))實體,綠色 (左)表示為用戶實體 (用戶769),箭頭描述的是用戶與電影之間的關(guān)系,意味該用戶給該電影評分過。將類似的多個三元組相互連接便形成了知識圖譜,如圖5和圖6所示。所構(gòu)建的知識圖譜中節(jié)點與關(guān)系數(shù)量統(tǒng)計如表4所示。

圖5 電影知識圖譜的可視化

圖6 電影知識圖譜實體關(guān)系圖 (部分)

表4 節(jié)點與關(guān)系數(shù)量統(tǒng)計表
知識圖譜構(gòu)建完畢后,依據(jù)知識圖譜 (圖6)存儲的內(nèi)容,可以提煉出節(jié)點實體間不同語義的路徑。根據(jù)關(guān)系路徑推斷出目標用戶對電影的喜好關(guān)系,初步找到可能被其喜歡的電影集合M。再基于知識圖譜,以電影集合M中的每部電影為橋梁找到目標用戶的關(guān)聯(lián)用戶 (例如用戶1和用戶2)。

接著計算用戶之間的相似度,從關(guān)聯(lián)用戶中找到相似用戶,將相似用戶對于電影集合M中平均評分高的電影篩選出來,推薦給目標用戶,從而使推薦結(jié)果更準確。
本文以用戶134和電影(《夜鷹》)的喜好關(guān)系為例,從我們已經(jīng)構(gòu)建好的知識圖譜中可以抽取出以下路徑 (圖7):

圖7 語義推理路徑 (1)

捕捉到的路徑 (1)(2)描述的是同類型電影間的特征關(guān)系,由此可以推斷出用戶134可能會喜歡的電影是(《夜鷹》)。
從我們已經(jīng)構(gòu)建好的知識圖譜中還可以抽取出以下路徑 (圖8):

圖8 語義推理路徑 (2)

捕捉到的路徑 (3)(4)(5)描述的是從用戶134喜歡看的電影(《玉焰》)的各種屬性信息出發(fā),檢索出具有相同屬性信息的其他電影。通過多種語義路徑得到類型豐富多樣的電影集合M(部分)如表5所示:

表5 基于知識圖譜找到的電影集合M(部分)
使用余弦相似度計算關(guān)聯(lián)用戶間的相似度,將用戶評分記為向量,篩選出相似用戶 (設(shè)定閾值,相似度大于90%則認為相似),生成相似用戶的知識圖譜SI MILARITY(圖9)。

圖9 相似用戶知識圖譜SI MIL ARITY
依次檢索電影集合M中的每部電影,統(tǒng)計當前電影與SI MILARITY中每個實體 (用戶)間關(guān)系的值 (評分),缺少關(guān)系數(shù)據(jù)則忽略,計算每部電影的平均評分,降序排列后按順序為其推薦。最終為用戶134推薦的電影結(jié)果如表6所示。

表6 用戶134推薦結(jié)果 (基于相似用戶推薦)
本文以T MDB電影數(shù)據(jù)集和Netflix Prize電影評分數(shù)據(jù)集為例,構(gòu)建了電影知識圖譜,基于Neo4j圖數(shù)據(jù)庫實現(xiàn)了知識的存儲,并依據(jù)知識圖譜進行電影推薦,解決了傳統(tǒng)電影推薦算法面臨的一些難題。推薦結(jié)果也更加精準多樣,同時具有很好的可解釋性。而基于知識圖譜的電影推薦系統(tǒng)為電影推薦技術(shù)的發(fā)展開拓了新思路。知識圖譜應(yīng)用是一個較新的領(lǐng)域,本文做了一些探索。下一階段的研究重點將放在改進電影推薦算法上,嘗試解決推薦系統(tǒng)中常見的流行度—機會偏差 (Popularity-Opportunity Bias)問題,使推薦結(jié)果更精準,力求在電影推薦領(lǐng)域做出更多的貢獻。
①冷啟動問題,如何在沒有大量用戶行為數(shù)據(jù)的情況下進行有效推薦的問題。
②RDF,即資源描述框架。RDF以三元組形式存儲數(shù)據(jù)且不包含屬性信息。