(廣西大學 計算機與電子信息學院,廣西 南寧 530004)
推薦系統[1-2]可以根據用戶的興趣、特點、需求等,為用戶提供信息服務。與一般的搜索引擎不同的是,推薦系統是通過研究用戶自身的興趣偏好來進行個性化的推薦。一個好的推薦系統,能自動挖掘用戶的興趣點,引導用戶發現自己的信息需求,同時,通過為用戶提供個性化的推薦服務從而與用戶建立聯系,使得用戶對推薦系統產生依賴。
視頻推薦是根據當前熱門的視頻,研究用戶的一些個性化數據,為用戶提供個性化的視頻推薦服務,以增加用戶黏度,從而提高視頻網站流量。對在線電影提供商而言,在線視頻推薦系統[3]的推薦效率對公司的經濟效益會產生直接的影響,甚至會影響到公司的發展。
推薦領域比較成熟的算法有基于內容的推薦算法、協同過濾算法、基于規則的推薦算法、基于效用的推薦算法、基于知識的推薦算法等。本文采用基于用戶的協同過濾算法[4-7]實現個性化的電影推薦服務。基于用戶的協調過濾算法的主要步驟如下:
(1)尋找與目標用戶興趣相似的用戶集合;
(2)找到這個集合中的用戶所喜歡的,然后把目標用戶沒有接觸過的物品推薦給目標用戶。
該算法的核心就是計算兩個用戶之間的興趣相似度,給定用戶u和用戶v,令N(u)表示用戶u感興趣的物品集合,N(v)表示用戶v感興趣的物品集合,通過余弦相似度公式計算出兩兩用戶之間的相似度,進行比較,最終篩選出與目標用戶相似度最高的用戶集合。余弦相似度公式為:

爬蟲是一種能自動運行的程序,其功能是從網絡上爬取到特定的數據。Scrapy是一個基于Python的開源爬蟲框架[8],包含多種中間件接口。目前Scrapy已廣泛應用于數據挖掘、檢測和自動化測試等項目上,采用Scrapy爬取豆瓣網上的電影信息作為本系統個性化推薦的基礎數據。
本文設計的電影推薦系統包含以下六大功能模塊:用戶注冊登錄、個人標簽管理、電影篩選和查找、個性化推薦服務、個人喜好列表、影評管理。其中個性化推薦模塊是系統的核心模塊。
本系統采用MySQL數據庫,在Django model[9]基礎上額外設計了4個數據表:電影信息表、用戶額外信息表、評論表、愛好行為表。
(1)電影信息表用于存儲電影信息,結構見表1所列。

表1 電影信息表
(2)用戶額外信息表是基于Django models中的User表創建的,User表包含了用戶名、密碼、E-mail等信息,那么用戶額外信息表只需存儲額外的用戶信息,結構見表2所列。

表2 用戶額外信息表
(3)評論表是用來存儲用戶的影評內容,結構見表3所列。

表3 評論表
(4)愛好行為表就是用于存儲用戶對一部電影的行為,行為類型分為三種:want(想看)、like(喜歡)、dislike(不喜歡),結構見表4所列。

表4 愛好行為表
進入本系統后,系統首先會在后臺采用Scrapy框架爬取豆瓣電影網上的實時電影信息數據作為基礎數據集。實時電影信息主要包括:電影名、上映時間、主演、類型、評分、簡介、封面圖片等。當采用Scrapy將數據爬取下來后,還需要寫爬蟲規則,采用CSS與Xpath結合的解析規則進行解析,解析出來再經過數據清洗就可直接存儲到數據庫。
為了獲得個性化的電影推薦服務,第一次使用本系統的用戶需要注冊成為系統會員,此時出現的是注冊頁面。當用戶成功登錄系統后,系統會跳轉到電影大廳,即系統首頁,此時系統出現的是默認推薦的電影信息,用戶可以在此選擇自己喜歡的電影進行收藏。針對不同的用戶,系統首頁是不一樣的,針對喜歡“2017年評分最高的美國動作片”篩選出來的電影,如圖1所示。

圖1 系統首頁
對剛注冊成功的用戶,系統會跳轉到標簽管理頁面,如圖2所示。用戶通過此頁面管理標簽,系統針對用戶設置的標簽進行個性化推薦。這些標簽都可以修改,當用戶的喜好改變了,即可從用戶名下拉列表中選擇“我的標簽”進入標簽管理頁面。

圖2 標簽管理頁面
個性化推薦模塊分為4個子模塊:站內推薦、我的標簽、猜你喜歡、類似推薦。
(1)“站內推薦”子模塊
站內推薦是推薦當前最新的電影資源,根據后臺數據庫里所存儲的最新電影信息獲得最新的電影資源,并將這些資源顯示在系統前端頁面。
(2)“我的標簽”子模塊
該模塊的實現流程是獲取用戶喜愛的標簽,根據標簽過濾電影信息,最后按照推薦指數進行排序,最后獲取推薦指數高的推薦給目標用戶。具體流程是:首先根據用戶喜歡的標簽,對電影類型進行統計,篩選出符合類型的電影;然后根據豆瓣評分、評分人數來進行排序,之后對比結果;最后過濾掉用戶的喜好列表中的電影,得到結果再取排在最前面的幾個電影作為最終結果。這樣每種用戶喜歡的元素都篩選出前N個,最終推薦給用戶,如圖3所示。

圖3 根據用戶喜歡的電影的標簽得到的推薦
(3)“猜你喜歡”子模塊
“猜你喜歡”子模塊使用了基于用戶的協同過濾算法結合標簽統計計算的方法進行推薦,該方法是傳入目標用戶的感興趣電影集與其他所有用戶的數據集(包括:用戶ID、用戶電影興趣列表),經過計算返回一個相似度從高到低的字典,字典形式為{用戶ID:相似度}。系統根據返回的字典獲取推薦的電影信息,經過過濾處理后推薦給用戶。這里涉及到冷啟動問題,就是當用戶興趣列表為0,導致無法計算興趣相似度,因此采用根據標簽與推薦指數計算的方法來代替推薦結果。具體流程是:
Step 1:獲取目標用戶喜好列表;
Step 2:根據余弦相似度公式計算目標用戶與其他用戶之間的相似度;
Step 3:根據相似度進行由高到低的排序,獲取前5個用戶的喜好列表;
Step 4:根據前5個用戶喜好列表,過濾掉不包含目標用戶喜愛標簽與已存在目標用戶喜愛列表的電影;
Step 5:將步驟4得到的電影集進行豆瓣評分與評分人數的總和比較;
Step 6:最終篩選出前2部電影,進行推薦。推薦結果如圖4所示。

圖4 采用協同過濾算法得出的推薦結果
在這個模塊中存在一個推薦指數,這個推薦指數是根據豆瓣評分與評分人數來計算的,假設豆瓣評分為R,評分人數為P。評分公式為:R=(P/2)·0.6+(P/10 000)·0.4。
也就是評分轉為5分滿分后權重取0.6,評論人數為每萬人評得1分后權重取0.4,最后相加得到推薦指數,推薦指數最大為5星。
(4)“類似推薦”子模塊
系統根據目標電影的標簽,對數據庫中其他所有電影進行統計、過濾,得到標簽相同和推薦指數(推薦指數與“猜你喜歡”模塊的推薦指數算法是一致的)靠前的電影,過濾掉用戶以前接觸過的電影后將剩下的電影推薦給用戶。
電影查詢模塊能方便地讓用戶搜索自己所喜歡的電影,本系統支持電影名模糊搜索、演員模糊搜索。
喜好列表模塊是一個與用戶進行交互的模塊,用戶可選擇電影添加到“喜歡”列表或“不喜歡”列表。為了增強體驗感,使用Ajax異步請求來實現。后臺數據庫接收到用戶的反饋后進行判斷,確定是否是用戶的新的喜好,如果是則更新該用戶的這個喜好記錄。用戶對電影的喜好設置在兩個地方:“電影詳情”頁面如圖5所示;“猜你喜歡”頁面如圖6所示。

圖5 用戶在“電影詳情”頁面的反饋按鈕

圖6 用戶在“猜你喜歡”頁面的反饋按鈕
影評是每個電影網站必不可少的功能之一,它是用戶對一部電影的觀后感,不僅能對其他用戶起到一定的指導作用,還可以影響系統的推薦效率。影評模塊通過Ajax異步提交表單信息,后臺把提交的原始評論信息進行存儲,再到前臺通知是否評論成功。
隨著影視行業的飛速發展,每年的電影數量都在劇增,這對視頻推薦提出了更高的要求,而本系統具有個性化的推薦功能以及一定的商業價值。本系統現已部署在線并穩定提供服務,由于系統使用簡單,交互性良好,推薦準確,得到了使用用戶的一致好評。