2016-05-29 11 views
3

私はMongoDBをデータストアとして使用しており、自分のドキュメントの「クラスタ化された」構成を別のコレクションに保存したいと考えています。MongoDB + Kはクラスタリングを意味します

だから1つのコレクションに、私は、オブジェクトの私の元のセットを持っているだろう、と私の第二に、それは私がここにテキストクラスタリングの実装にK-手段を以下のよ

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

を持っていると思います、 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「のタグが」アルゴは、実行するために必要な入力です。 配列の形でなければなりませんが、現在のタグはオブジェクトの配列を返します(クエリからテキスト値を抽出する必要があります)

しかし、私のコレクションを5つの方法で魔法のようにクラスタリングした後、 mongoからのそれぞれのオブジェクトのエントリと?

私は、オブジェクトの1つのプロパティから特定のテキストコンテンツを供給しています。

ありがとうございます!

答えて

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

これを行う効率的な方法は、集約フレームワークを使用して、サーバーサイド操作を使用して「_id」と「タグデータ」のリストを作成することです。これにより、ワイヤを介して送信されるデータ量と、クライアント側のドキュメントをデコードするために使用される時間とメモリも削減されます。

文書を$groupにし、$pushアキュムレータ演算子を使用して_idtag-dataのリストを返す必要があります。もちろん、aggregate()メソッドは集約パイプラインにアクセスします。

cursor = collection.aggregate([{ 
    '$group': { 
     '_id': None, 
     'ids': {'$push': '$_id'}, 
     'tags': {'$push': '$tag-data'} 
    } 
}]) 

あなたはその後、私たちはグループNoneによってので、私たちのカーソルが一つの要素を保持するためCommandCursor.next()方法を使用して、あなたのデータを取得します。

data = cursor.next() 

その後、単にあなたの関数を呼び出すとzip結果。

clusters = cluster_text(data['tags']) 
doc_clusters = zip(data['ids'], clusters) 
関連する問題