【Python】寻找电影品味相似的用户并推荐相关电影




过程:

  • 用爬虫抓取豆瓣电影用户信息
  • 用多重分类法,定义电影评价等级
  • 计算自己与用户的皮尔逊相关度
  • 以人为主体分析相似度:找出志同道合的人,可以发现潜在喜欢的商品
  • 以商品为主体分析相似度:找出相似的商品,可以发现潜在的客户(如亚马逊的‘买了该商品的用户还买了’

电影评价多重分类:





用户信息录入:

  1. #-*- coding: utf-8 -*-  
  2. import json  
  3. import sys  
  4. reload(sys)  
  5. sys.setdefaultencoding( "utf-8" )  
  6.   
  7. user_info = {}  
  8.   
  9. #爬取到的数据  
  10. user_dict = {  
  11.              'ns2250225':[4,3,4,5,4],  
  12.              'justin':[3,4,3,4,2],  
  13.              'totox':[2,3,5,1,4],  
  14.              'fabrice':[4,1,3,4,5],  
  15.              'doreen':[3,4,2,5,3]  
  16.              }  
  17.   
  18. #录入用户数据  
  19. def user_data(user_dict):  
  20.     for name in user_dict:  
  21.         user_info[name] = {u'消失的爱人' : user_dict[name][0]}  
  22.         user_info[name][u'霍比特人3'] = user_dict[name][1]  
  23.         user_info[name][u'神去村'] = user_dict[name][2]  
  24.         user_info[name][u'泰坦尼克号'] = user_dict[name][3]  
  25.         user_info[name][u'这个杀手不太冷'] = user_dict[name][4]  
  26.           
  27.   
  28. user_data(user_dict)      
  29.   
  30. #存放用户数据  
  31. try:  
  32.     with open('user_data.txt''w') as data:  
  33.         for key in user_info:  
  34.             data.write(key)  
  35.             for key2 in user_info[key]:  
  36.                 data.write('\t')  
  37.                 data.write(key2)  
  38.                 data.write('\t')  
  39.                 data.write('\t')  
  40.                 data.write(str(user_info[key][key2]))  
  41.                 data.write('\n')  
  42.             data.write('\n')  
  43. except IOError as err:  
  44.     print('File error: ' + str(err))  


计算皮尔逊相关系数,找出兴趣相投的用户:(插入自己的数据)

  1. from math import sqrt   
  2.   
  3. #计算皮尔逊相关度(1为完全正相关,-1为完成负相关)  
  4. def sim_pearson(prefs, p1, p2):    
  5.     # Get the list of mutually rated items    
  6.     si = {}    
  7.     for item in prefs[p1]:    
  8.         if item in prefs[p2]:    
  9.             si[item] = 1    
  10.     
  11.     # if they are no ratings in common, return 0    
  12.     if len(si) == 0:    
  13.         return 0    
  14.     
  15.     # Sum calculations    
  16.     n = len(si)    
  17.     
  18.     # Sums of all the preferences    
  19.     sum1 = sum([prefs[p1][it] for it in si])    
  20.     sum2 = sum([prefs[p2][it] for it in si])    
  21.     
  22.     # Sums of the squares    
  23.     sum1Sq = sum([pow(prefs[p1][it], 2for it in si])    
  24.     sum2Sq = sum([pow(prefs[p2][it], 2for it in si])    
  25.     
  26.     # Sum of the products    
  27.     pSum = sum([prefs[p1][it] * prefs[p2][it] for it in si])    
  28.     
  29.     # Calculate r (Pearson score)    
  30.     num = pSum - (sum1 * sum2 / n)    
  31.     den = sqrt((sum1Sq - pow(sum1, 2) / n) * (sum2Sq - pow(sum2, 2) / n))    
  32.   
  33.     if den == 0:    
  34.         return 0    
  35.     r = num / den  
  36.       
  37.     return r  
  38.   
  39.   
  40. #插入自己的数据  
  41. user_info['me'] = {u'消失的爱人' : 5,  
  42.                    u'神去村' : 3,  
  43.                    u'炸裂鼓手' : 5}  
  44.   
  45.   
  46.             
  47. #找出皮尔逊相关系数>0的用户,说明该用户与自己的电影品味比较相近  
  48. for user in user_info:  
  49.     res = sim_pearson(user_info, 'me', user)  
  50.     if res > 0:  
  51.         print('the user like %s is : %s' % ('me', user))  
  52.         print('result :%f\n' % res)  

向某用户推荐电影(加权平均所有人的评价)

  1. #向某个用户推荐电影(加权平均所有人的评价值)  
  2. def getRecommendations(prefs,person,similarity=sim_pearson):  
  3.   totals={}  
  4.   simSums={}  
  5.   for other in prefs:  
  6.     # don't compare me to myself  
  7.     if other==person: continue  
  8.     sim=similarity(prefs,person,other)  
  9.   
  10.     # ignore scores of zero or lower  
  11.     if sim<=0continue  
  12.     for item in prefs[other]:  
  13.           
  14.       # only score movies I haven't seen yet  
  15.       if item not in prefs[person] or prefs[person][item]==0:  
  16.         # Similarity * Score  
  17.         totals.setdefault(item,0)  
  18.         totals[item]+=prefs[other][item]*sim  
  19.         # Sum of similarities  
  20.         simSums.setdefault(item,0)  
  21.         simSums[item]+=sim  
  22.   
  23.   # Create the normalized list  
  24.   rankings=[(total/simSums[item],item) for item,total in totals.items()]  
  25.   
  26.   # Return the sorted list  
  27.   rankings.sort()  
  28.   rankings.reverse()  
  29.   return rankings  
  30.   
  31.   
  32. #向我推荐电影  
  33. res = getRecommendations(user_info, "me")  
  34. print('Recommand watching the movie:')  
  35. print json.dumps(res, encoding='UTF-8', ensure_ascii=False)  

结果与分析:

  • 与我电影口味相近的用户有:doreen, fabrice 
  • 推荐我看的电影有:泰坦尼克号,这个杀手不太冷
  • 以人为主体分析, 找出有相似爱好的人, 并向这些人推荐商品,可以发现潜在喜欢的商品
  • 而若以商品为主体分析, 找出相似的商品, 找出喜欢这个产品的人, 可以发现商品潜在的客户




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值