用户相似度分析
计算用户购买物品的相似度
假设当前文件夹中有“用户行为记录.xlsx”,要求统计所有用户中相似度最高的n个用户及其共同购买物品数量,其中n可以指定为大于或等于2的整数。相似度高的定义为共同购买物品数量最多。
文件“用户行为记录.xlsx”里的数据内容
程序编写
使用Python扩展库openpyxl读取Excell文件中的数据,返回一个字典。在字典中,使用用户名字作为“键“,使用包含该用户购买物品名称的集合作为”值“。读取数据时,跳过表头,对于每一行有效数据,获取每一行的物品名称和用户清单,对该物品的购买用户进行分割得到用户列表,列表中的每个用户都购买过该行对应的物品。
from itertools import combinations
from functools import reduce
import openpyxl
from openpyxl import Workbook
def getUsers(filename):
users = dict()
# 打开xlsx文件,并获取第一个worksheet
wb = openpyxl.load_workbook(filename)
ws = wb.worksheets[0]
# 遍历Excel文件中的所有行
for index, row in enumerate(ws.rows):
# 绕过第一行的表头
if index == 0:
continue
# 获取物品名称和用户列表
filmName, actor = row[0].value, row[1].value.split(',')
# 遍历购买该物品的所有用户,统计购买用户
for a in actor:
users[a] = users.get(a, set())
users[a].add(filmName)
return users
data = getUsers(r'C:\Users\st\Desktop\用户行为记录.xlsx')
def relations(num):
# 参数num表示要查找购买物品相似的num个人
# 包含全部物品的集合
allFilms = reduce(lambda x,y: x|y, data.values(), set())
# 购买相似的num个用户及其购买物品的名称
combiData = combinations(data.items(), num)
trueLove = max(combiData,
key=lambda item: len(reduce(lambda x,y:x&y,
[i[1] for i in item],
allFilms)))
return ('满意度相似的{0}个用户是{1},'
'Ta们共同购买物品数量是{2}'.format(num,
tuple((item[0] for item in trueLove)),
len(reduce(lambda x,y:x&y,
[item[1] for item in trueLove],
allFilms))))
print(relations(2))
print(relations(3))
print(relations(4))