我使用MongoDB作为我的数据存储,并希望在单独的一个集合中存储我的文档的“聚类”配置。
所以在一个集合中,我会有我的原始对象集合,而在第二个集合中,它会有
kMeansCollection: { 1: [mongoObjectCopy1], [mongoObjectCopy2]... 2: [mongoObjectCopy3], [mongoObjectCopy4]... }
我正在这里遵循一个用于文本聚类的K-means实现,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) #算法在这里运行,分为5个聚类 pprint(dict(clusters))
变量“tags”是算法运行所需的输入。它必须是数组形式,但目前tags返回的是对象数组(因此我必须从查询中提取文本值)
然而,在神奇地将我的集合分为5类之后,我如何将它们与MongoDB中各自的对象条目重新关联呢?
我只从对象的一个属性中提取特定的文本内容。
非常感谢!
回答:
你需要为文档设置一些标识符。最好在查询中包含_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)
并将结果与ids
一起使用zip
函数重新组合。
doc_clusters = zip(ids, clusters)
从这里开始,你已经构建了(_id, cluster)
的元组,因此你可以更新MongoDB文档上的聚类标签。