数字でマークされたユーザーの関心のリストがあります。
すべてのユーザーは、いくつかの興味を持っています。単純な MongoDB クエリで、同様の、または近い関心を持つ他のユーザーを見つけることができるように、ユーザーの関心を表す数値をどのように作成すればよいでしょうか。
数字でマークされたユーザーの関心のリストがあります。
すべてのユーザーは、いくつかの興味を持っています。単純な MongoDB クエリで、同様の、または近い関心を持つ他のユーザーを見つけることができるように、ユーザーの関心を表す数値をどのように作成すればよいでしょうか。
n個の異なる関心がある場合、各ユーザーはブール値の長さnのベクトルとして表すことができます。ここで、ユーザーが関心iをリストしている場合、 i番目の要素はtrueです。このような2つのベクトルは、余弦類似度、ジャッカード類似度、L1距離、L2距離などと比較できます。
MongoDBで直接行う方法はわかりませんが、「biginteger」データ型を使用している場合は、関心をビットフィールドに減らします。その後、興味を削除することはできません (全員のビットフィールドを再計算せずに) が、興味を追加することはできます。次に、人物 A と B の興味を比較するには、C/C++ のような構文で操作を行います。
common=bitCount(A&B)
AとBが共通の利益をいくつ持っているかonlyA=bitCount(A^(A&B))
A が持っていて、B が持っていない興味の数onlyB=bitCount(B^(A&B))
B が持っていて、A が持っていない利益の数different=bitCount(A^B)
A と B が合計でいくつの異なる興味を持っているか (onlyA+onlyB と同じ)total=bitCount(A|B)
A と B が合計でいくつの異なる興味を持っているか (共通 + 異なると同じ)これらの数値から、関心がどの程度一致しているかを評価できます。正確な式は、同じ関心と異なる関心をどのように強調したいか、どの程度のスケールを希望するかに応じて異なります。
少なくとも Java の BigInteger クラスには、すぐに使用できるビット カウント メソッドがあります。それ以外の場合は、&1 および >>1 操作を使用してブルート フォース ループで実行できます。MongoDB がそのような構造をサポートしているか、big int データのビット カウント用の演算子/関数を持っているか、または MongoDB が big int データ型を持っているかどうかはわかりません...
私はおそらく次の方法でこれを行うことができます