对具体的某一用户,根据其他用户的评价结果,计算出他与每一个用户的相似程度,找出相似程度最高的前N位。
在函数中,通过similarity指定使用的相关性算法。
"""
为评论者打分
"""
#书中算法
def topMatches(prefs,person,n = 5,similarity = sim_pearson):
score = [(similarity(prefs,person,other),other)
for other in prefs if other != person]
score.sort() #从小到大
score.reverse() #反过来排
return score[0:n]
#自己编写
def topMatches2(prefs,person,n = 5,similarity = sim_pearson):
score = {}
for item in prefs:
if item != person:
score[item] = similarity(prefs,person,item)
score_sort = sorted(zip(score.values(),score.keys()))
score_sort.reverse()
score_sort = score_sort[0:n]
return score_sort
几个小笔记:
1、列表排序,从小排到大
score.sort()
注意,这个score由元组组成 [(相似度,人名),……],它会根据元组第一个值进行排序。
2、把列表元素顺序调转
score.reverse()
3、字典如何排序:
(1)zip(score.values(),score.keys()),把字典中每个值组成(value,key)的元组,通过zip把这些元组构成列表。
(2)score_sort = sorted(zip(score.values(),score.keys())),通过sorted函数,与scort.sort()等价。
4、取列表前N个:
score[0:n]