標籤:style blog http color io os 使用 ar strong
基本上可以通過3種方式聯絡使用者興趣和物品:
- 使用者喜歡過的物品(item-cf)
- 使用者的好友或者有相似興趣的好友喜歡過的物品(user-cf)
- 使用者具有哪些feature, 哪些物品保護
之前用了user-cf,item-cf, 現在考慮使用標籤進行推薦。
標籤是一種無層次化結構的、用來描述資訊的關鍵詞。
給物品打標籤:
標籤系統中存在的問題:
基於標籤的推薦系統樣本:
利用Delicious資料集:(待連結)
格式:userID bookmarkID tagID timestamp
方法如書上介紹:
代碼如下:
# -*- coding: UTF-8 -*-‘‘‘Created on 2014??9??15??@author: joeyqzhou‘‘‘import randomdef addValueToMat(theMat,key,value,incr): #theMat是字典格式 #它的value也是字典格式 if key not in theMat: #如果key沒出先在theMat中 theMat[key]=dict(); theMat[key][value]=incr;# else: if value not in theMat[key]: theMat[key][value]=incr; else: theMat[key][value]+=incr;user_tags = dict();tag_items = dict();user_items = dict();user_items_test = dict();def InitStat(): #init: data_file = open(‘E:\\RecomDataSet\\Decilious\\bookTag\\user_taggedbookmarks-timestamps.dat‘) line = data_file.readline(); ##去掉第一行 line = data_file.readline(); while line: if random.random()>0.1:##添加xunlianji terms = line.split("\t"); user=terms[0]; item=terms[1]; tag=terms[2]; addValueToMat(user_tags,user,tag,1) addValueToMat(tag_items,tag,item,1) addValueToMat(user_items,user,item,1) line = data_file.readline(); else: addValueToMat(user_items_test,user,item,1) data_file.close(); def Recommend(usr): recommend_list = dict(); tagged_item = user_items[usr]; for tag_,wut in user_tags[usr]: for item_,wit in tag_items[tag_]: if item_ not in tagged_item: if item_ not in recommend_list: recommend_list[item_]=wut*wit; else: recommend_list[item_]+=wut*wit;InitStat();#Recommend(8);recom_len=0;#推薦的總長度hit=0;#預測準確的個數test_len=0;#測試集長度for user in user_items_test:#計算測試集的長度,來計算召回率 test_len+=user_items_test[user].__len__();for user in user_items: for item in user_items[user]: #item被使用者打過的標籤至少打過一次 if user_items[user][item]>0:#如果打過三次以上就推薦 recom_len+=1; if item in user_items_test: hit+=1;print "precision="+str(hit*1.0/recom_len);print "recall="+str(hit*1.0/test_len);###利用內建sorted函數排序#print sorted(user_items[‘8‘].items(),key=lambda dic:dic[1],reverse=True)
把資料集分為10%測試,90%訓練,個人程式跑的結果如下:
準確率:1.8%
召回率:5.6%
- 上面簡單的方法可能會造成容易推薦熱門,可以利用TF-IDF來最佳化
- 對於新使用者或者新item,標籤比較稀疏,那麼可以進列標籤擴充。方法有:
-
標籤清理
-
- 不是所有標籤都反應使用者的興趣(比如“不好笑)
- 有利於給推薦解釋
- 方法:去掉停止詞,合并同義字或者分隔字元造成的同義字。
推薦系統實踐第四章: 利用使用者標籤