Ich habe einen Datensatz mit folgender Struktur:
full_name,nickname,match
Christian Douglas,Chris,1,
Jhon Stevens,Charlie,0,
David Jr Simpson,Junior,1
Anastasia Williams,Stacie,1
Lara Williams,Ana,0
John Williams,Willy,1
Dabei ist jede Prädiktorzeile ein Paar, vollständiger Name, Spitzname und Zielvariable, Übereinstimmung. Dies ist 1, wenn der Spitzname der Person mit diesem Namen entspricht, andernfalls 0. Wie Sie sehen können, folgt die Art und Weise, wie der Spitzname aus dem vollständigen Namen erhalten wird, keinem bestimmten Muster.
Ich möchte einen ML-Algorithmus trainieren, der unter Berücksichtigung des vollständigen Namens und des Spitznamens des Paares die Wahrscheinlichkeit einer Übereinstimmung vorhersagt.
Meine Grundlinie ist nur der Versuch, die Anzahl der übereinstimmenden Caracher und solche Funktionen zu ermitteln. Ich denke jedoch über einen NLP-Ansatz nach, der Deep Learning verwendet. Meine Frage ist, ob es neuronale Netzwerkarchitekturen gibt, die für dieses Problem spezifisch sind.
quelle
Antworten:
Ich hatte in meinem letzten Job ein ähnliches Problem. Meine Lösung bestand darin, Features über (Transformation (en) + Vergleich) * viele Combos zu erstellen und Modelle zu füttern, dann zu aggregieren und zu modellieren, dh ein 2-Layer-Modell. Der Schlüssel ist die Codierung und Ähnlichkeitsbewertung als Merkmale.
Transformationen: Vokale entfernen (ideal für bestimmte Wurzeln), Endvokale entfernen, Doppelzeichen entfernen, in phonetische Zeichenfolgen (IPA, soundex, https://pypi.org/project/Fuzzy/ ) konvertieren , Zeichen ersetzen, die entweder ähnlich klingen oder haben verschiedene Klänge in anderen Sprachen (J in Osteuropa klingt wie Y in uns, C kann klingen wie K,D T,T∼TH , etc), ... Die Strategie besteht darin, mit vielen Verrücktheiten / Unregelmäßigkeiten in den Namen der Menschen umzugehen.
Vergleiche (Ähnlichkeit und Unterschied): Versuchen Sie [Zeichenstufe, Block / Wurzel / [Pre / Suf] Fixstufe, Wortebene (trifft möglicherweise nicht auf Sie zu)] Ähnlichkeits- und Differenzwerte. Probieren Sie den Würfelkoeffizienten, Levenshtein, Needleman-Wunsch, Längste gemeinsame (nicht) zusammenhängende Teilzeichenfolge, Ähnlichkeit des Zeichenhistogramms, # übereinstimmende Zeichen, nicht übereinstimmend (jeweils links und rechts) usw. Sie können versuchen, ein RNN / LSTM zu verwenden, und es Ähnlichkeit lernen lassen für jede Transformation. Verwenden Sie die Ausgabe der trainierten Modelle als weitere Funktion.
Experimentieren Sie mit verschiedenen Kombinationen der oben genannten und wählen Sie einige aus, die Wert zu haben scheinen. Sie könnten einfach alle Ergebnisse nehmen und mit der logistischen Regression (oder dem neuronalen Netz) übereinstimmen, oder Sie könnten statistische Modelle erstellen und den prozentualen Rang basierend auf einem kleinen Trainingssatz ausgeben, um ihn zu normalisieren. Eine andere Möglichkeit, die Rohwerte vorzuverarbeiten, ist die Verwendung der Kalibrierungscodierung über die Logistikfunktion. Fügen Sie dann zusammenfassende Statistiken aus den normalisierten Ergebnissen als zusätzliche Funktionen hinzu. Schieben Sie all dies in das endgültige Modell.
Werden Sie mit Namen umgehen, die von arabischen, spanischen, französischen usw. Namen abgeleitet sind? Dies ist nur ein Extra, aber Sie sollten die Namensstatistikdaten für soziale Sicherheit und US-Volkszählung herunterladen, um Ihr Projekt um weitere Namensvarianten zu erweitern. Ich überlasse Ihnen das Wie, aber es hilft, die wahrscheinlichen Möglichkeiten zu kennen. Beachten Sie, dass die einfache Verwendung von Levenshtein bei William-> Bill, Dianne-> Di, Larry-> Lawrence, Mohammed-> Muhamed und Hamed, Danielle-> Daniela, Thomas-> Tom und Jimmy-> James nicht so gut funktioniert . Die Strategie, die ich erwähnt habe, sollte Ihnen bei allen Variationen helfen.
Zusätzliche Ressourcen zum Erkunden: https://github.com/jamesturk/jellyfish https://nameberry.com/list/276/If-You-Like-Danielle-You-Might-Love https://pypi.org/project /Phonetik/
quelle
Ich konnte keine nützliche Literatur finden, um Deep Learning für dieses spezielle Problem zu nutzen. Die meisten Methoden scheinen auf nicht-maschinellen Lernmethoden wie String-Ähnlichkeiten und Levenstein-Entfernungen zu beruhen. Ein vernünftiger, auf tiefem Lernen basierender Ansatz für dieses Problem wäre ein wiederkehrendes neuronales Netzwerk . Ideal wäre ein LSTM (Long Short Term Memory) oder GRU (Gated Recurrent Unit). Die Idee ist, eine RNN zu haben, die einen internen Zustand hat und die Reihenfolge berücksichtigt, in der die Eingänge gespeist werden.
Im Gegensatz zur Textklassifizierung, Stimmungsanalyse oder Sequenzgenerierung würde die bevorzugte Codierung für den Text hier auf Zeichenebene statt auf Wortebene liegen .
Zum Beispiel
würde werden
Die beiden abgleichenden Zeichenfolgen werden zu einer einzigen Sequenz verkettet. Die Intuition hier ist, dass das RNN die Sequenz zeichenweise verarbeitet und lernt (Aktualisierungsgewichte lesen), dass die Zeichen am Ende ein ähnliches Muster haben wie zuvor in derselben Sequenz, um daraus zu schließen, dass es eine 1 statt einer sein sollte 0.
Der Vektor von [1/0] ist die Zielvariable.
Die Standard-RNN-Vorverarbeitungsschritte gelten wie gewohnt - wir füllen die Sequenzen am Anfang so auf, dass sie alle die gleiche Länge haben (z. B. 50), die Zeichen werden anstelle von Zeichenfolgen usw. als numerisch codiert.
Da das Wörterbuch hier ziemlich klein ist (26 Alphabete + Leerzeichen + Pad), kann die Netzwerkarchitektur ziemlich einfach sein. Eine einzelne Einbettungsschicht + wiederkehrende Schicht sollte ausreichen.
Wenn Sie das Problem auf diese Weise festlegen, können Sie eine Vanille-RNN oder eine sofort einsatzbereite LSTM / GRU verwenden, anstatt eine benutzerdefinierte Architektur zu erstellen, die zwei separate Zeichenfolgen als Eingabe für jeden Datenpunkt verwendet und eine Zahl ausgibt.
Sie könnten diesen Ansatz ausprobieren und sehen, ob er in der Lage ist, Basismodelle zufriedenstellend zu schlagen.
Eine gute Lektüre für RNNs auf Zeichenebene ist Andrej Karpathys Blog und Code . Das Problem, das er zu lösen versucht, ist anders und der Code ist in reiner Zahl, aber er fängt die Idee immer noch ziemlich gut ein.
quelle
Ich würde eine Normalisierung als Vorverarbeitung verwenden, wie zum Beispiel:
Jr
umgewandelt inJunior
.Verwenden Sie hierfür anstelle von ML String-Algorithmen wie den Z-Algorithmus, den KMP-Algorithmus oder den Levenshtein-Abstand und verwenden Sie dann den Schwellenwert für die Punktzahl.
quelle