1. 程式人生 > >tag 推薦系統的關鍵問題以及解決方案

tag 推薦系統的關鍵問題以及解決方案

最近在做推薦產品,讀了一些論文,客觀的說,扯淡的居多,基本的思路也差不多,結合工作的情況,談一下tag推薦的產品形態、主要問題以及如何推薦

產品形態以及主要問題

tag 的推薦系統,顧名思義,利用使用者或者item的 tag資訊進行推薦,涉及到兩個產品形態:

1.tag-based recommend,基於tag資訊推薦item給使用者

2.tag recommend,給使用者推薦tag

無論1,還是2,都面臨一個問題,tag從哪裡來?這個是tag推薦系統最為關鍵的事情。通常來講,有4個:

1.專家標註,貌似jnni是這樣做的

2.UGC,由使用者產生,douban等很多都是這樣搞得

3.系統產生,利用使用者/item資料

4.人工和系統相結合

解決了tag產生的問題,構建tag體系後,我們只需要抽取相關的feature,就可以完成item推薦或者tag推薦。

tag產生

工程上分析一下如何生成tag:

1.專家標註

目前大多數公司不現實,尤其是startup時,不可能有這麼大的投入。

在垂直領域,這個問題可以簡化,成熟的相關網站抓取,比如3C類,可以去京東,中關村線上等,結構化資料,效果不錯。

覆蓋率可能不夠,但是作為startup公司或者要求不高時,應該夠用,如果做深,是一個無底洞,taobao N多人N年搞產品庫,投入很大。

所以有朋友希望兼職做做產品庫挖掘,尤其說類似淘寶那種,直接拒絕。

2.UGC

tag的獲取不是問題,產生的tag有很大的隨意性,問題在於如何處理這些tag,主要問題:

1.書寫不規範,最重要的問題,比如 美女,大美女,recomend system recomendation system, RS 等等,需要做歸一化

2.同義關係

目前UGC 產生標籤,是最主要的形式,不過產品前期比較多,穩定後用戶更多的會採用推薦的tag

3.系統產生

用系統產生tag,基於user或者item資訊,最簡單的方式,將使用者訪問item的title取出來,處理後生成tag給使用者,比如使用者瀏覽”美女范冰冰“,可以將”美女“”范冰冰“作為該item的tag。

這種方式在系統初始化時,非常有效,無UGC資料,如果給使用者提供tag,提高使用者體驗以及規範使用者行為

目前的工作主要是針對使用者的瀏覽的web,提供該web的tag資訊,供使用者選擇。問題是web的title包含的資訊太好,尤其是非文字類web頁面。主要處理的方式,對title分詞後

1.過濾掉停用詞,比如數字,的,一個 等,極端一點過濾掉所有的單字,但是會將其中的名詞濾掉

2.只考慮名詞,動名詞,地名,人名等實體詞,這些詞對title的資訊描述比較好,類似 購買,採購等動詞沒有意義,這些資訊可以在分詞是獲取到詞性資訊

3.計算每個token的idf值,對於title來講,token的 tf值一般都是1,所以只需要idf,出現在title的次數越多,idf越小,生僻token的idf值偏大

目前沒有辦法很好的計算token的全域性或者在title中的分數,只能用idf來描述,大多數情況下還行,但是不夠準確。

將使用者訪問過過的所有item title獲取到,提取出來的tag可以作為使用者的profile 

4.人工和系統結合

這個依賴稍微多一些,1,通過專家或者其他方式獲取一批種子資料,比如某些item的tag,然後通過item間的相似性或者其他方式將item關聯起來,將tag擴散出去,同樣可以生成item的tag列表,當然會有一個權重資訊,將低權重濾掉即可。UR

產生種子後,搜尋資料中在同query下,url的內容相似性也很大 ,可以獲取query->clicked url list以及 clicked url->qurey list,目標是同時對query以及url產生tag,初始化 ,其中 表示通過改query點選url的次數除以通過query點選所有url的總次數。

同時 , 表示通過通過q訪問u的次數除以通過所有qeury訪問u的總次數,不停地迭代,最後將seed中的tag擴散出去,針對每個url/query,去概率最大的幾個tag。

tag推薦

當有了tag資料後,就是利用tag完成那兩個產品推薦,首先說明一下可能的feature

1.使用者user 使用tag的次數

2.item被打上tag的次數

3,tag被多少個user使用過

4.tag被用在多少個item上面

5.p(tag|user)

6.p(item|tag)

7.p(tag|item)

8.p(user|tag)

利用這些資料以及常用的理論,進行推薦:

1.基於tag給使用者推薦item

計算user對item的喜好程度,最直接的做法 使用者使用tag越多,tag使用者item的越多,那麼使用者可能越喜歡。

很容易想到萬能的tf-idf,如果這個tag被其他使用者用過的越少,說明這個tag也能代表user的興趣,同樣如果item被使用的其他的tag越少,tag越能刻畫item,轉化為:

也可以利用 概率模型直接算,p(u,i) = 。

在實際使用時,無法兩類,基於使用者還是基於item,比如item-based,使用者最近訪問的item,選取item最可能的屬於的tag,p(tag|item)分值較大的,然後將這個tag熱門的內容推薦出來,p(item|tag)比較大的item,準確率可能比較低,但是複雜度低。

2.tag推薦

兩個思路,推薦使用者常用的tag以及item上常用的tag,也就是 大的tag列表。

<推薦系統實踐>做過對比試驗,兩個都提供,使用者使用的概率最大,所以類似douban等都會將內容提供出來

一些思考:

tag是連線user 和item的手段,更清楚的表達的使用者的意圖,比較像topic model,在user-item中間引入一層具備 語義資訊的概念。