vlambda博客
学习文章列表

文本挖掘:找出兴趣相投的用户并作产品推荐

21CTO导读:

Python在机器学习,推荐算法,数据抓取,大数据分析等领域,提供了很多不错的扩展模块。本文就为大家抛砖引玉,提供一个用户对电影兴趣的推荐算法,欢迎讨论。






目录:


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


电影评价多重分类:

  1. 很差

  2. 较差

  3. 还行

  4. 推荐

  5. 力荐


代码:

  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 

  • 推荐我看的电影有:泰坦尼克号,这个杀手不太冷

  • 以人为主体分析, 找出有相似爱好的人, 并向这些人推荐商品,可以发现潜在喜欢的商品

  • 而若以商品为主体分析, 找出相似的商品, 找出喜欢这个产品的人, 可以发现商品潜在的客户



来源:数据挖掘入门与实战