私は現在、Java Web アプリケーションで MongoDB の集約フレームワークを使用して、他のユーザーの好みに基づいてユーザー向けの推奨事項を生成しています。
私が使用している主な方法論の 1 つは、配列の交差を調べることです。
現在、私のアルゴリズムは、配列の交差がゼロでない場合、2 人のユーザーを単に「類似」と見なします。
より正確なアルゴリズムを構築するために、集合の交差のサイズを重み付けして集計パイプラインに組み込みたいと考えています。
これを行う方法はありますか?
私は現在、Java Web アプリケーションで MongoDB の集約フレームワークを使用して、他のユーザーの好みに基づいてユーザー向けの推奨事項を生成しています。
私が使用している主な方法論の 1 つは、配列の交差を調べることです。
現在、私のアルゴリズムは、配列の交差がゼロでない場合、2 人のユーザーを単に「類似」と見なします。
より正確なアルゴリズムを構築するために、集合の交差のサイズを重み付けして集計パイプラインに組み込みたいと考えています。
これを行う方法はありますか?
あなたの質問を理解できれば、次のようなデータがあります。
db.users.insert({_id: 100, likes: [
'pina coladas',
'long walks on the beach',
'getting caught in the rain'
]})
db.users.insert({_id: 101, likes: [
'cheese',
'bowling',
'pina coladas'
]})
db.users.insert({_id: 102, likes: [
'pina coladas',
'long walks on the beach'
]})
db.users.insert({_id: 103, likes: [
'getting caught in the rain',
'bowling'
]})
db.users.insert({_id: 104, likes: [
'pina coladas',
'long walks on the beach',
'getting caught in the rain'
]})
特定のユーザーについて、他のユーザーとの一致機能 (この例では「いいね!」) の数を計算したいですか? 次の集計パイプラインはこれを実現します。
user = 100
user_likes = db.users.findOne({_id: user}).likes
return_only = 2 // number of matches to return
db.users.aggregate([
{$unwind: '$likes'},
{$match: {
$and: [
{_id: {$ne: user}},
{likes: {$in: user_likes}}
]
}},
{$group: {_id: '$_id', common: {$sum: 1}}},
{$sort: {common: -1}},
{$limit: return_only}
])
上記の例の入力データを指定すると、上位 2 つの一致を示す次の結果が出力されます。
{
"result" : [
{
"_id" : 104,
"common" : 3
},
{
"_id" : 102,
"common" : 2
}
],
"ok" : 1
}
非常に多数のユーザーが存在する可能性があるため、非常に多くの一致が必要になると想定したことに注意してください。これは、$sort ステップとそれに続く $limit ステップによって実現されます。そうでない場合は、パイプラインの最後の 2 つのステップを省略できます。
これが役立つことを願っています!他にご不明な点がございましたら、お問い合わせください。
ブルース
MongoDB 2.6 以降では、$size式を使用できます。
2 つの配列 (セット) の交差を行う場合、最初に$setIntersection演算子を使用して 2 つのセットの交差を見つけます。別の例がこの質問に示されています。
その後、新しい$size演算子を使用して、パイプラインの交差ステージの出力のサイズを取得できます。 この回答は、新しい $size 式の使用例を示しています。