[推薦系統]利用使用者標籤資料
推薦系統的目的是聯絡使用者的興趣和物品,這種聯絡需要以來不同的媒介。GroupLens在一篇文章中表示目前流行的推薦系統基本上通過3種方式聯絡童虎興趣和物品。
第一種方式是利用使用者喜歡過的物品,給使用者推薦與他喜歡過的物品相似的物品,也就是基於物品的推薦演算法。第二種方式是利用和使用者興趣相似的其他使用者,給使用者推薦那些和他們興趣愛好相似的其他使用者的喜歡的物品,也就是基於使用者的推薦演算法。第三種方式是通過一些特徵聯絡使用者和物品,給使用者推薦那些具有使用者喜歡的特徵的物品。特徵有不同的表現方式,比如可以表現為物品的屬性集合(比如對於圖書,屬性集合包括作者、出版社、主題和關鍵詞等),也可以錶行為隱語義向量,可以通過隱語義模型學習得到。還有一種重要的特徵表現方式—標籤。
根據維基百科的定義,標籤是一種無層次化結果的、用來描述資訊的關鍵詞,可以用來描述物品的語義。根據給物品打標籤的人的不同,標籤應用一般分為兩種:一種是讓作者或者專家給物品打標籤;另一種是讓普通使用者給物品打標籤,也就是UGC(User Generated Content,使用者生成的內容)的標籤應用。UGC的標籤系統是一種表示使用者興趣和物品語義的重要方式。當一個使用者對一個物品打上一個標籤,這個標籤一方面描述了使用者的興趣,另一方面則表示了物品的語義,從而將使用者和物品聯絡了起來。
UGC標籤系統的代表應用
UGC標籤系統是很多Web2.0網站的必要組成部分,使用UGC標籤系統的代表網站—UGC標籤系統的鼻祖Delicious、論文書籤網站CiteULike、
Delicious
Delicious允許使用者給網際網路上的每個網頁打標籤,從而通過標籤重新組織整個網際網路。
CiteULike
CiteULike是一個著名的論文書籤網站,允許研究人員提交或者收藏自己感興趣的論文並且給論文打標籤,從而幫助使用者更好地發現和自己研究領域相關的優秀論文。
標籤系統在各種各樣的(音樂、視訊和社交等)網站中都得到了廣泛應用。標籤系統的最大優勢在於可以發揮群體的智慧,獲得對物品內容資訊比較準確的關鍵詞描述,而準確的內容資訊是提升個性化推薦系統性能的重要資源。
標籤系統中的推薦問題
打標籤作為一種重要的使用者行為,蘊含了很多使用者興趣資訊,深入研究和利用使用者打標籤的行為可以很好地知道我們改進個性化推薦系統的推薦質量。同事標籤的表示形式非常簡單,便於很多演算法處理。
標籤系統中的推薦問題主要有以下兩個:
- 如何利用使用者打標籤的行為為其推薦物品(基於標籤的推薦)?
- 如何在使用者給物品打標籤時為其推薦適合該物品的標籤(標籤推薦)?
為了研究上面的兩個問題,首先需要回答3個問題:
- 使用者為什麼要打標籤?
- 使用者怎麼打標籤?
- 使用者打什麼樣的標籤?
使用者為什麼打標籤
在設計基於標籤的個性化推薦系統之前,需要深入瞭解使用者的標註行為(即打標籤的行為),知道使用者為什麼要標註,使用者怎麼標註,只有深入瞭解使用者的行為,才能基於這個行為設計出令他們滿意的個性化推薦系統。
Morgan Ames從兩個維度探討。首先是社會維度,有些使用者標註是給內容上傳者使用的(便於上傳者組織自己的資訊),而有些使用者標註是給廣大使用者使用的(便於幫助其他使用者找到資訊)。利用一個維度是功能維度,有些標註使用者更好地組織內容,方便使用者將來的查詢,而另一些標註使用者傳達某種資訊,比如照片的拍攝時間和地點等。
使用者如何打標籤
在網際網路中,儘管每個使用者的行為看起來是隨機的,但其實這些表面隨機的行為背後蘊含著很多規律。
使用者活躍度和物品流行度的分佈都遵循長尾分佈,發現標籤流行度的分佈也呈現非常典型的長尾分佈。
使用者打什麼的標籤
在使用者看到一個物品時,希望他打的標籤是能夠準確描述物品內容屬性的關鍵詞,但使用者旺旺不是按照我們的想法操作,可能會給物品打上各種各樣奇奇怪怪的標籤。
常見的情況是提供許多各種各樣的標籤供使用者選擇,給物品打上他認為的標籤。
基於標籤的推薦系統
使用者用標籤來描述對物品的看法,因此標籤是聯絡使用者和物品的紐帶,也是反應使用者興趣的重要資料來源,如何利用使用者的標籤資料提高個性化推薦結果的質量?
一個使用者標籤行為的資料集一般由一個三元組的集合表示,其中記錄(u,i,b)表示使用者u給物品i打上了b標籤。使用者真實標籤行為資料遠遠比三元組表示的複雜,比如使用者打標籤的時間、使用者的屬性資料、物品的屬性資料等。
一個最簡單的標籤系統推薦演算法
演算法描述如下:
- 統計每個使用者最常用的標籤;
- 對於每個標籤,統計被打過這個標籤次數最多的物品;
- 對於一個使用者,首先找到他最常用的標籤,然後找到具有這些標籤的最熱門物品推薦給這個使用者。
對於上面演算法,使用者u對物品i的興趣公式如下:
B(u)是使用者u打過的標籤集合,B(i)是物品i被打過的標籤集合, 是使用者u打過標籤b的次數, 是物品i被打過標籤b的次數。
演算法改進
預測使用者u對物品i的興趣公式,可以發現很多缺點。
1.TF-IDF
原來的計算公式傾向於給熱門標籤對應的熱門物品很大的比重,會造成推薦熱門的物品給使用者,從而降低推薦結果的新穎性。另外,利用使用者的標籤向量對使用者興趣建模,其中每個標籤都是使用者使用過的標籤,而標籤的權重是使用者使用該標籤的次數。這種建模方法的缺點是給熱門標籤過大的權重,從而不能反應使用者個性化的興趣。借鑑TF-IDF思想,對其進行改進:
記錄標籤b被多少個不同的使用者使用過。
也可以對熱門物品進行懲罰,得到如下公式:
其中,
表示物品i被多少不同的使用者打過標籤。
實驗表明,適當懲罰熱門標籤和熱門物品,在增進推薦結果個性化的同時並不會降低推薦結果的離線精度。
2.資料稀疏性
在前面的演算法中,使用者興趣和物品的聯絡是通過
中的標籤建立的。但對於新使用者或者新物品,這個集合中的標籤數量會很少。為了提高推薦的準確率,可能要對標籤集合做擴充套件,比如使用者曾經用過“推薦系統”這個標籤,可以將這個標籤的相似標籤也加入到使用者標籤集合中,比如“個性化”,“協同過濾”等標籤。
進行標籤擴充套件有很多方法,常用的有話題模型(topic model),簡單的方法有基於鄰域的方法。
標籤擴充套件的本質是對每個標籤找到和它相似的標籤,也就是計算標籤之間的相似度。最簡單的相似度可以是同義詞,如果有一個同義詞詞典,可以根據詞典進行標籤擴充套件;如果沒有詞典,可以從資料中統計出標籤的相似度。
如果認為同一個物品上的不同標籤具有某種相似度,那麼當兩個標籤同時出現在很多物品的標籤集合中時,可以認為這兩個標籤具有較大的相似度。
實驗發現,進行標籤擴充套件確實能夠提高基於標籤的物品推薦的準確率和召回率,但可能會稍微降低推薦結果的覆蓋率和新穎度。
3.標籤清理
不是所有標籤都能反應使用者的興趣。標籤清理的另一個重要意義在於將標籤作為推薦解釋。如果我們要把標籤呈現給使用者,將其作為給使用者推薦某一個物品的解釋,對標籤的質量要求就很高。首先,這些標籤不能包含沒有意義的停止詞或者表示情緒的詞,其次這些推薦解釋裡不能包含很多意義相同的詞語。
一般標籤清理方法:
- 去除詞頻很高的停止詞;
- 去除因詞根不同造成的同義詞,比如recommender system 和 recommendation system;
- 去除因分隔符造成的同義詞,比如collaborative_filtering 和 collaborative-filtering。
為了控制標籤的質量,很多網站也採用了讓使用者進行反饋的思想,即讓使用者告訴系統某個標籤是否合適。
基於圖的推薦演算法
首先,我們需要將使用者打標籤的行為表示到一張圖上。帶權圖是由頂點、邊和邊上的權重組成的。而在使用者標籤資料集上,有3種不同的元素,即使用者、物品和標籤。因此,需要定義3種不同的頂點,即使用者頂點、物品頂點和標籤頂點。然後,如果我們得到一個表示使用者u給物品i打了標籤b的使用者標籤行為 (u,i,b),那麼在圖中增加3條邊,首先需要在使用者u對應的頂點v(u)和物品i對應的頂點v(i)之間增加一條邊(如果這兩個頂點已經有邊相連,那麼就應該將邊的權重加1),同理,在v(u) 和v(b)之間需要增加一條邊, v(i)和v(b)之間也需要邊相連線。
用圖模型解釋前面的簡單演算法。使用者對物品的興趣公式表示為:
公式假定使用者對物品的興趣通過標籤傳遞。因此,可以更簡單的建模,省去使用者和物品之前的連線。
基於標籤的推薦解釋
基於標籤的推薦其最大好處是可以利用標籤做推薦解釋,這方面的代表性應用是豆瓣的個性化推薦系統。
要讓使用者直觀上感覺推薦結果有道理是很困難的,而豆瓣將推薦結果的可解釋性拆分成了兩部分,首先讓使用者覺得標籤雲是有道理的,然後讓使用者覺得從某個標籤推薦出某本書也是有道理的。
- 使用者對標籤的興趣對幫助使用者理解為什麼給他推薦某個物品更有幫助(因為你對這個標籤感興趣,所以給你推薦這個標籤下的物品);
- 使用者對標籤的興趣和物品標籤相關度對於幫助使用者判定自己是否喜歡被推薦物品具有同樣的作用;
- 物品標籤相關度對於幫助使用者判定被推薦物品是否符合他當前的興趣更有幫助;
- 客觀事實類標籤相比主觀感受類標籤對使用者更有作用。
給使用者推薦標籤
當用戶瀏覽某個物品時,標籤系統非常希望使用者能夠給這個物品打上高質量的標籤,這樣才能促進標籤系統的良性迴圈。因此,很多標籤系統都設計了標籤推薦模組給使用者推薦標籤。
為什麼要給使用者推薦標籤
給使用者推薦標籤有以下好處:
- 方便使用者輸入標籤: 讓使用者從鍵盤輸入標籤會增加使用者大標籤的難度,這樣很多使用者不願意給物品打標籤,因此需要一個輔助工具來減小使用者打標籤的難度,從而提供使用者打標籤的參與度。
- 提高標籤質量: 同一個語義不同的使用者可能用不同的詞語來表示。這些同義詞會使標籤的詞表變得很龐大,而且會使計算相似度不太準確。而使用推薦標籤時,可以對詞表進行選擇,首先保證詞表不出現太多的同義詞,同事保證出現的詞都是一些比較熱門的、有代表性的詞。
如何給使用者推薦標籤
使用者u給物品i打標籤時,有很多方法可以給使用者推薦和物品i相關的標籤。比較簡單的方法有4種。
第1種方法就是給使用者u推薦整個系統裡最熱門的標籤;令tags[b]表示標籤b的熱門程度,
def RecommendPopularTags(user, item, tags, N):
return sorted(tags.items(),key=lambda a:a[1],reverse=True)[:N]
第2種方法是給使用者u推薦物品i上最熱門的標籤;item_tags[i][b]為物品i被打上標籤b的次數,
def RecommendItemPopularTags(user, item, item_tags, N):
return sorted(item_tags[item].items(),key=lambda a:a[1],reverse=True)[:N]
第3種方法是給使用者u推薦他自己經常使用的標籤;users_tags[u][b]為使用者u經常使用的標籤b的次數:
def RecommendUserPopularTags(user,item,user_tags,N):
return sorted(user_tags[user].items(),key=lambda a:a[1],reverse=True)[:N]
第4種方法是前面兩種方法的融合,通過一個係數將上面的推薦結果線性加權,然後生成最終的推薦結果:
def RecommendHybridPopularTags(user,item,user_tags,item_tags,alpha,N):
max_user_tag_weight = max(user_tags[user].values())
for tag,weight in user_tags[user].items():
ret[tag] = (1-alpha)*weight / max_user_tag_weight
max_item_tag_weight = max(item_tags[item].values())
for tag,weight in item_tags[item].items():
if tag not in ret:
ret[tag] = alpha * weight / max_item_tag_weight
else:
ret[tag] += alpha*weight/max_item_tag_weight
return sorted(ret.items(),key=lambda a:a[1],reverse=True)[:N]
在將兩個列表線性相加時將兩個列表按最大值做了歸一化,好處是便於控制兩個列表對最終結果的影響,不至於因為物品非常熱門而淹沒使用者對推薦結果的影響,或因為使用者非常活躍淹沒物品對推薦結果的影響。
但是,上面基於統計使用者常用標籤和物品常用標籤演算法有一個缺點,對新使用者或者不熱門的物品很難有推薦結果。解決這一問題有兩個思路:
- 從物品的內容資料中抽取關鍵詞作為標籤。這方面的研究很多,特別是在上下文廣告領域。
- 針對有結果,但結果不太多的情況。對標籤進行標籤擴充套件。標籤擴充套件的關鍵在於計算標籤之間的相似度。
基於圖的標籤推薦演算法
圖模型可以用於標籤推薦。