指定された購入イベントのリスト (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}
}
ハンマーを釘で 2 回購入したこと (人 1、3)、ドライバーを 1 回購入したこと (人 1)、ネジをドライバーで 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
これを行うことができるより効率的な方法はありますか?また、この種の操作に適切な学名があれば教えていただきたいです。
編集: 同時に一緒に購入されたアイテムに購入を制限していないという事実を含めるように明確にしました. アイテムはいつでも購入できます。