machine-learning superscript - Python-Wie man Wort von abgekürztem Text mit NLP anzieht?




subscript matplotlib (5)

Ich habe kürzlich an einem Datensatz gearbeitet, der Abkürzungen für verschiedene Wörter verwendet. Beispielsweise,

wtrbtl = water bottle
bwlingbl = bowling ball
bsktball = basketball

Es schien keine Übereinstimmung in Bezug auf die verwendete Konvention zu geben, dh manchmal verwendeten sie Vokale manchmal nicht. Ich versuche, ein Mapping-Objekt wie das obige für Abkürzungen und ihre entsprechenden Wörter ohne einen vollständigen Korpus oder eine umfassende Liste von Begriffen zu erstellen (dh Abkürzungen könnten eingeführt werden, die nicht explizit bekannt sind). Der Einfachheit halber ist es beschränkt auf Dinge, die man in einem Fitnessstudio finden könnte, aber es könnte alles sein.

Wenn Sie nur auf die linke Seite der Beispiele schauen, welche Art von Modell könnte die gleiche Verarbeitung wie unser Gehirn in Bezug auf jede Abkürzung auf das entsprechende Volltext-Label beziehen.

Meine Ideen haben aufgehört, den ersten und letzten Brief zu nehmen und diese in einem Wörterbuch zu finden. Weisen Sie a priori Wahrscheinlichkeiten basierend auf dem Kontext zu. Aber da es eine große Anzahl von Morphemen ohne einen Marker gibt, der das Ende des Wortes anzeigt, sehe ich nicht, wie es möglich ist, sie zu spalten.

AKTUALISIERT:

Ich hatte auch die Idee, ein paar String-Metrik-Algorithmen wie einen Match-Rating-Algorithmus zu kombinieren, um eine Menge verwandter Begriffe zu bestimmen und dann die Levenshtein-Distanz zwischen jedem Wort in der Menge zu der Zielabkürzung zu berechnen. Ich bin jedoch immer noch im Dunkeln, wenn es um Abkürzungen für Wörter geht, die nicht in einem Master-Wörterbuch sind. Im Grunde kann man, aufbauend auf Wortkonstruktionen, ein Naive Bayes Modell helfen, aber ich bin besorgt, dass jeder Fehler in der Präzision, der durch die Verwendung der obigen Algorithmen verursacht wird, jeden Modelltrainingsprozess ungültig machen wird.

Jede Hilfe wird geschätzt, da ich wirklich auf diesem festsitze.


Answers

Also habe ich mir ein ähnliches Problem angesehen und bin auf ein fantastisches Paket namens PyEnchant . Wenn Sie die Rechtschreibprüfung verwenden, können Sie Wortvorschläge erhalten, was eine schöne und einfache Lösung wäre. Allerdings wird es nur einzelne Wörter vorschlagen (soweit ich das beurteilen kann), und so die Situation, die Sie haben:

wtrbtl = water bottle

Wird nicht funktionieren.

Hier ist ein Code:

import enchant

wordDict = enchant.Dict("en_US")

inputWords = ['wtrbtl','bwlingbl','bsktball']
for word in inputWords:
    print wordDict.suggest(word)

Die Ausgabe ist:

['rebuttal', 'tribute']
['bowling', 'blinding', 'blinking', 'bumbling', 'alienable', 'Nibelung']
['basketball', 'fastball', 'spitball', 'softball', 'executable', 'basketry']

Vielleicht, wenn Sie wissen, welche Art von Abkürzungen dort sind, können Sie die Zeichenfolge in zwei Wörter trennen, z

'wtrbtl' -> ['wtr', 'btl']

Es gibt auch das Natural Language Processing Kit ( NLTK ), das ist erstaunlich, und Sie könnten dies in Kombination mit dem obigen Code verwenden, indem Sie sich ansehen, wie häufig jedes vorgeschlagene Wort ist, zum Beispiel.

Viel Glück!


Wenn Sie kein vollständiges Wörterbuch finden, können Sie ein probabilistisches Sprachmodell erstellen (oder herunterladen), um Satzkandidaten für Sie zu generieren und zu bewerten. Es könnte ein Charakter-N-Gram-Modell oder ein neurales Netzwerk sein.

Für Ihre Abkürzungen können Sie ein "Rauschmodell" erstellen, das die Wahrscheinlichkeit von Zeichenauslassungen vorhersagt. Es kann aus einem Korpus lernen (man muss es manuell oder halbmanuell beschriften), dass Konsonanten weniger häufig fehlen als Vokale.

Sie können ein komplexes Sprachmodell und ein einfaches Rauschmodell verwenden, um sie mithilfe des Ansatzes für verrauschte Kanäle (siehe z. B. den Artikel von Jurafsky für weitere Details) zu kombinieren, um Kandidatensätze vorzuschlagen.

Aktualisieren . Ich habe mich für dieses Problem begeistert und diesen Algorithmus implementiert:

  • Sprachmodell (Zeichen 5-Gramm trainiert auf dem Herr der Ringe Text)
  • Rauschmodell (Wahrscheinlichkeit, dass jedes Symbol abgekürzt wird)
  • Strahlsuchalgorithmus, für Kandidatensatzvorschlag.

Meine Lösung ist in diesem Python-Notebook implementiert. Mit trainierten Modellen hat es ein Interface wie noisy_channel('bsktball', language_model, error_model) , das übrigens {'basket ball': 33.5, 'basket bally': 36.0} zurückgibt. Wörterbuchwerte sind Punkte der Vorschläge (je niedriger, desto besser).

Mit anderen Beispielen wirkt es schlechter: für 'wtrbtl' gibt es zurück {'water but all': 23.7, 'water but ill': 24.5, 'water but lay': 24.8, 'water but let': 26.0, 'water but lie': 25.9, 'water but look': 26.6} .

Für 'bwlingbl' gibt es {'bwling belia': 32.3, 'bwling bell': 33.6, 'bwling below': 32.1, 'bwling belt': 32.5, 'bwling black': 31.4, 'bwling bling': 32.9, 'bwling blow': 32.7, 'bwling blue': 30.7} . Wenn Sie jedoch auf einem geeigneten Korpus trainieren (z. B. Sportmagazine und Blogs; vielleicht mit Überabtastung von Substantiven) und vielleicht mit einer größeren Breite der Strahlsuche, wird dieses Modell relevantere Vorschläge liefern.


... Abkürzungen für Wörter, die sich nicht in einem Masterwörterbuch befinden.

Also, du suchst ein NLP-Modell, das mit gültigen englischen Wörtern aufwarten kann, ohne sie vorher gesehen zu haben?

Es ist wahrscheinlich einfacher, ein umfangreicheres Wortverzeichnis zu finden oder vielleicht jedes Wort im existierenden Wörterbuch auf übliche Erweiterungen wie +"es" oder word[:-1] + "ies" .


Eine Möglichkeit besteht darin, in der Zeit zurückzugehen und das Soundex-Algorithmus- Äquivalent zu berechnen.

Soundex löscht alle Vokale, behandelt häufige Fehllaute und zerknautschte Schreibweisen. Der Algorithmus ist einfach und wird von Hand ausgeführt. Der Nachteil ist, dass es keine speziellen Wortstämme gibt oder die Arbeitsunterstützung stoppt.


Saubere und pythonische Art, die Zeilen einer Datei in eine Liste zu lesen

In erster Linie sollten Sie sich darauf konzentrieren, Ihre Datei zu öffnen und ihre Inhalte effizient und pythonisch zu lesen. Hier ist ein Beispiel für die Art, wie ich persönlich NICHT bevorzuge:

infile = open('my_file.txt', 'r')  # Open the file for reading.

data = infile.read()  # Read the contents of the file.

infile.close()  # Close the file since we're done using it.

Stattdessen bevorzuge ich die folgende Methode zum Öffnen von Dateien zum Lesen und Schreiben, da sie sehr sauber ist und keinen zusätzlichen Schritt zum Schließen der Datei erfordert, wenn Sie sie nicht mehr verwenden. In der folgenden Anweisung öffnen wir die Datei zum Lesen und weisen sie der Variablen 'infile' zu. Sobald der Code in dieser Anweisung beendet ist, wird die Datei automatisch geschlossen.

# Open the file for reading.
with open('my_file.txt', 'r') as infile:

    data = infile.read()  # Read the contents of the file into memory.

Jetzt müssen wir uns darauf konzentrieren, diese Daten in eine Python-Liste zu bringen, weil sie iterierbar, effizient und flexibel sind. In Ihrem Fall ist das gewünschte Ziel, jede Zeile der Textdatei in ein separates Element zu bringen. Um dies zu erreichen, verwenden wir die Methode splitlines () wie folgt:

# Return a list of the lines, breaking at line boundaries.
my_list = data.splitlines()

Das Endprodukt:

# Open the file for reading.
with open('my_file.txt', 'r') as infile:

    data = infile.read()  # Read the contents of the file into memory.

# Return a list of the lines, breaking at line boundaries.
my_list = data.splitlines()

Testen unseres Codes:

  • Inhalt der Textdatei:
     A fost odatã ca-n povesti,
     A fost ca niciodatã,
     Din rude mãri împãrãtesti,
     O prea frumoasã fatã.
  • Drucke Aussagen zu Testzwecken:
    print my_list  # Print the list.

    # Print each line in the list.
    for line in my_list:
        print line

    # Print the fourth element in this list.
    print my_list[3]
  • Ausgabe (wegen Unicode-Zeichen anders aussehend):
     ['A fost odat\xc3\xa3 ca-n povesti,', 'A fost ca niciodat\xc3\xa3,',
     'Din rude m\xc3\xa3ri \xc3\xaemp\xc3\xa3r\xc3\xa3testi,', 'O prea
     frumoas\xc3\xa3 fat\xc3\xa3.']

     A fost odatã ca-n povesti, A fost ca niciodatã, Din rude mãri
     împãrãtesti, O prea frumoasã fatã.

     O prea frumoasã fatã.






python machine-learning nlp abbreviation