Dies ist ein Memo für mich, während ich Einführung in Anwendungen zur Verarbeitung natürlicher Sprache in 15 Schritten lese. Dieses Mal werde ich in Kapitel 2, Schritt 02 meine eigenen Punkte aufschreiben.
Ich habe im vorherigen Kapitel einen einfachen Dialogagenten erstellt, der jedoch ähnliche Sätze nicht auf die gleiche Weise behandelt und Wörter (z. B. Hilfswörter) und Unterschiede (Groß- und Kleinbuchstaben des Alphabets) behandelt, die ursprünglich nicht als Merkmale wichtig sind. Lernen Sie die folgenden Techniken und wenden Sie sie auf Dialogagenten an.
Formatieren Sie den Text ordnungsgemäß, bevor Sie mit der Textklassifizierung beginnen.
#Kann nicht als der gleiche Satz behandelt werden
Gefällt dir Python?
Magst du Pyson?
#Charakterisiert die Gemeinsamkeit von Hilfswörtern und Hilfsverben
#Etikette,Satz
0,Ich mag dich
1,Ich mag Ramen!
# ↓
#Beschriften Sie den Satz "Ich mag Ramen"=Es kann als 0 beurteilt werden
#Semantisches Label=Ich möchte es als 1 beurteilen
Der Vorgang, Schwankungen in der Notation zu absorbieren und zu einer bestimmten Notation zu vereinheitlichen, wird als Zeichenkettennormalisierung bezeichnet. Das Ziel ist es, die gleiche BoW zu erhalten, indem das gleiche Ergebnis des Schreibens erzielt wird, auch wenn die Notation schwankt. Die ungefähre Normalisierung wird durch Neologdn durchgeführt, und die Normalisierung (Absenken und Unicode-Normalisierung), die Neologdn fehlt, wird individuell behandelt.
neologdn Es gibt eine Bibliothek namens neologdn, die mehrere Normalisierungsprozesse zusammenfasst. Dies ist der Normalisierungsprozess, der zum Generieren von NEologd-Daten verwendet wird, einer Art MeCab-Wörterbuch. Der Vorteil von neologdn ist, dass es einfach zu verwenden ist, da der Normalisierungsprozess in eine Funktion integriert ist, und dass es schnell ist, weil es in der C-Sprache implementiert ist.
Anwendungsbeispiel
import neologdn
print(neologdn.normalize(<Satz>))
neologdn.normalize beinhaltet keine untere / obere Umwandlung von Alphabeten. Um die Schwankungen der Notation zu absorbieren, verwenden Sie daher .lower () und .upper (), integrierte Methoden vom Typ Python str, um die Notation in Klein- oder Großbuchstaben zu vereinheitlichen.
Die richtige Nomenklatur kann jedoch wichtig sein, um zwischen Unter- und Oberbuchstaben des Alphabets zu unterscheiden. Wir werden daher bei Bedarf antworten.
Unicode ist mittlerweile so weit verbreitet, dass es de facto der Standard für Zeichencodes ist. "De" und "Co., Ltd." und "de", eine Kombination der einzelnen Zeichen "de" und "te" und "selbst wenn sie gleich" de "sind, werden als unterschiedliche Zeichen behandelt, so dass das Ergebnis von Bow natürlich unterschiedlich ist. Ich werde am Ende.
In Unicode werden Zeichen durch ** Codepunkte ** dargestellt. (Hexare Notation) Sie können mit den integrierten Python-Funktionen ord () und chr () ineinander konvertiert werden.
Unicode- und Codepoint-Beispiele
>>> hex(ord('Ah'))
'0x3042'
>>> chr(0x3042)
'Ah'
#Übrigens ist es auch in Dezimalschreibweise möglich
>>> ord('Ah')
12354
>>> chr(12354)
'Ah'
Überprüfen Sie als Nächstes für das Zeichen "de" die Codepunkte für ein Zeichen und für die kombinierte Zeichenfolge (Basiszeichen und kombiniertes Zeichen).
De Code Point Bestätigung
#Ein Brief
>>> chr(0x30C7)
'De'
#Kombinierte Zeichenfolge
>>> chr(0x30C6)
'Te'
>>> chr(0x3099)
'S.'
>>> chr(0x30C6) + chr(0x3099)
'De'
Wie oben erwähnt, hat sich Unicode mit diesem Problem befasst, was bedeutet, dass es mehrere Möglichkeiten gibt, dasselbe Zeichen auszudrücken, indem ** "eine Reihe von Codepunkten definiert wird, die als dasselbe Zeichen behandelt werden sollen" **. Dies wird als Unicode-Äquivalenz bezeichnet, und es gibt die folgenden zwei.
Die Unicode-Normalisierung besteht darin, synthetisierte Zeichen basierend auf dieser Äquivalenz zu zerlegen und zu synthetisieren. Es gibt die folgenden vier. Kanonisch bedeutet kanonisch und Kompatibilität bedeutet kompatibel.
Wenn Sie tatsächlich eine Unicode-Normalisierung durchführen, müssen Sie ** entscheiden, welche Normalisierung gemäß dem von der Anwendung behandelten Problem und der Art der Daten verwendet werden soll **.
Das Korrigieren von Änderungen in der Wortform aufgrund von Verwendung usw. und das Korrigieren in der in der Wörterbuchüberschrift aufgeführten Form wird als Kopfwortkonvertierung bezeichnet. Zu diesem Zeitpunkt wurden jedoch noch nicht dieselben Merkmale durch "Lesen eines Buches" und "Lesen eines Buches" extrahiert. Indem es dem Stoppwort im nächsten Abschnitt entspricht, kann es als dasselbe Merkmal behandelt werden.
ich lese ein Buch
ich lese ein Buch
↓ Geschrieben+Headword-Konvertierung
Ein Buch lesen
ich lese ein Buch
Es ähnelt der oben erwähnten Normalisierung hinsichtlich der Absorption von Notationsschwankungen, wird jedoch häufig zusammen mit dem Schreibprozess beschrieben, um das Schreiben zu korrigieren.
Wenn Sie node.feature verwenden, das von parseToNode von MeCab erhalten wurde, können Sie das Originalformular ** aus dem durch Kommas getrennten 6. Element abrufen.
** Wörter, deren ursprüngliche Form nicht registriert ist, verwenden jedoch die Oberflächenform **.
** BOS / EOS ** ist ein Pseudowort, das den Anfang und das Ende eines Satzes als Ergebnis von MeCab darstellt, daher sollte es nicht in das Ergebnis des Schreibens aufgenommen werden.
Im vorherigen Abschnitt ist das Wort bis zum "Lesen eines Buches" das gleiche, da in getrennten Wörtern geschrieben wurde. Danach sind "da" und "masuta" unterschiedlich, sodass auch die BoW unterschiedlich ist. Es hat keinen signifikanten Einfluss auf die Bedeutung des Textes und ist unter dem Gesichtspunkt der Speicher- und Speichereffizienz nicht wünschenswert, wenn es im Vokabular enthalten ist.
Bereiten Sie im Voraus eine Liste mit Wörtern zum Ausschluss vor, wie unten gezeigt, und beurteilen Sie anhand der if-Anweisung. In einigen Fällen können Sie die erforderliche Stoppwortliste aus dem Netz erstellen, z. B. Slothlib.
~~
stop_words = ['Hand', 'Zu', 'Zu', 'Ist', 'ist', 'Masu']
~~
if token not in stop_words:
result.append(token)
Hilfswörter und Hilfsverben sind wichtige Teile zum Schreiben von Sätzen, aber sie sind nicht erforderlich, um die Bedeutung eines Satzes auszudrücken (in einem Dialogagenten werden die für die Klassifizierung der Klassen-ID erforderlichen Merkmale erworben).
~~
if features[0] not in ['Partikel', 'Hilfsverb']:
~~
Wie im vorherigen Abschnitt ist es als Satz wichtig, aber da "numerischer Wert sowie Datum und Uhrzeit" möglicherweise nicht viel Bedeutung haben, um die Bedeutung des Satzes auszudrücken, ersetzen Sie ihn durch eine bestimmte Zeichenfolge.
#Vor der Konvertierung
Ich habe ein Ei gekauft
Ich habe zwei Eier gekauft
Ich habe 10 Eier gekauft
#Nach der Konvertierung
Ich habe SOMENUMBER Eier gekauft
Ich habe SOMENUMBER Eier gekauft
Ich habe SOMENUMBER Eier gekauft
――Obwohl die Informationen über die Anzahl der Stücke verloren gehen, bleibt die Bedeutung von "Ich habe ein Ei gekauft" gleich, und der Unterschied in der Anzahl der Stücke kann vereinheitlicht werden.
Wenden Sie, wie eingangs erwähnt, die folgenden in diesem Kapitel erlernten Techniken auf den Dialogagenten an.
~~
# _tokenize()Verbesserung von
def _tokenize(self, text):
text = unicodedata.normalize('NFKC', text) #Unicode-Normalisierung
text = neologdn.normalize(text) #Normalisierung durch neologdn
text = text.lower() #Das Alphabet senken
node = self.tagger.parseToNode(text)
result = []
while node:
features = node.feature.split(',')
if features[0] != 'BOS/EOS':
if features[0] not in ['Partikel', 'Hilfsverb']: #Stoppen Sie die Wortentfernung durch Teiltexte
token = features[6] \
if features[6] != '*' \
else node.surface #Headword-Konvertierung
result.append(token)
node = node.next
return result
Ausführungsergebnis
# evaluate_dialogue_agent.Der Name des Lademoduls von py wurde korrigiert
from dialogue_agent import DialogueAgent
↓
from dialogue_agent_with_preprocessing import DialogueAgent
$ docker run -it -v $(pwd):/usr/src/app/ 15step:latest python evaluate_dialogue_agent.py
0.43617021
Recommended Posts