猿问

Pymongo 的问题:想要向现有数据库添加具有不同值的新字段,但所有条目都是相同的

我有一个评论数据库,并想在我的数据库中创建一个新字段,指示评论是否包含与“池”相关的单词。


import re

import pandas as pd

from pymongo import MongoClient


client = MongoClient()


db = client.Hotels_Copenhagen

collection = db.get_collection("hotel_review_table")


data = pd.DataFrame(list(collection.find()))


def common_member(a, b):

    a_set = set(a)

    b_set = set(b)

    if a_set & b_set:

        return True

    else:

        return False


pool_set = {"pool","swim","swimming"}



for single_review in data.review_text:

    make_it_lowercase = str(single_review).lower()

    tokenize_it = re.split("\s|\.|,", make_it_lowercase)

    pool_mentioned = common_member(tokenize_it, pool_set)

    db.hotel_review_table.update_one({}, {"$set":{"pool_mentioned": pool_mentioned}})

在 python 中,我已经统计了包含与“pool”相关的单词的评论数量,结果发现我的评论中有 1k/50k 谈论的是 pool。


我通过将 db.hotel_review_table.update_one 行移动到循环中解决了之前发布的在各处获取相同条目的问题。


这样主要问题就解决了。然而,像这样更新数据库需要相当长的时间。还有其他方法可以让它更快吗?


梦里花落0921
浏览 1365回答 1
1回答

德玛西亚99

您费了很大的劲才实现了 MongoDB 中开箱即用的功能。您需要使用文本索引。创建文本索引(在 MongoDB shell 中):db.hotel_review_table.createIndex( { "single_review": "text" } )然后你的代码可以简化为:from pymongo import MongoClientdb = MongoClient()['Hotels_Copenhagen']for keyword in ['pool', 'swim', 'swimming']:    db.hotel_review_table.update_many({'single_review': keyword}, {'$set': {'pool_mentioned': True}})请注意,如果未提及,则不会将该值设置为 false;如果确实需要,您可以编写另一个更新来将任何不为 true 的值设置为 false。
随时随地看视频慕课网APP

相关分类

Python
我要回答