用户相似度分析

用户相似度分析

计算用户购买物品的相似度

假设当前文件夹中有“用户行为记录.xlsx”,要求统计所有用户中相似度最高的n个用户及其共同购买物品数量,其中n可以指定为大于或等于2的整数。相似度高的定义为共同购买物品数量最多。

文件“用户行为记录.xlsx”里的数据内容](https://img-blog.csdnimg.cn/2021042010032098.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2N4eTg2MTA0NjMxNw==,size_16,color_FFFFFF,t_70)

程序编写

使用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))

运行结果

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值