此文是根據(jù)《推薦系統(tǒng)實踐》部分整理而來。
PART 1 介紹
GroupLens在一篇文章中表示目前流行的推薦系統(tǒng)基本上通過3種方式聯(lián)系用戶興趣和物品:
- 喜歡過的物品
- 有相似興趣的用戶
- 特征
其中,這里的特征有不同的表現(xiàn)方式,比如尅表現(xiàn)為物品的屬性集合,也可以表現(xiàn)為隱語義向量。本文將討論一種重要的特征表現(xiàn)方式----標(biāo)簽。
標(biāo)簽應(yīng)用一般分為兩種:一種是讓作者或者專家給物品打標(biāo)簽;另一種是讓普通用戶給物品打標(biāo)簽,也就是UGC的標(biāo)簽應(yīng)用。
UGC的標(biāo)簽應(yīng)用對用戶來說有幾個好處:
- 表達。標(biāo)簽系統(tǒng)幫助用戶表達對物品的看法。
- 組織。打標(biāo)簽幫助用戶組織喜歡的物品。
- 學(xué)習(xí)。打標(biāo)簽幫助用戶增加對物品的了解。
- 發(fā)現(xiàn)。標(biāo)簽系統(tǒng)幫助用戶更容易發(fā)現(xiàn)喜歡的物品。
- 決策。標(biāo)簽系統(tǒng)幫助用戶判定是否去購買/使用某個物品。
PART 2 標(biāo)簽系統(tǒng)中的推薦問題
標(biāo)簽系統(tǒng)中的推薦問題主要有以下兩個:
- 如何利用用戶打標(biāo)簽的行為為其推薦物品(基于標(biāo)簽的推薦)?
- 如何在用戶給物品打標(biāo)簽時為其推薦適合該物品的標(biāo)簽(標(biāo)簽推薦)?
為了研究上面兩個問題,我們首先需要解答下面3個問題:
- 用戶為什么要打標(biāo)簽?
- 用戶怎么打標(biāo)簽?
- 用戶打什么樣的標(biāo)簽?
第一個問題從兩個維度進行探討:
- 社會維度,有些用戶標(biāo)注是給內(nèi)容上傳者使用的,有些用戶標(biāo)注是給廣大用戶使用的。
- 功能維度,有些標(biāo)注用于更好地組織內(nèi)容,方便用戶的查找,另一些標(biāo)注用于傳達某種信息,比如照片的拍攝時間地點。
第二個問題,盡管每個用戶的行為看起來的隨機的,但是之前提到,用戶行為中用戶活躍度和物品流行度都是遵循著長尾分布。研究后發(fā)現(xiàn)標(biāo)簽流行度的分布也遵循長尾分布,下圖橫坐標(biāo)是流行度k,縱坐標(biāo)是流行度為k的標(biāo)簽總數(shù)n(k):

第三個問題,用戶會給物品打上奇奇怪怪的標(biāo)簽,分為以下幾類:
- 表明物品是什么
- 表明物品的種類
- 表明誰的物品
- 表達用戶的觀點
- 用戶相關(guān)的標(biāo)簽
- 用戶的任務(wù)
- 類型
- 時間
- 任務(wù)
- 地點
- 語言
- 獎項
- 其他
PART 2 基于標(biāo)簽的推薦系統(tǒng)
之前的一個問題是:如何利用用戶的標(biāo)簽數(shù)據(jù)提高個性化推薦結(jié)果的質(zhì)量。
以豆瓣為例,將標(biāo)簽系統(tǒng)融入產(chǎn)品線,在每本書的頁面上,都提供了這本書上用戶最常打的標(biāo)簽,同時在用戶給書做評價時,豆瓣也會讓用戶給圖書打標(biāo)簽。最后,豆瓣利用標(biāo)簽將用戶的推薦結(jié)果做了聚類,顯示了對不同標(biāo)簽下用戶的推薦結(jié)果,從而增加了推薦的多樣性和可解釋性。
一個用戶標(biāo)簽行為的數(shù)據(jù)集一般由一個三元組的集合表示,其中記錄(u,i,b)表示用戶u給物品i打上了標(biāo)簽b,當(dāng)然實際上維度會更多,這里只考慮最簡單的形式。中間的實驗設(shè)置略過,直接進入算法。
首先一個最簡單的算法是:
- 統(tǒng)計每個用戶最常用的標(biāo)簽。
- 對于每個標(biāo)簽,統(tǒng)計被打過這個標(biāo)簽次數(shù)最多的物品。
- 對于一個用戶,首先找到他常用的標(biāo)簽,然后找到具有這些標(biāo)簽的最熱門物品推薦給這個用戶。
對于上面的算法,用戶u對物品i的興趣公式如下:

這里,B(u)是用戶u打過的標(biāo)簽集合,B(i)是物品i被打過的標(biāo)簽集合,Nu,b是用戶u打過標(biāo)簽b的次數(shù),Nb,i是物品i被打過標(biāo)簽b的次數(shù)。這個算法被作者稱為SimpleTagBased。
評測結(jié)果為:

上面的公式會有很多缺點,以下逐條分析并且提出修改意見:
-
TF-IDF
前面這個公式傾向于給熱門標(biāo)簽對應(yīng)的熱門物品很大的權(quán)重,因此會降低新穎性,并且不能反映個性化的興趣。在這里可以借鑒 TF-IDF的思想,對這一公式進行改進:
Paste_Image.png
這里nb(u)記錄了標(biāo)簽b被多少個不同的用戶使用過,這個算法記為TagBasedTFIDF。下圖給出了這個算法在兩個數(shù)據(jù)集上的離線實驗性能,可以看到所有指標(biāo)上都比SimpleTagBased高。

同理,借鑒TF-IDF的思想對熱門物品進行懲罰,從而得到如下公式:

ni(u)記錄了物品i被多少個不同的用戶打過標(biāo)簽,這個算法記為TagBasedTFIDF++。下圖展示了這個算法的離線實驗性能,和TagBasedTFIDF相比,除了多樣性有所下降,其他指標(biāo)都有明顯提高。這一結(jié)果表明,適當(dāng)懲罰熱門標(biāo)簽和熱門物品,在增進推薦結(jié)果個性化的同時并不會降低推薦結(jié)果的離線精度:

- 數(shù)據(jù)的稀疏性
由于用戶興趣和物品是通過B(u)∩B(i)中的標(biāo)簽建立的,但是對于新用戶或者新物品,這個集合中的標(biāo)簽數(shù)量會很少,為了提高推薦的準(zhǔn)確率,我們可能要對標(biāo)簽集合做擴展,進行標(biāo)簽擴展有很多方法,其中常用的有話題模型,不過這里遵循簡單的原則介紹一種基于鄰域的方法。
標(biāo)簽擴展本質(zhì)是對每個標(biāo)簽找到和它相似的標(biāo)簽,也就是計算標(biāo)簽的相似度。如果認(rèn)為同一個物品上的不同標(biāo)簽具有某種相似度,那么當(dāng)兩個標(biāo)簽同時出現(xiàn)在很多物品的標(biāo)簽集合中時,我們就可以認(rèn)為這兩個標(biāo)簽具有較大的相似度。對于標(biāo)簽b,令N(b)為有標(biāo)簽b的物品的集合,n_{b,i}為給物品i打上標(biāo)簽b的用戶數(shù),我們可以通過如下余弦相似度公式計算標(biāo)簽b和標(biāo)簽b'的相似度:

為了測試性能進行試驗,對于曾經(jīng)打過標(biāo)簽數(shù)少于20的用戶,我們找到其所打標(biāo)簽的相關(guān)標(biāo)簽,然后將這些標(biāo)簽聚合排序,結(jié)果前20標(biāo)簽作為用戶相關(guān)的標(biāo)簽,下表展示了離線實驗的性能,相比之前而言,進行標(biāo)簽擴展確實能提高準(zhǔn)確率和召回率,但可能會稍微降低推薦結(jié)果的覆蓋率和新穎度。
- 標(biāo)簽清理
有些標(biāo)簽不能反應(yīng)用戶的興趣,比如一個用戶說一個物品“差”,那么就并不是他喜歡的標(biāo)簽。標(biāo)簽清理的另一個重要意義在于將標(biāo)簽作為推薦解釋,如果我們要把標(biāo)簽呈現(xiàn)給用戶,將其作為給用戶推薦某一物品的解釋,對標(biāo)簽的質(zhì)量要求就很高。首先標(biāo)簽不能包含沒有意義的停止詞或者表示情緒的詞,其次這些推薦解釋里不能包含很多意義相同的詞語。一般來說有以下清理方法:
- 去除詞頻很高的停止詞;
- 去除因詞根不同造成的同義詞;
- 去除因分隔符造成的同義詞。
為了控制標(biāo)簽的質(zhì)量,很多網(wǎng)站也采用了讓用戶進行反饋的思想,即讓用戶告訴系統(tǒng)某個標(biāo)簽是否合適。
同樣這里基于圖的推薦算法也不介紹了。介紹下基于標(biāo)簽的推薦解釋,這是基于標(biāo)簽的推薦的一個好處。舉例豆瓣,豆瓣有一個標(biāo)簽云,表示用戶的興趣分布,標(biāo)簽的尺寸越大,表示用戶對這個標(biāo)簽相關(guān)的圖書越感興趣。這樣組織頁面,首先提高了推薦結(jié)果的多樣性,讓用戶自己根據(jù)他今天的興趣選擇相關(guān)的標(biāo)簽,從而得到推薦結(jié)果。同時,標(biāo)簽云也提供了推薦解釋功能,其他的也不多做介紹,下圖為豆瓣的頁面:

PART 4 給用戶推薦標(biāo)簽
首先,給用戶推薦標(biāo)簽有以下好處:
- 方便用戶輸入標(biāo)簽
- 提高標(biāo)簽質(zhì)量
如何給用戶推薦標(biāo)簽?zāi)兀?/p>
用戶u給物品i打標(biāo)簽時,我們有很多方法可以給用戶推薦和物品i相關(guān)的標(biāo)簽,比較簡單的方法有 4 種:
- 給用戶u推薦整個系統(tǒng)最熱門的標(biāo)簽,稱為PopularTags;
- 給用戶u推薦物品i上最熱門的標(biāo)簽,稱為ItemPopularTags;
- 給用戶u推薦他自己經(jīng)常使用的標(biāo)簽,稱為UserPopularTags;
- 前面兩種的融合,該方法通過一個系數(shù)將上面的推薦結(jié)果線性加權(quán),然后生成最終的推薦結(jié)果,稱為HybirdPopularTags.
下圖列出了PopularTags、ItemPopularTags、UserPopularTags三種算法在N=10(N為推薦標(biāo)簽數(shù)量)的準(zhǔn)確率和召回率:

結(jié)果看出,ItemPopularTags具有最好的準(zhǔn)確率和召回率,這一點是直觀的,因為用戶興趣廣泛,基于物品的精度理應(yīng)是最高的。
再看下HybirdPopularTags算法,下圖給出了在不同顯性融合系數(shù)α下的準(zhǔn)確率和召回率:


其中α=0.8時(ItemPopularTags權(quán)重更大),取得了最好的準(zhǔn)確度,并且超過了ItemPopularTags的精度。
不過有一個缺點,就是對新用戶或者不熱門的物品很難有推薦結(jié)果,解決這個問題有兩個思路:
- 從內(nèi)容數(shù)據(jù)中抽取關(guān)鍵詞作為標(biāo)簽;
- 針對有結(jié)果,但結(jié)果不太多的情況,進行標(biāo)簽擴展。
