我有一个评论数据库,并想在我的数据库中创建一个新字段,指示评论是否包含与“池”相关的单词。import reimport pandas as pdfrom pymongo import MongoClientclient = MongoClient()db = client.Hotels_Copenhagencollection = 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 Falsepool_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 行移动到循环中解决了之前发布的在各处获取相同条目的问题。这样主要问题就解决了。然而,像这样更新数据库需要相当长的时间。还有其他方法可以让它更快吗?
1 回答
德玛西亚99
TA贡献1770条经验 获得超3个赞
您费了很大的劲才实现了 MongoDB 中开箱即用的功能。您需要使用文本索引。
创建文本索引(在 MongoDB shell 中):
db.hotel_review_table.createIndex( { "single_review": "text" } )
然后你的代码可以简化为:
from pymongo import MongoClient
db = 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。
添加回答
举报
0/150
提交
取消