Seite 1 von 1

Personen mit ähnlichen Attrubuten finden

Verfasst: Dienstag 4. Februar 2020, 17:45
von anjacom
Ich habe jetzt zwei Tage lang nach diversen Begriffen wie "Information Retrievement", "Match making" usw. gesucht und recht viel gelesen. Unter anderem über Hochzeiten und Zimmerpartner und einiges mehr. Was ich leider so noch nicht gefunden habe, sind Möglichkeiten um User zu finden, die ähnliche Attribute haben wie ich bzw. andere User.

Man stelle sich für dieses Forum folgende Attribute für einen useraccount vor.

Arbeite gerne nachts.
Habe viel Zeit für neue Projekte
Arbeite gerne im Team
Habe große Erfahrung mit Teamarbeit
Esse gerne Pizza


Die fünf Punkte oben haben als Antwort 0 oder 1 wie nein oder ja; in einem erweiterten Modell 0,1,2 mit nein, ja, vielleicht.

Jetzt möchte ich für alle User, jeden Morgen eine Liste mit Usernamen versenden, die möglichst viele Übereinstimmungen haben.

Ich könnte das zum Beispiel mit einer Kennzahl und fünf Bit lösen:

1 Nachts
2 Zeit
4 Teamarbeit
8 Erfahrung
16 Pizza

sind 0 oder 1. Somit bekommt jeder User eine Zahl aus den gesetzten Bits. Da bei mir alles passt, bekomme ich die 31.


Um alle User aus der SQL zu fischen, die mindestens vier gleiche Bits haben =>

Kennzahl = meine Kennzahl oder
31-1 = 30
31-2 = 29
31-4 = 27
31-8 = 23
31-16 = 15

also sowas wie select * from user where Kennzahl IN (21,30,29,27,23,15)

Damit könnte ich jeden Morgen per RAND() oder nach "neu im Forum" oder "besonders oft eingeloggt" usw. einen Mailversand anstoßen und z.B. vier Vorschläge senden.


Wenn ich jetzt stattdessen den tollsten Eheanbahnungsservice der Welt programmieren will und dazu 64 ja/nein oder womöglich ja/nein/vielleicht-Fragen habe, wird es schon schwerer?

Würde ich dann z.B. jeweils 8 Bit zusammenfassen und ein Feld pro 8 Bit anlegen?
Hier hätte ich dann mindestens 56 von 65 Übereinstimmungen.

select * from user where Kennzahl1 IN (N1 bis N9) AND Kennzahl2 IN (N10 bis N19) ...

oder macht man das ganz, ganz anders?

Und wenn man es so macht. Was mag sql lieber:

select * from table where einFeld IN (viele, viele, viele Möglichkeiten ) oder

select * from table where Feld1 IN (9 Möglichkeiten) UND Feld2 IN usw.



Vielen, vielen Dank. Hinweise auf Suchbegriffe wären natürlich auch toll.

Re: Personen mit ähnlichen Attrubuten finden

Verfasst: Dienstag 4. Februar 2020, 17:54
von __deets__
Mein Ansatz waere, die Eigenschaften als einen Feature-Vektor aufzufassen (kann binaer wie bei dir sein, aber auch reellwertig, weil du Pizza zB nur ein bisschen magst) - und damit stellt jede Person einen Punkt im n-Dimensionalen Raum deiner Features dar. Und wenn du ein match nach aehnlichen Leuten suchst, dann sortierst du die einfach nach dem euklidischen Abstand mit deren Vektoren. Je naeher, desto mehr Uebereinstimmung.

Re: Personen mit ähnlichen Attrubuten finden

Verfasst: Dienstag 4. Februar 2020, 23:10
von anjagruen
Vielen Dank. Muss ich da Matrizen speichern und dann damit rechnen?

Ich möchte das Ergebnis der query schon als Zielmenge haben.

Alle Mädels aus Dortmund = select from table where stadt = dortmund.

Bei zweien:
Alter von 0 bis 99; Schuhgröße von 35 bis 45.

select from where feld1 IN (), Feld2 IN ()

Das würde helfen bei einer typischen Suchmaske.


Ich muss aber wissen, welche Zeile eine ähnliche Verteilung an Werten hat und das schon mit der Query erledigen. Es geht genau nicht um eine Suchmaske, sondern um eine tägliche Mail mit Hinweisen, wer möglichst viele Übereinstimmungen zum jeweiligen User hat.

Auf gar keinen Fall möchte ich 10.000 User ständig gegeneinander abgleichen müssen und dann Listen führen.

Darum die Idee mit den Bitwerten. Verteilungen bekommen Werte und zu jedem Wert gibt es eine halbwegs kleine Zahl an Werten, die eine ähnliche Verteilung haben. Ich wiederhole mich: Ich will die Query anhand geeigneter Maßnahmen so haben, dass das fertige Ergebnis da ist.
Ich möchte nicht 10.000 Datensätze mit x Datensätzen vergleichen müssen bis ich n Treffer habe, die ich dann in einer Liste pro User speichere.

Wie geht das besser, anders, überhaupt als mit meiner Idee?

Re: Personen mit ähnlichen Attrubuten finden

Verfasst: Dienstag 4. Februar 2020, 23:57
von anjagruen
Soweit ich das jetzt gelesen und verstanden habe, brauche ich hierzu immer einen Vergleich und gegebenenfalls eine Zwischenspeicherung. Ein Ergebnis aus der Matrizenrechnung mit 18 ist nie eindeutig, die beiden Punkte können überall sein bzw. ist der Wert ohne einen Punkt nichts wert.

Wie gesagt ich möchte gerne ohne zusätzliche Listen auskommen.

Mein Ansatz mit Bits ist eindeutig.
Mit 8 Bits hätte ich eine Abfrage nach Zeilen bei denen x IN (8+1) Werte steckt. Das kombiniere ich mit Datum oder RAND oder "war online".
Habe ich allerdings deutlich mehr Attribute wird es irgendwann doof.

Bei einer hohen Zahl müsste man dann über Koordinaten gehen und die notwendigen Vergleiche schon vorm Start weg direkt einschränken, das Ergebnis dann z.B. als Paar plus Abstand speichere. Select from, where feld1=id and Abstand < 10.

Könnte man das nicht vergröbern indem man Räume schafft und nur die Existenz im nummerierten Raum bestätigt?
Wenn ich einen Raum in Quader teile und diese durchnummeriere, dann jeden User in einem Quader stecke. (z.B. weil der Abstand zum Mittelpunkt des Quaders 1 < x ist.
Dann könnte ich so wieder eine einfache Zahl mit Eindeutigkeit haben.),
aber wie kriegt man den User in einen Teilraum ohne durchprobieren? Indem man vorab größer Quader schafft?

Punkt1 --- Punkt 2; liegt Punkt 3 näher an 1 oder 2?
Dann wieder mit zwei neuen Punkten im Raum 1 usw.

Das wäre schon mal besser wie alle Räume einzeln durchgehen.

Alternativ könnte man "Lieblingsräume bestimmen"; weil 80 Prozent im Raum x sind usw.


Das ist spannend. Sorry, wenn ich als Laie "laut denke" und großzügig keine Ahnung von allem habe. Im Mathe-LK ging es bestenfalls mal um eine Kugel, die irgendwo schief runterrollt. So spannende Sachen wie Daten vergleichbar machen, hatten wir damals nicht.

Re: Personen mit ähnlichen Attrubuten finden

Verfasst: Mittwoch 5. Februar 2020, 00:01
von __deets__
Mit Matrizen hat das nichts zu tun. Euklidischer Abstand ist ja einfach nur die Summe der Quadrate der Differenz zweier Vektoren. Eigentlich muss man noch die Wurzel ziehen, aber weil das die Ordnung nicht ändert kann man sich das auch sparen.

10000 Datensätze - wenn das deine echte Zahl ist - sind trivial, und die würde ich einfach komplett in den Speicher laden. Und dann tatsächlich erstmal ausrechnen.

Wenn es binäre Werte sind, ist asl Distanzfunktion auch die hamming-Distanz geeignet. Und dafür zb gibt es auch Erweiterungen für zb Postgres: https://dba.stackexchange.com/questions ... n-postgres

Re: Personen mit ähnlichen Attrubuten finden

Verfasst: Mittwoch 5. Februar 2020, 00:07
von __deets__
Deine Idee mit den räumen ist an sich gut, sowas nennt sich zb quad- oder octrees für 2 bzw 3 Dimensionen.

Ob das aber für dein Problem geeignet ist kann ich so adhoc schwer beurteilen.

Die such nach feature similarity fördert zb auch sowas zutage: https://www.researchgate.net/post/What_ ... nal_spaces

Da gibt es dann wohl die cosinus-Ähnlichkeit, weil euklidische/Manhattan (was in etwa hamming ist) dann problematisch werden. Aber vielleicht gibt das ja Anstoß zur weiteren Recherche.

Re: Personen mit ähnlichen Attrubuten finden

Verfasst: Mittwoch 5. Februar 2020, 00:14
von anjagruen
Wieder ein Stichwort. Danke.

Mir gefällt gerade die Idee mit der Unterteilung, der Frage also ob ein Punkt innerhalb eines Teilraumes x ist.
Ich würde dann keinen einzigen User miteinander vergleichen, sondern nur schauen, ob er in einem meiner definierten Räume ist.

Am besten lasse ich mir mal ein paar Werte ausrechnen, denn ich habe aktuell noch keine Ahnung wieviele Räume ich in mein Modell stecken muss damit ich sinnvolle Werte/Abstände/Anzahl gleicher Attribute habe.

Dazu kommt dann noch, dass die Verteilung nicht homogen sein wird. Man müsste dann für Räume wo wenig los ist, größere Räume schaffen.
Dann vielleicht überlappend definieren.

Anja ist in 2 und 4 (4 beinhaltet 2 komplett);
weil 2 eine öde Gegend ist, schauen wir besser nach Raum4 (=deutlich größer) für Anja um Partner zu finden.

Re: Personen mit ähnlichen Attrubuten finden

Verfasst: Mittwoch 5. Februar 2020, 00:19
von anjagruen
Deine Idee mit den räumen ist an sich gut, sowas nennt sich zb quad- oder octrees für 2 bzw 3 Dimensionen.
Kann man das nicht für n erweitern? Muss ja, denn ich kann n Koodinaten haben und Abstände berechnen, also alles drumherum.
Wobei das ja zumindest bei 3 Kugeln wären, die sich entweder überlappen oder undefinierten Raum hinterlassen. Dann wird es bei > 3 nicht besser werden, ahne ich mal. Scheibenkleister. Somit gäbe es dann tote Werte.