我使用MongoDB作为数据存储,并希望将文档的“集群”配置存储在单独的集合中。
所以在一个集合中,我会有我的原始对象集,而在我的第二个集合中,它会有
kMeansCollection: {
1: [mongoObjectCopy1], [mongoObjectCopy2]...
2: [mongoObjectCopy3], [mongoObjectCopy4]...
}我在这里遵循文本聚类的K-方法,http://tech.swamps.io/recipe-text-clustering-using-nltk-and-scikit-learn/,但是我很难思考如何将输出绑定到MongoDB中。
一个例子(取自链接):
if __name__ == "__main__":
tags = collection.find({}, {'tag_data': 1, '_id': 0})
clusters = cluster_texts(tags, 5) #algo runs here with 5 clusters
pprint(dict(clusters))var“tag”是运行algo所需的输入。它必须以数组的形式出现,但是当前标记返回一个对象数组(因此我必须从查询中提取文本值)。
然而,在神奇地聚类了我的集合5种方式之后,我如何才能将它们与它们各自来自mongo的对象条目结合起来呢?
我只从对象的一个属性中输入特定的文本内容。
非常感谢!
发布于 2016-05-29 01:29:39
您需要有一些文档的标识符。在查询中包含_id字段可能是个好主意,这样您就有了一个唯一的文档标识符。然后,您可以创建ids和tag_data的并行列表。
docs = collection.find({}, {'tag_data': 1, '_id': 1})
ids = [doc['_id'] for doc in docs]
tags = [doc['tag_data'] for doc in docs]然后调用标记数据上的集群函数。
clusters = cluster_text(tags)然后用zip将结果与ids一起返回。
doc_clusters = zip(ids, clusters)从这里开始,您已经构建了(_id, cluster)的元组,这样就可以更新mongo文档上的集群标签。
发布于 2016-05-29 06:53:06
这样做的有效方法是使用聚合框架使用服务器端操作创建"_id“和”标记数据“列表。这还减少了通过线路发送的数据量,以及用于在客户端解码文档的时间和内存。
您需要对文档进行$group,并使用$push累加器操作符返回_id列表和tag-data列表。当然,aggregate()方法允许访问聚合管道。
cursor = collection.aggregate([{
'$group': {
'_id': None,
'ids': {'$push': '$_id'},
'tags': {'$push': '$tag-data'}
}
}])然后使用.next()方法在CommandCursor上检索数据,因为我们按None分组,因此游标包含一个元素。
data = cursor.next()在此之后,只需调用您的函数并将结果zip。
clusters = cluster_text(data['tags'])
doc_clusters = zip(data['ids'], clusters)https://stackoverflow.com/questions/37505192
复制相似问题