基于淘宝点击及购买记录的口碑商家推荐——基于物品的协同过滤

Table_2: Users’shopping records at brick-and-mortar stores before Dec. 2015. (ijcai2016_koubei_train)
User_id、Merchant_id、Location_id 、Time_Stamp
Table_3: Merchant information. (ijcai2016_merchant_info)
Merchant_id 、Budget(budget constraints imposed on the merchant) 、Location_id_list
Table_4: Prediction result. (ijcai2016_koubei_test)
User_id、Location_id、Merchant_id_list

首先统计出下面几个字典:
{用户:[商家]}
{商家:[用户]}
{商家:商家热度} (热度用用户访问次数来表示)
{商圈:{商家:商家热度}} (方便后面的推荐)
商家间的相似度矩阵(其实是存储在字典中)

1、对于某用户,若其所在商圈内商家少于10个,则全部推荐,并且按照商家热度从高到低排序。
2、冷启动问题,若该用户之前没有使用过口碑,即没有历史商家记录,则推荐所在商圈热门的前十个商家(需排序)。
3、如果有历史商家记录,分别对消费过的商家找到相似商家和相似度,对于所有消费过的商家设置等权,累计同一商家的相似度,按照相似度从大到小排序,推荐前十个。

# -*- coding:utf-8 -*-
__author__ = 'Bai'
import os,math,csv
os.chdir('c:/Bai/datasets/tianchi_ijcai2016')
f1 = open('ijcai2016_merchant_info')
context1 = f1.readlines()
f2 = open('ijcai2016_koubei_train')
context2 = f2.readlines()
f3 = open('ijcai2016_koubei_test')
context3 = f3.readlines()

csvfile = file('forcast.csv','wb')
writer = csv.writer(csvfile)

#统计字典: {用户:[商家]}、{商家:[用户]} 及 {商家:商家热度}
user_merchant = {}
merchant_user = {}
merchant_popular = {}
for x in context2:
    x = x.replace('\n','').split(',')
    if x[0] not in user_merchant:
        user_merchant[x[0]] = set()
    user_merchant[x[0]].add(x[1])
    if x[1] not in merchant_user:
        merchant_user[x[1]] = set()
        merchant_popular[x[1]] = 0
    merchant_user[x[1]].add(x[0])
    merchant_popular[x[1]] += 1

#统计字典: {商圈:{商家:商家热度}}
district_merchant = {}
for x in context1:
    x = x.replace('\n','').split(',')
    y = x[2].split(':')
    for j in y:
        if j not in district_merchant:
            district_merchant[j] = {}
        district_merchant[j][x[0]] = merchant_popular[x[0]]

#统计商家间的相似度矩阵
C = {}
N = {}
for user in user_merchant:
    for i in user_merchant[user]:
        if i not in N:
            N[i] = 0
        N[i] += 1
        if i not in C:
            C[i] = {}
        for j in user_merchant[user]:
            if i == j:
                continue
            if j not in C[i]:
                C[i][j] = 0
            C[i][j] += 1
W = {}
for i in C:
    if i not in W:
        W[i] = {}
    for j in C[i]:
        W[i][j] = C[i][j]/math.sqrt(N[i] * N[j])

for i in context3:
    i = i.replace('\n','').split(',')
    #若商圈内商家数量少于十个,则全部推荐
    if len(district_merchant[i[1]]) <= 10:
        #将商家按照热度排序
        s = sorted(district_merchant[i[1]].iteritems(),key=lambda t:t[1],reverse=True)
        for j in range(len(s)):
            if j == 0:
                a = s[j][0]
            else:
                a = a + ':' + s[j][0]
    #冷启动:若用户没有口碑商家记录,则推荐所在商区热门商家前十个,按照商家热度从大到小的顺序
    elif i[0] not in user_merchant:
        s = sorted(district_merchant[i[1]].iteritems(),key=lambda t:t[1],reverse=True)
        for j in range(10):
            if j == 0:
                a = s[j][0]
            else:
                a = a + ':' + s[j][0]
    else:
        e = set()
        sim_merchant = {}
        for u in user_merchant[i[0]]:
            for v in W[u]:
                if v not in sim_merchant:
                    sim_merchant[v] = 0
                sim_merchant[v] += W[u][v]

        s2 = sorted(sim_merchant.iteritems(),key=lambda t:t[1],reverse=True)
        j = 0
        for k in s2:
            e.add(k[0])
            if j == 10:
                break
            if j == 0:
                a = k[0]
            else:
                a = a + ':' + k[0]
            j += 1
        if j < 10:
            s = sorted(district_merchant[i[1]].iteritems(),key=lambda t:t[1],reverse=True)
            l = 0
            n = 0
            while n < 10-j:
                if s[l][0] in e:
                    continue
                else:
                    if len(a) == 0:
                        a = s[l][0]
                    else:
                        a = a + ':' + s[l][0]
                    n += 1
                l += 1
    i.append(a)
    writer.writerow(i)
csvfile.close()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个Python期末大作业是一个基于协同过滤算法的电影推荐系统,采用了neo4j数据库来存储和查询电影数据。协同过滤算法是一种利用用户的历史行为和兴趣来进行推荐的方法,它可以根据用户的喜好和其他用户的相似度来推荐用户可能感兴趣的电影。 这个电影推荐系统的实现包括以下几个步骤:首先,通过爬虫从网上获取电影的相关信息,比如电影的名字、导演、演员、类型等等,并将这些信息存储到neo4j数据库中。然后,根据用户的历史行为和评分数据,计算用户之间的相似度,并将相似度的结果也存储到数据库中。接下来,当用户登录系统并选择了一个电影,系统会根据用户喜欢的电影类型和其他用户的相似度,从数据库中查找可能感兴趣的电影,并进行推荐。 通过采用neo4j数据库,这个电影推荐系统可以更高效地存储和查询大数据量的电影信息和用户数据。neo4j是一个图数据库,它的存储结构和图的结构相似,可以更好地支持复杂的关系型数据的存储和查询。同时,neo4j也提供了丰富的查询语言和API,方便我们实现各种复杂的查询和推荐算法。 总而言之,这个基于协同过滤算法的电影推荐系统使用了neo4j数据库来存储和查询电影数据,通过分析用户的历史行为和其他用户的相似度来进行推荐,可以更好地满足用户的个性化需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值