给定购买事件列表(customer_id,item)
1-hammer
1-screwdriver
1-nails
2-hammer
2-nails
3-screws
3-screwdriver
4-nails
4-screws
我正在尝试构建一个数据结构,该结构可以告诉您一件商品与另一件商品一起购买了多少次。不是同时买的,是我开始存数据的时候买的。结果看起来像
{
hammer : {screwdriver : 1, nails : 2},
screwdriver : {hammer : 1, screws : 1, nails : 1},
screws : {screwdriver : 1, nails : 1},
nails : {hammer : 1, screws : 1, screwdriver : 1}
}
表示用钉子买了两次锤子(人 1,3),用螺丝刀买了一次(人 1),用螺丝刀买了一次螺丝(人 3),依此类推......
我目前的做法是
users = dict 其中 userid 是键,购买的物品列表是值
usersForItem = dict 其中 itemid 是键,购买项目的用户列表是值
userlist = 对当前项目评分的用户的临时列表
pseudo:
for each event(customer,item)(sorted by item):
add user to users dict if not exists, and add the items
add item to items dict if not exists, and add the user
----------
for item,user in rows:
# add the user to the users dict if they don't already exist.
users[user]=users.get(user,[])
# append the current item_id to the list of items rated by the current user
users[user].append(item)
if item != last_item:
# we just started a new item which means we just finished processing an item
# write the userlist for the last item to the usersForItem dictionary.
if last_item != None:
usersForItem[last_item]=userlist
userlist=[user]
last_item = item
items.append(item)
else:
userlist.append(user)
usersForItem[last_item]=userlist
所以,在这一点上,我有 2 个字典——谁买了什么,谁买了什么。这就是棘手的地方。现在填充了 usersForItem,我循环遍历它,遍历每个购买该项目的用户,并查看用户的其他购买。我承认这不是最 Pythonic 的做事方式——我试图确保在使用 Python 之前得到正确的结果(我就是这样)。
relatedItems = {}
for key,listOfUsers in usersForItem.iteritems():
relatedItems[key]={}
related=[]
for ux in listOfReaders:
for itemRead in users[ux]:
if itemRead != key:
if itemRead not in related:
related.append(itemRead)
relatedItems[key][itemRead]= relatedItems[key].get(itemRead,0) + 1
calc jaccard/tanimoto similarity between relatedItems[key] and its values
有没有更有效的方法可以做到这一点?此外,如果这种手术有合适的学术名称,我很想听听。
编辑:澄清包括我不限制购买同时购买的物品这一事实。物品可以随时购买。