web-dev-qa-db-ja.com

一致するプロファイルを見つける方法は?

私は各ユーザーが持っている出会い系アプリのバックエンドを開発しています

  1. 彼/彼女の特徴のプロフィール

  2. 理想的なマッチの特性のプロファイル

性別、身長、外見など、数十の特性があります。一部の特性は文字列であり、他の特性は数値または配列です。各特性には、0〜4の範囲の重要度が割り当てられています。0はnot important at allを意味し、4はabsolutely necessaryを意味します。

したがって、ユーザーの一致オブジェクトは次のようになります。

    {      
      {
         gender: 'female',
         importance: 4
      }
      {
        eyeColor: ['blue', 'green'],
        importance: 2   
      } ,
      {
       ethnicity: [],
       importance: 0
      }
      heightMin: 150,
      heightMax: 200, 
      heightImportance: 3,
      ....    
    }

データはmongodbに保存され、バックエンドはnode.jsにあります。

私はデータサイエンスが初めてです。私は、ユークリッドまたはコサインの類似性のような、ベクトル間の類似性/距離を見つけるためのいくつかの式があることを知っています。しかし、どのような方法(もしあれば)がこの状況で最も適切かはわかりませんか?

ヒントに感謝します。

1
Babr

さまざまな種類の特性を特定する

サンプルデータは、さまざまな種類の特性をさまざまな方法で処理する必要があることを非常によく示しています。

  • Heighはスカラー属性です。プロファイルには1つの数値がありますが、理想は常に範囲を探します。
  • 人種はnique属性です。プロファイルには1つしかありませんが、理想はいくつかの選択肢を識別することができます。
  • 目はmultiple-value属性である可能性があります。ほとんどの人はプロファイルに1つの色しかありませんが、何人かは複数の色を持っています。そして理想は、それらの1つを見つけることを目的として、いくつかの色を識別することができます。たとえば、理想が「緑、青」である場合、「緑OR青」と理解する必要があります。両方を持つプロファイルは一致する必要がありますが、青のみを持つプロファイルも一致する必要があります。
  • 趣味(例ではありません)はオプション属性です。プロファイルには複数のプロファイルがあり、理想には複数のプロファイルがあります。一致する趣味が多ければ多いほど、親和性は高くなります。

スコアリング関数を定義する

すべての特性がこのように適切に分類されると、次のような一般的なスコアリング関数を作成する準備が整います。

  • 特性の各ペアのスコア:これは、1(一致)と0(一致なし)のように単純にすることができます。 1.0(すべてのオプションが存在する)0.8(5つのオプションのうち4つが存在する)... 0(一致なし)で、一致が多かれ少なかれ強力であることを示すのは、より微妙な場合があります。また、しきい値、上限などを使用したより複雑な計算になる場合もあります。
  • プロファイルのグローバルスコアを集計:ここでは、意味のある集計を見つけるために実験する必要があります。たとえば、2つの一致する重要な特性1は、重要な一致2のバランスをとるべきでしょうか?別の例:重要度3の一致がなくてもスコアが下がらないか?
  • 許容できない結果を排除する:重要度4は絶対に必要であるため、その基準に一致しない場合、他の基準の結果が何であれ、グローバルスコアは0になります。

性能を上げる

次に、スコアを次のように補完する必要があります。

  • a 事前選択ロジック。これは、少なくともいくつかの理想的な基準を使用して関連レコードのサブセットを選択します。これにより、データベースのすべてのプロファイルの一致スコアの計算が回避されます
  • a filter特に一致が多い場合、低すぎるスコアを排除します。
  • final sorting最も成功したプロファイルを最初に表示します。

今後の改善

次のことができますが、後の段階で:

  • スコアは一方向のみにする必要がありますか?ちょっと考えてみてください。素敵な若い女性は、ひどいおじいさんにプロフィールをマッチングさせ、一連の興味をそそらない勧誘の後、彼女はサイトを離れます。どうにかしてscore(ideal 1, profile2)score(ideal 2, profile1)と組み合わせるとどうなるでしょうか
  • 文字列値は非常に効果的に比較されません。したがって、より速く処理できる別のエンコーディングスキーマの最後に考えるかもしれません(いくつかのベクトルについて話しました)。しかし、これはケーキの桜です。簡単に始めましょう。
3
Christophe

あいにく、ファジーマッチングを実行するには、タイプを知るだけでは不十分です。たとえば、さまざまな身長の人物を選択したい場合、身長5'10 "の検索と重要度4と重要度1の違いは何ですか?身長などの数式を適用しようとしても、プラスまたはマイナス(5-重要度)x 2インチ。

しかし、この色をアイカラーまたはヘアカラーにどのように適用しますか?もちろんできません。各属性には、その属性に適合する独自のマッチングシステムが必要です。

ただし、いくつかのヒントはありますが、理想的にはmuchとしてできるだけ除外し、soonとしてできるだけ除外します。そのため、重要度の高い順にフィルターを優先すると、あまりフィルター処理しない可能性のある属性に到達する前に、かなり多くの人をフィルター処理する可能性が高くなります。しかし、これは必ずしも本当であるとは限りません!たとえば、女性が最も重要な男性を探していて、(天国は禁じられている)mostデータベース内の人が男性である場合、重要性が高いにもかかわらず多くの人を除外していません。

したがって、正しく実行すると検索時間が大幅に短縮されるため、これを考慮する必要があります。したがって、最も効率的な検索を整理できるため、すべてのクライアントの統計情報を保持しておくことはほぼ間違いなく価値があります。

0
Neil