博主是天然語言處理方向的,不是推薦系統領域的,這個程序徹底是爲了應付大數據分析與計算的課程做業所寫的一個小程序,先上程序,一共55行。不在乎細節的話,55行的程序已經表現出了協同過濾的特性了。就是對每個用戶找4個最接近的用戶,而後進行推薦,在選擇推薦的時候是直接作的在4個用戶中選擇該用戶item沒包括的,固然這裏沒限制推薦數量,我的以爲若是要提升推薦準確率的畫,起碼,1,要對流行的item進行處理。2,將相鄰的四個用戶的item進行排序,從多到少的進行推薦。程序所用的數據是movielens上的(http://grouplens.org/datasets/movielens)。類似度的計算也很簡單,直接用了交集和差集的比值。好吧,上程序小程序
#coding utf-8 import os import sys import re f1=open("/home/alber/data_base/bigdata/movielens_train_result.txt",'r') #讀取train文件,已經處理成每一行表明一位用戶的item,項之間用空格。 f2=open("/home/alber/data_base/bigdata/movielens_train_result3.txt",'a') txt=f1.readlines() contxt=[] f1.close() userdic={} for line in txt: line_clean=" ".join(line.split()) position=line_clean.index(",") ID=line_clean[0:position] item=line_clean[position+1:] userdic.setdefault(ID,item) if len(item)>=5: #對觀影量少於5的用戶不計入類似性計算的範圍 contxt.append(item) for key in userdic.keys(): #計算每位用戶的4個最類似用戶 ID_num=key value=userdic[key] user_item=value.split(' ') Sim_user=[] for lines in contxt: lines_clean=lines.split(' ') intersection=list(set(lines_clean).intersection(set(user_item))) lenth_intersection=len(intersection) difference=list(set(lines_clean).difference(set(user_item))) lenth_difference=len(difference) if lenth_difference!=0: Similarity=float(lenth_intersection)/lenth_difference #交集除以差集做爲類似性的判斷條件 Sim_user.append(Similarity) else: Sim_user.append("0") Sim_user_copy=Sim_user[:] Sim_user_copy.sort() Sim_best=Sim_user_copy[-4:] position1=Sim_user.index(Sim_best[3]) position2=Sim_user.index(Sim_best[2]) position3=Sim_user.index(Sim_best[1]) position4=Sim_user.index(Sim_best[0]) if position1!=0 and position2!=0 and position3!=0 and position4!=0: recommender=userdic[str(position1)]+" "+userdic[str(position2)]+" "+userdic[str(position3)]+" "+userdic[str(position4)] #將4位用戶的看過的電影做爲推薦 else: recommender="none" reco_list=recommender.split(' ') recomm=[] for good in reco_list: if good not in user_item: recomm.append(good) else: pass f2.write((" ".join(recomm)+"\n")) f2.close()