MongoDB + K意味着群集

时间:2016-05-29 01:04:49

标签: python mongodb machine-learning scikit-learn nltk

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

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

<div>

我在这里实现了一个用于文本聚类的K-means,http://tech.swamps.io/recipe-text-clustering-using-nltk-and-scikit-learn/,但是我很难想到如何将输出绑定回MongoDB。

一个例子(取自链接):

kMeansCollection: {
     1: [mongoObjectCopy1], [mongoObjectCopy2]...
     2: [mongoObjectCopy3], [mongoObjectCopy4]... 
   }

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

然而,在神奇地将我的收藏集合为5种方式后,如何将它们与来自mongo的各自对象条目重新组合?

我只从对象的一个​​属性中提供特定的文本内容。

非常感谢!

2 个答案:

答案 0 :(得分:3)

您需要为文档提供一些标识符。在查询中包含_id字段可能是个好主意,这样您就可以拥有唯一的文档标识符。然后,您可以创建idstag_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文档中的群集标签。

答案 1 :(得分:1)

执行此操作的有效方法是使用聚合框架来创建&#34; _id&#34;和&#34;标签数据&#34;使用服务器端操作。这也减少了通过线路发送的数据量以及用于解码客户端文档的时间和内存。

您需要$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)