Python MongoDB+;K表示聚类

Python MongoDB+;K表示聚类,python,mongodb,machine-learning,scikit-learn,nltk,Python,Mongodb,Machine Learning,Scikit Learn,Nltk,我使用MongoDB作为数据存储,希望将文档的“集群”配置存储在单独的集合中 所以在一个集合中,我有我的原始对象集,在第二个集合中,它有 kMeansCollection: { 1: [mongoObjectCopy1], [mongoObjectCopy2]... 2: [mongoObjectCopy3], [mongoObjectCopy4]... } 我在这里关注文本集群的K-means实现,但我很难思考如何将输出绑定回MongoDB 示例(摘自链接): v

我使用MongoDB作为数据存储,希望将文档的“集群”配置存储在单独的集合中

所以在一个集合中,我有我的原始对象集,在第二个集合中,它有

kMeansCollection: {
     1: [mongoObjectCopy1], [mongoObjectCopy2]...
     2: [mongoObjectCopy3], [mongoObjectCopy4]... 
   }
我在这里关注文本集群的K-means实现,但我很难思考如何将输出绑定回MongoDB

示例(摘自链接):

var“tags”是运行algo所需的输入。 它必须是数组的形式,但当前标记返回一个对象数组(因此我必须从查询中提取文本值)

然而,在神奇地聚集了我的收藏5种方式之后,我如何才能将它们与来自mongo的各自对象条目重新结合起来

我只从对象的一个属性输入特定的文本内容


非常感谢

您需要为文档设置一些标识符。在查询中包含
\u id
字段可能是一个好主意,这样您就有了唯一的文档标识符。然后,您可以创建
id
tag\u数据的并行列表

docs = collection.find({}, {'tag_data': 1, '_id': 1})
ids = [doc['_id'] for doc in docs]
tags = [doc['tag_data'] for doc in docs]
然后对标记数据调用cluster函数

clusters = cluster_text(tags)
zip
将结果与
id
一起返回

doc_clusters = zip(ids, clusters)

从这里您已经构建了
(\u id,cluster)
的元组,因此您可以更新mongo文档上的集群标签。

有效的方法是使用聚合框架,使用服务器端操作创建“\u id”和“标记数据”的列表。这还减少了通过线路发送的数据量以及用于在客户端解码文档的时间和内存

您需要保存文档并使用累加器操作符返回
\u id
列表和
标记数据列表。当然,该方法允许访问聚合管道

cursor = collection.aggregate([{
    '$group': {
        '_id': None, 
        'ids': {'$push': '$_id'}, 
        'tags': {'$push': '$tag-data'}
    }
}])
然后使用上的方法检索数据,因为我们按
None
分组,因此光标只保留一个元素

data = cursor.next()
之后,只需调用函数和结果

clusters = cluster_text(data['tags'])
doc_clusters = zip(data['ids'], clusters)
clusters = cluster_text(data['tags'])
doc_clusters = zip(data['ids'], clusters)