推薦系統講座總結

今天下午參加了一個視頻類的推薦系統技術分享,此處僅整理我覺的有用的地方,和個人一些想法。php

1.怎樣作過濾?

不少時候咱們須要用到過濾。例如對於一個用戶的檢索/推薦來講,召回結果裏首先不能含有他之前點擊(觀看)過的,也不能出現垃圾信息(廣告、色情),同時對用戶曾經拉黑、不喜歡的帳號或內容也要作過濾。html

問題一:過濾信息的可追蹤性?

考慮這樣一個場景:有一個很相關的視頻沒有被推薦給用戶,通過查詢發現被過濾了,如今咱們想知道是在以上(看過、垃圾、用戶拉黑)哪一步被過濾的?
(咱們還沒作)dom

答案是:他們的手段是,針對不一樣的過濾信息作編碼。例如如今有3個過濾手段:看過、垃圾、用戶拉黑。咱們分別爲其編碼:函數

1    看過
2    垃圾
4    用戶拉黑

如今有5個視頻,其初始默認均爲
$$[0, 0, 0, 0, 0]$$
通過步驟1
$$[1, 0, 0, 1, 0]$$
說明視頻1和4被看過。
接下來通過步驟2
$$[2, 2, 0, 0, 0]$$
同理通過步驟3
$$[4, 4, 0, 0, 0]$$
最後咱們把這些進行累加,獲得:
$$[7, 6, 0, 1, 0]$$
過濾非0的便可。實際追查起來,咱們很容易根據"7"知道視頻1過濾的緣由是同時被看過、垃圾、用戶拉黑,其餘同理。編碼

問題二:過濾信息的存儲?

考慮要將每一個用戶近3個月看過的全部視頻均存起來,很是耗存儲量。咱們能夠考慮使用布隆過濾器。
(考慮將這個後續用在「過濾hr已查看人才」的存儲)
一個bloom filter是一個有m bits的bit array,每個bit位都初始化爲0。而後使用k個hash函數,每一個都以uniform random distribution將元素hash到m個不一樣位置中的一個(此處存在一個問題:當k很大時,怎麼保證這k個hash函數的映射位置不重疊?)設計

此處有提到:code

當k很大時,設計k個獨立的hash function是不現實而且困難的。對於一個輸出範圍很大的hash function(例如MD5產生的128 bits數),若是不一樣bit位的相關性很小,則可把此輸出分割爲k份。或者可將k個不一樣的初始值(例如0,1,2, … ,k-1)結合元素,feed給一個hash function從而產生k個不一樣的數。orm

add元素:使用這k個hash函數計算,映射在k個位置上,將m bit的這k位置1便可。視頻

查詢:用k個hash function將它hash獲得k個bit位。若這k bits全爲1,則存在。若任意元素不爲1,則不存在。htm

由此咱們知道,布隆過濾器永遠不可能將「看過的判爲沒看過(畢竟已經存儲過了啊)」,但可能將沒看過的判爲看過(這須要k個hash函數同時巧合地映射在對應位置)

2.視頻中彈幕/評論的信息提取

首先用tf-idf過濾獲得關鍵詞,而後使用餘弦類似度過濾距離較遠的詞。

這樣兩步,前一步的做用是提取核心詞,後一步是過濾核心詞中的「不正常」的詞,例如在詹姆斯視頻中提到「冰與火之歌」。

3.用戶實時興趣轉移?

用戶原本對動漫感興趣,離線計算的結果也是,但此時他就是想看遊戲視頻怎麼辦?推薦應該給出實時的響應。

(個人引伸思考)
目前咱們的人才推薦,針對hr天天只推薦1次,將來考慮能夠針對hr的每次搜索作推薦的動態更新:例如hr此時搜索了3次「php」相關職位,點擊了幾個「PHP後臺」的簡歷,咱們能夠當即生成對「PHP後臺」相關的推薦。假如hr平均天天搜10次,則咱們可使目前的人才推薦曝光量增長10倍。

當hr不搜索時(或30分鐘後),人才推薦又恢復正常。

文獻引用

相關文章
相關標籤/搜索