首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >寻找从python中的yelp评审数据集构建矩阵的有效方法

寻找从python中的yelp评审数据集构建矩阵的有效方法
EN

Stack Overflow用户
提问于 2020-01-30 10:14:03
回答 1查看 220关注 0票数 1

目前,我正在寻找一种高效的方法来构建Python中推荐系统的评级矩阵。

矩阵应如下所示:

代码语言:javascript
复制
4|0|0|
5|2|0|
5|0|0|
4|0|0|
4|0|0|
4|0|0|
4|4|0|
2|0|0|
0|4|0|
0|3|0|
0|0|3|
0|0|5|
0|0|4|

具体来说,列是business_id,行是user_id

代码语言:javascript
复制
      |bus-1|bus-2|
user-1|stars|stars|
user-2|stars|stars|

目前,我正在使用存储在MongoDB中的Yelp数据集:

代码语言:javascript
复制
_id: "----X0BIDP9tA49U3RvdSQ"
user_id: "gVmUR8rqUFdbSeZbsg6z_w"
business_id: "Ue6-WhXvI-_1xUIuapl0zQ"
stars: 4
useful: 1
funny: 0
cool: 0
text: "Red, white and bleu salad was super yum and a great addition to the me..."
date: "2014-02-17 16:48:49"

我的方法是从审查表中构建唯一的business_iduser_id列表,并在复查表中再次查询这些值。

我在这里包含了我的代码,正如您所看到的,由于蛮力方法,构建小矩阵花费了很长时间,就像我前面所包含的那样。

下面是我的代码片段:

代码语言:javascript
复制
def makeBisnisArray(cityNameParam):
    arrayBisnis = []

    #Append business id filtered by cityNameParam to the bisnis array
    bisnisInCity = colBisnis.find({"city": cityNameParam})
    for bisnis in bisnisInCity:
        #if the business id is not in array, then append it to the array
        if(not(bisnis in arrayBisnis)):
            arrayBisnis.append(bisnis["_id"])
    return arrayBisnis

def makeUserArray(bisnisName):
    global arrayUser

    #find review filtered by bisnisName
    hslReview = colReview.find({"business_id": bisnisName})
    for review in hslReview:
        #if the user id is not already in array, append it to the array
        if(not(review['user_id'] in arrayUser)):
            arrayUser.append(review['user_id'])


def writeRatingMatrix(arrayBisnis, arrayUser):
    f = open("file.txt", "w")
    for user in arrayUser:
        for bisnis in arrayBisnis:
            #find one instance from the database by business_id and user_id
            x = colReview.find_one({"business_id": bisnis, "user_id": user})

            #if there's none, then just write the rating as 0
            if x is None :
                f.write('0|')
            #if found, write the star value
            else:
                f.write((str(x['stars'])+"|"))
        print()
        f.write('\n')


def buildCityTable(cityName):
    arrayBisnis = makeBisnisArray(cityName)
    global arrayUser
    for bisnis in arrayBisnis:
        makeUserArray(bisnis)
    writeRatingMatrix(arrayBisnis, arrayUser) 


arrayUser = []
cityNameVar = 'Pointe-Aux-Trembles'
buildCityTable(cityNameVar)

有人能提出更有效的方法为我建立评级矩阵吗?

EN

回答 1

Stack Overflow用户

发布于 2020-01-30 16:29:16

有几个一般的方法,你可以采取加快这一点。

searches.

  • Process

  • 使用集合或字典分别建立一组独特的企业和用户;Set/Dict查找要比一次列出yelp文件的速度快得多,一旦

  • 使用诸如numpy或熊猫之类的东西来构建矩阵

就像这样

代码语言:javascript
复制
users = {}
businesses = {}
ratings = {}

for entry in yelp_entries:
    if entry['user_id'] not in users:
        users[entry['user_id']] = len(users)
    if entry['business_id'] not in businesses:
        businesses[entry['business_id']] = len(businesses)
    ratings.append((
        users[[entry['user_id']],
        businesses[entry['business_id']],
        entry['stars']
    ))

matrix = numpy.tile(0, (len(users), len(businesses))
for r in ratings:
    matrix[r[0]][r[1]] = r[2]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59983612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档