[PYTHON] Probieren Sie das Buch "Einführung in die Verarbeitung natürlicher Sprachanwendungen in 15 Schritten" aus - Kapitel 2 Schritt 02 Memo "Vorverarbeitung"

Inhalt

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.

Vorbereitung

Kapitelübersicht

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.

02.1 Was ist Vorverarbeitung?

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

02.2 Normalisierung

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>))

Absenken und Absenken

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.

Übersicht über die Unicode-Normalisierung

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.

Detaillierte Erklärung der Unicode-Normalisierung

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 **.

02.3 Headwordization

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

Geschichte bei der Implementierung

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.

02.4 Stoppwort

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.

Wörterbuchbasierte Stoppwortentfernung

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)

Teilbasierte Stoppwortentfernung

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']:
~~

02,5 Wortersetzung

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.

02.6 Bewerbung beim Dialogagenten

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

Probieren Sie das Buch "Einführung in die Verarbeitung natürlicher Sprachanwendungen in 15 Schritten" aus - Kapitel 2 Schritt 02 Memo "Vorverarbeitung"
Probieren Sie das Buch "Einführung in die Verarbeitung natürlicher Sprachanwendungen in 15 Schritten" aus - Kapitel 2 Schritt 06 Memo "Identifier"
Probieren Sie das Buch "Einführung in die Verarbeitung natürlicher Sprachanwendungen in 15 Schritten" aus - Kapitel 2 Schritt 07 Memo "Evaluation"
Probieren Sie das Buch "Einführung in die Verarbeitung natürlicher Sprachanwendungen in 15 Schritten" - Kapitel 4 Schritt 14 Memo "Hyperparametersuche"
Probieren Sie das Buch "Einführung in die Entwicklung natürlicher Anwendungen in 15 Schritten" aus - Kapitel 2 Schritt 04 Memo "Feature Extraction"
Probieren Sie das Buch "Einführung in die Verarbeitung natürlicher Sprachanwendungen in 15 Schritten" aus - Kapitel 4 Schritt 15 Memo "Datenerfassung"
Probieren Sie das Buch "Einführung in die Verarbeitung natürlicher Sprachanwendungen in 15 Schritten" - Kapitel 3 Schritt 08 Memo "Einführung in neuronale Netze".
Probieren Sie das Buch "Einführung in die Entwicklung natürlicher Anwendungen in 15 Schritten" aus - Kapitel 2 Schritt 05 Memo "Feature Quantity Conversion"
Probieren Sie das Buch "Einführung in die Verarbeitung natürlicher Sprachanwendungen in 15 Schritten" aus - Kapitel 3 Schritt 11 Memo "Worteinbettungen"
Probieren Sie das Buch "Einführung in die Entwicklung natürlicher Anwendungen in 15 Schritten" - Kapitel 3 Schritt 12 Memo "Convolutional Neural Networks".
Probieren Sie das Buch "Einführung in die Entwicklung natürlicher Anwendungen in 15 Schritten" aus - Kapitel 3 Schritt 13 Memo "Wiederkehrende neuronale Netze"
Probieren Sie das Buch "Einführung in die Entwicklung natürlicher Anwendungen in 15 Schritten" aus - Kapitel 3 Schritt 09 Memo "Identifier by Neural Network"
Probieren Sie das Buch "Einführung in die Entwicklung natürlicher Anwendungen in 15 Schritten" aus - Kapitel 2 Schritt 01 Memo "Erstellen eines Dialogagenten"
Versuchen Sie das Buch "Einführung in die Verarbeitung natürlicher Sprachanwendungen in 15 Schritten" - Kapitel 2 Schritt 03 Memo "Morphologische Analyse und schriftliches Schreiben"
Versuchen wir das Buch "Einführung in die Entwicklung natürlicher Anwendungen in 15 Schritten" - Kapitel 3 Schritt 10 Memo "Details und Verbesserung des neuronalen Netzes"
Probieren Sie das Buch "Einführung in die Verarbeitung natürlicher Sprachanwendungen in 15 Schritten" - Kapitel 1 Memo "Vorkenntnisse vor Beginn der Übungen".
[WIP] Vorverarbeiten von Notizen in der Verarbeitung natürlicher Sprache
Zusammenfassung von Anfang bis Kapitel 1 der Einführung in Entwurfsmuster, die in der Java-Sprache gelernt wurden
[Kapitel 5] Einführung in Python mit 100 Klopfen Sprachverarbeitung
[Kapitel 6] Einführung in Scicit-Learn mit 100 Klopfen Sprachverarbeitung
Leistungsüberprüfung der Datenvorverarbeitung in der Verarbeitung natürlicher Sprache
[Kapitel 3] Einführung in Python mit 100 Klopfen Sprachverarbeitung
[Kapitel 2] Einführung in Python mit 100 Klopfen Sprachverarbeitung
[Kapitel 4] Einführung in Python mit 100 Klopfen Sprachverarbeitung
[Jobwechsel-Meeting] Versuchen Sie, Unternehmen zu klassifizieren, indem Sie Mundpropaganda in natürlicher Sprache mit word2vec verarbeiten
[Verarbeitung natürlicher Sprache] Ich habe diese Woche versucht, die aktuellen Themen in der Slack-Community zu visualisieren
[Verarbeitung natürlicher Sprache] Ich habe versucht, die Bemerkungen jedes Mitglieds in der Slack-Community zu visualisieren
Arten der Vorverarbeitung in der Verarbeitung natürlicher Sprache und ihre Leistungsfähigkeit
Zusammenfassung von Kapitel 2 der Einführung in Entwurfsmuster, die in Java gelernt wurden
Kapitel 4 Zusammenfassung der Einführung in Entwurfsmuster, die in Java gelernt wurden
Zusammenfassung von Kapitel 3 der Einführung in Entwurfsmuster, die in Java gelernt wurden
[Einführung in RasPi4] Umgebungskonstruktion, Mecab des Verarbeitungssystems für natürliche Sprache usw. .. .. ♪
Dockerfile mit den notwendigen Bibliotheken für die Verarbeitung natürlicher Sprache mit Python
100 Klicks in der Verarbeitung natürlicher Sprache Kapitel 4 Kommentar
[Verarbeitung natürlicher Sprache] Vorverarbeitung mit Japanisch
Probieren Sie Cython in kürzester Zeit aus
Vorbereitung zum Starten der Verarbeitung natürlicher Sprache
Von der Einführung der GoogleCloudPlatform Natural Language API bis zur Verwendung
Ich habe versucht, die Version 2020 mit 100 Sprachverarbeitung zu lösen [Kapitel 3: Reguläre Ausdrücke 25-29]
100 Klopfen der Verarbeitung natürlicher Sprache Kapitel 1 (Vorbereitungsbewegung)
Einführung in die Überprüfung der Wirksamkeit Kapitel 1 in Python geschrieben
Praktische Warenmitteilung zur Verarbeitung natürlicher Sprache
Auch wenn die Entwicklungssprache in Cloud9 in Python3 geändert wird, wird Version 2 in Python - Version angezeigt
Ich habe versucht, die 2020-Version von 100 Sprachverarbeitungsproblemen zu lösen [Kapitel 3: Reguläre Ausdrücke 20 bis 24]
Ich habe versucht, mit der Bibliothek GiNZA zur Verarbeitung natürlicher Sprache eindeutige Ausdrücke zu extrahieren
Ich habe versucht, die 2020-Version von 100 Sprachverarbeitungsproblemen zu lösen [Kapitel 1: Vorbereitungsbewegung 00-04]
Ich habe versucht, die 2020-Version von 100 Sprachverarbeitungsproblemen zu lösen [Kapitel 1: Vorbereitungsbewegung 05-09]
Die erste künstliche Intelligenz. Ich wollte die Verarbeitung natürlicher Sprache ausprobieren, daher werde ich die morphologische Analyse mit MeCab mit Python3 versuchen.