1+ #!/usr/bin/env python
2+ #-*-coding:utf-8-*-
3+ import random
4+ #统计各类数量
5+ def addValueToMat (theMat ,key ,value ,incr ):
6+ if key not in theMat : #如果key没出先在theMat中
7+ theMat [key ]= dict ();
8+ theMat [key ][value ]= incr ;
9+ else :
10+ if value not in theMat [key ]:
11+ theMat [key ][value ]= incr ;
12+ else :
13+ theMat [key ][value ]+= incr ;#若有值,则递增
14+
15+ user_tags = dict ();
16+ tag_items = dict ();
17+ user_items = dict ();
18+ user_items_test = dict ();#测试集数据字典
19+
20+ #初始化,进行各种统计
21+ def InitStat ():
22+ data_file = open ('delicious.dat' )
23+ line = data_file .readline ();
24+ while line :
25+ if random .random ()> 0.1 :#将90%的数据作为训练集,剩下10%的数据作为测试集
26+ terms = line .split ("\t " );#训练集的数据结构是[user, item, tag]形式
27+ user = terms [0 ];
28+ item = terms [1 ];
29+ tag = terms [2 ];
30+ addValueToMat (user_tags ,user ,tag ,1 )
31+ addValueToMat (tag_items ,tag ,item ,1 )
32+ addValueToMat (user_items ,user ,item ,1 )
33+ line = data_file .readline ();
34+ else :
35+ addValueToMat (user_items_test ,user ,item ,1 )
36+ data_file .close ();
37+
38+ #推荐算法
39+ def Recommend (usr ):
40+ recommend_list = dict ();
41+ tagged_item = user_items [usr ];#得到该用户所有推荐过的物品
42+ for tag_ ,wut in user_tags [usr ].items ():#用户打过的标签及次数
43+ for item_ ,wit in tag_items [tag_ ].items ():#物品被打过的标签及被打过的次数
44+ if item_ not in tagged_item :#已经推荐过的不再推荐
45+ if item_ not in recommend_list :
46+ recommend_list [item_ ]= wut * wit ;#根据公式
47+ else :
48+ recommend_list [item_ ]+= wut * wit ;
49+ return sorted (recommend_list .iteritems (), key = lambda a :a [1 ],reverse = True )
50+
51+ InitStat ()
52+ recommend_list = Recommend ("48411" )
53+ # print recommend_list
54+ for recommend in recommend_list [:10 ]: #兴趣度最高的十个itemid
55+ print recommend
0 commit comments