Come trovare i profili di corrispondenza?

1

Sto sviluppando il backend per un'app di appuntamenti, in cui ogni utente ha

  1. un profilo delle sue caratteristiche

  2. un profilo delle caratteristiche ideali della partita

Ci sono dozzine di caratteristiche come sesso, altezza, aspetto e così via. Alcune caratteristiche sono stringhe, altre sono numeri o matrici. Ad ogni caratteristica è stato attribuito un fattore di importanza, compreso tra 0 e 4. 0 significa not important at all e 4 significa absolutely necessary .

quindi gli oggetti match di un utente sono come questi:

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

I dati vengono salvati in mongodb e il backend è in node.js.

Sono nuovo nella scienza dei dati. So solo che ci sono alcune formule per trovare somiglianze / distanze tra i vettori, come le similarità euclidee o coseno. Ma non sono sicuro quale metodo (se esiste) sia il più rilevante in queste circostanze?

Apprezzo i tuoi suggerimenti.

    
posta Babr 05.10.2018 - 12:14
fonte

2 risposte

2

Identifica il diverso tipo di caratteristiche

I tuoi dati di esempio mostrano molto bene che il diverso tipo di caratteristiche deve essere gestito in un modo diverso:

  • Heigh è un attributo scalare : un profilo ha un valore numerico, ma l'ideale cerca sempre un intervallo.
  • L'etnicità è un attributo univoco : un profilo ne ha solo uno, ma l'ideale può identificare diverse alternative.
  • Gli occhi potrebbero essere attributo valore multiplo : sebbene molti di noi abbiano un solo colore nel suo profilo, alcune persone ne hanno diversi. E l'ideale può identificare diversi colori con l'intento di trovarne uno. Ad esempio se l'ideale è "verde, blu" dovrebbe essere inteso come "verde o blu". Un profilo che abbia entrambi deve corrispondere. Ma un profilo che ha solo blu dovrebbe uguagliare.
  • Gli hobby (non nel tuo esempio) potrebbero essere l'attributo opzione : un profilo potrebbe avere diversi e l'ideale ne avrebbe diversi. Allora, più hobby corrispondono, più alta è l'affinità.

Definisci una funzione di punteggio

Una volta che tutte le caratteristiche sono state categorizzate correttamente in questo modo, sei pronto per creare una funzione di punteggio generale che:

  • Classifica ogni coppia di caratteristiche : può essere semplice come 1 (corrispondenza) e 0 (nessuna corrispondenza). Può essere più sottile mostrare che una partita è più o meno strong, con 1.0 (tutte le opzioni ci sono) 0.8 (4 su 5 opzioni ci sono) ... 0 (nessuna corrispondenza). Potrebbe anche essere un calcolo più elaborato con soglie, soffitti, ecc.
  • Aggrega il punteggio globale di un profilo : qui, devi sperimentare per trovare un'aggregazione significativa. Ad esempio, dovrebbero 2 caratteristiche di corrispondenza di importanza 1 sbilanciare una corrispondenza di importanza 2? Un altro esempio: se l'assenza di una corrispondenza di corrispondenza di importanza 3 non riduce il punteggio?
  • Elimina risultati non accettabili : l'importanza 4 è assolutamente necessaria, quindi una mancata corrispondenza su tale criterio deve portare a un punteggio globale pari a 0, qualunque sia il risultato su altri criteri.

Migliora le prestazioni

Devi quindi completare il tuo punteggio con:

  • una logica di preselezione , che utilizza almeno alcuni criteri ideali per selezionare un sottoinsieme di record rilevanti: questo evita di calcolare il punteggio corrispondente per tutti i profili del tuo database
  • un filtro per eliminare punteggi troppo bassi, soprattutto se ci sono molte corrispondenze.
  • final ordinamento per presentare per primi i profili di maggior successo.

Miglioramenti futuri

Potresti fare una delle cose seguenti, ma in una fase successiva:

  • Il punteggio dovrebbe essere solo unidirezionale? Pensa un attimo: la simpatica signorina otterrà il suo profilo abbinato a un sacco di vecchi e dopo una serie di solleciti solleciti, lascerà il sito. Che cosa succede se dovessi combinare in qualche modo score(ideal 1, profile2) con score(ideal 2, profile1)
  • I valori stringa verranno confrontati in modo molto inefficace. Quindi potresti pensare alla fine di uno schema di codifica diverso che potrebbe essere elaborato più velocemente (hai parlato di alcuni vettori). Ma questa è la ciliegina sulla torta. Inizia semplice.
risposta data 05.10.2018 - 15:03
fonte
0

Sfortunatamente non è sufficiente sapere il tipo per eseguire la corrispondenza fuzzy. Ad esempio, se si desidera selezionare persone con altezze diverse, qual è la differenza tra una ricerca con altezza 5'10 "e importanza 4 rispetto a un'importanza 1? Anche se si tenta di applicare alcune formule come l'altezza può essere nell'intervallo di più o meno (5 - importanza) x 2 pollici.

Ma come si applica questa formula per il colore degli occhi o dei capelli? Non puoi, naturalmente. Ogni attributo deve avere il proprio sistema di matching che si adatti a quell'attributo.

Alcuni suggerimenti: idealmente, vuoi filtrarlo molto il più possibile e presto il più possibile. Pertanto, se dovessi dire, preferisci i filtri in ordine di importanza, molto probabilmente filtreresti un buon numero di persone prima che tu abbia raggiunto attributi che probabilmente non filtreranno molto. Tuttavia, questo potrebbe anche non essere necessariamente vero! Ad esempio, se una femmina è alla ricerca di un maschio con la massima importanza e (ci mancherà), la maggior parte le persone nel tuo database sono di sesso maschile, non stai filtrando molte persone, nonostante sia di grande importanza .

Quindi dovresti tenerne conto, poiché ridurrebbe enormemente i tempi di ricerca se fatto correttamente. Pertanto, quasi sicuramente vale la pena conservare le informazioni statistiche su tutti i tuoi clienti, poiché ti consentirà di organizzare le ricerche più efficienti.

    
risposta data 05.10.2018 - 12:47
fonte

Leggi altre domande sui tag