[PYTHON] Arten der Vorverarbeitung in der Verarbeitung natürlicher Sprache und ihre Leistungsfähigkeit

** Die Vorverarbeitung ist für die Verarbeitung natürlicher Sprache unerlässlich. ** Text ist eine Liste von Zeichen und nicht strukturiert, daher ist es schwierig, ihn so zu verarbeiten, wie er ist. Insbesondere enthält Webtext Rauschen wie HTML-Tags und JavaScript-Code. Wenn ein solches Rauschen nicht vorbehandelt und entfernt wird, werden die erwarteten Ergebnisse nicht erzielt.

スクリーンショット 2017-04-04 9.20.08.png Quelle: [Deep Learning für Computational Biology](http://msb.embopress.org/content/12/7/878)

Dieser Artikel beschreibt ** Arten der Vorverarbeitung in der Verarbeitung natürlicher Sprache und deren Leistungsfähigkeit **. In Bezug auf die Erklärungsreihenfolge werden zuerst die Arten der Vorverarbeitung erläutert. Jede Vorverarbeitung wird unter den Gesichtspunkten erklärt: 1. welche Art von Verarbeitung es ist, 2. warum sie durchgeführt wird und 3. wie sie implementiert wird (so weit wie möglich). Nach der Erläuterung der Typen werden die Ergebnisse der Dokumentklassifizierung mit und ohne Vorverarbeitung verglichen, um die Leistung der Vorverarbeitung zu messen.

Vorverarbeitungstyp und Implementierung

In diesem Abschnitt werden die folgenden fünf Vorverarbeitungen beschrieben. Wir werden die fünf Vorprozesse unter den Gesichtspunkten erklären, 1. welche Art von Verarbeitung, 2. warum sie durchgeführt wird und 3. wie sie implementiert wird.

スクリーンショット 2017-04-13 10.09.02.png

Textbereinigung

Durch die Textbereinigung werden die im Text enthaltenen Geräusche entfernt. Häufiges Rauschen sind JavaScript-Code und HTML-Tags. Durch die Beseitigung dieser Geräusche können die negativen Auswirkungen von Geräuschen auf die Aufgabenergebnisse verringert werden. Das Bild sieht folgendermaßen aus: スクリーンショット 2017-04-03 11.20.10.png

Das Entfernen von JavaScript- und HTML-Tags ist üblich, aber in Wirklichkeit hängt das Rauschen, das Sie entfernen möchten, von den Daten ab. Reguläre Ausdrücke sind eine Hand, die in solchen Fällen verwendet werden kann. Verwenden Sie beim Schreiben eines regulären Ausdrucks einen Online-Editor wie den folgenden, um die Musterübereinstimmung in Echtzeit zu überprüfen und die Arbeit zu verbessern.

https://regex101.com/ regexp.mov.gif

Nützlich zum Reinigen von Python wie Beautiful Soup und lxml Es gibt eine Bibliothek. Klicken Sie hier für ein Beispiel für die Textbereinigung mit BeautifulSoup: preprocessings/ja/cleaning.py

Wort geteilt

Das erste, was für Sprachen wie Japanisch getan wird, bei denen Wortumbrüche nicht klar sind, ist die Wortaufteilung. Der Grund für das Aufteilen von Wörtern besteht darin, dass die meisten Verarbeitungssysteme für natürliche Sprachen Eingaben auf Wortebene verarbeiten. Die Teilung wird hauptsächlich unter Verwendung eines morphologischen Analysators durchgeführt. Die wichtigsten morphologischen Analysegeräte sind MeCab und [Juman ++](http://nlp.ist.i.kyoto-u.ac.jp/index.php? JUMAN ++), Janome.

Das Bild ist wie folgt unterteilt. Zu diesem Zeitpunkt kann das Wort als Prototyp erstellt werden, um die Anzahl der Vokabeln zu verringern: スクリーンショット 2017-04-03 13.54.31.png

Das Problem bei der morphologischen Analyse besteht darin, dass sie standardmäßig nicht stark darin ist, neue Wörter zu analysieren. Mit Blick auf das obige Beispiel ist das "National New Museum" in drei Teile unterteilt: "National", "New" und "Museum". Der Grund für dieses Ergebnis ist, dass das für die Analyse verwendete Wörterbuch kein "National New Museum" enthält. Dieses Problem wird noch verschärft, zumal das Web viele neue Wörter enthält.

Dieses Problem kann bis zu einem gewissen Grad durch Hinzufügen eines Wörterbuchs mit dem Namen NEologd gelöst werden. NEologd enthält im Vergleich zu normalen Wörterbüchern viele neue Wörter. Daher hilft Ihnen die Verwendung von NEologd bei der Analyse neuer Wörter. Unten ist das Ergebnis der Analyse des gleichen Satzes wie oben mit NEologd: スクリーンショット 2017-04-03 14.01.58.png

Nach dem Teilen des Wortes wie oben beschrieben wird die nachfolgende Verarbeitung durchgeführt. Unten ist die Python-Implementierung: preprocessings/ja/tokenizer.py

Wortnormalisierung

Bei der Wortnormalisierung werden Wörter ersetzt, z. B. die Vereinheitlichung der Zeichentypen von Wörtern und das Absorbieren von Rechtschreib- und Notationsschwankungen. Durch Ausführen dieses Vorgangs können "Katze" in voller Breite und "Neko" in halber Breite und "Katze" in Hiragana als dasselbe Wort verarbeitet werden. Dies ist ein wichtiger Prozess unter dem Gesichtspunkt des Rechenaufwands und der Speichernutzung bei der nachfolgenden Verarbeitung.

Es gibt verschiedene Prozesse zur Wortnormalisierung, aber in diesem Artikel werden die folgenden drei Prozesse vorgestellt.

Vereinheitlichung der Zeichentypen

Um die Zeichentypen zu vereinheitlichen, werden die oberen und unteren Buchstaben des Alphabets in untere Buchstaben und die Buchstaben halber Breite in Buchstaben voller Breite konvertiert. Konvertieren Sie beispielsweise den oberen Teil von "Natural" in den unteren Teil, um ihn "natürlich" zu machen, oder konvertieren Sie "neko" in die volle Breite, um ihn "cat" zu machen. Durch diese Art der Verarbeitung können Wörter unabhängig vom Zeichentyp als dasselbe Wort behandelt werden. スクリーンショット 2017-04-05 9.50.55.png

Nummernersatz

Das Ersetzen von Zahlen ersetzt die im Text angezeigten Zahlen durch ein anderes Symbol (z. B. 0). Angenommen, Sie sehen eine Zeichenfolge in einem Text, der eine Zahl wie "1. Januar 2017" enthält. Durch das Ersetzen von Zahlen werden die Zahlen in dieser Zeichenfolge in "0/0/0" konvertiert. スクリーンショット 2017-04-05 9.34.29.png

Der Grund für das Ersetzen von Zahlen liegt darin, dass sie trotz der Vielzahl numerischer Darstellungen und ihrer hohen Häufigkeit häufig nicht für Aufgaben zur Verarbeitung natürlicher Sprache geeignet sind. Betrachten Sie beispielsweise die Aufgabe, Nachrichtenartikel in Kategorien wie "Sport" oder "Politik" zu kategorisieren. Zu diesem Zeitpunkt werden im Artikel verschiedene numerische Ausdrücke angezeigt, die jedoch bei der Klassifizierung von Kategorien als wenig nützlich angesehen werden. Daher wird die Nummer durch ein anderes Symbol ersetzt und die Anzahl der Vokabeln reduziert.

Daher ersetzen wir Zahlen nicht bei Aufgaben, bei denen die numerische Darstellung wichtig ist (z. B. beim Extrahieren von Informationen).

Vereinheitlichung von Wörtern mit einem Wörterbuch

Bei der Wortvereinigung mit einem Wörterbuch werden Wörter durch typische Ausdrücke ersetzt. Wenn Sie beispielsweise mit Sätzen arbeiten, die eine Mischung aus "Sony" und "Sony" enthalten, wird "Sony" durch "Sony" ersetzt. Dadurch können die beiden Wörter bei der nachfolgenden Verarbeitung als dasselbe Wort behandelt werden. Es ist zu beachten, dass der Austausch unter Berücksichtigung des Kontextes erfolgen sollte. スクリーンショット 2017-04-05 10.03.54.png

Die Welt der Wortnormalisierung ist tief und zusätzlich zu der oben erläuterten Normalisierung Rechtschreibschwankungsabsorption (loooooooooooool-> lol), Abkürzungsverarbeitung (4eva-> für immer), Darstellung verbaler Ausdrücke (ssu-> Es gibt auch Normalisierung wie). Wenn Sie über eine große Datenmenge verfügen, gibt es meiner Meinung nach eine Verarbeitung, die durch den später beschriebenen verteilten Ausdruck von Wörtern verarbeitet werden kann. Ich denke jedoch, dass es am besten ist, die für die zu lösende Aufgabe erforderliche Verarbeitung durchzuführen.

Es implementiert einige der oben beschriebenen Wortnormalisierungen: preprocessings/ja/normalization.py

Stoppen Sie die Wortentfernung

Ein Stoppwort ist ein Wort, das von der Verarbeitung ausgeschlossen ist, da es bei der Verarbeitung natürlicher Sprachen häufig und unbrauchbar ist. Zum Beispiel funktionale Wörter wie Hilfswörter und Hilfsverben (wie "ha", "no", "desu" und "masu"). Diese Wörter sind für ihre hohe Häufigkeit des Auftretens nicht nützlich und werden entfernt, da sie den Rechenaufwand und die Leistung nachteilig beeinflussen.

Es gibt verschiedene Methoden zum Entfernen von Stoppwörtern. In diesem Artikel werden jedoch die folgenden zwei Methoden vorgestellt.

Wörterbuchmethode

Bei der Wörterbuchmethode werden Stoppwörter im Voraus im Wörterbuch definiert und die im Wörterbuch enthaltenen Wörter aus dem Text entfernt. Sie können das Wörterbuch selbst erstellen, es sind jedoch bereits Wörterbücher definiert. Hier eines der japanischen Stoppwortwörterbücher Slothlib Werfen wir einen Blick auf den Inhalt. Etwa 300 Wörter werden zeilenweise definiert:

da drüben
Pro
Dort
Da drüben
nach
Loch
Sie
Das
Wie viele
Wann
Jetzt
Unangenehm
verschiedene
...

Liest und verwendet die in diesem Wörterbuch definierten Wörter als Stoppwörter. Insbesondere wenn das Lesestoppwort in dem in Wörter unterteilten Text enthalten ist, wird es entfernt. Das Bild sieht folgendermaßen aus: スクリーンショット 2017-04-03 10.52.06.png

Die Wörterbuchmethode ist einfach und leicht, hat jedoch einige Nachteile. Das erste sind die Kosten für die Erstellung eines Wörterbuchs. Das andere ist, dass einige Domänen möglicherweise nicht nützlich sind. Daher müssen Sie es entsprechend dem Korpus, auf den Sie abzielen, neu erstellen.

Methode nach Erscheinungshäufigkeit

Die frequenzbasierte Methode zählt die Häufigkeit von Wörtern im Text und entfernt hochfrequente (manchmal seltene) Wörter aus dem Text. Wir entfernen hochfrequente Wörter, weil sie einen großen Teil des Textes ausmachen, aber sie sind nutzlos. Die folgende Abbildung zeigt die kumulative Häufigkeit der 50 häufigsten Wörter in einem englischen Buch: figure_1.png Wenn Sie sich die 50 Wörter ansehen, sehen Sie, dass Wörter, die für die Klassifizierung von Dokumenten unbrauchbar erscheinen, wie z. B., von und Komma, fast 50% des Textes ausmachen. Die frequenzbasierte Methode entfernt diese hochfrequenten Wörter als Stoppwörter aus dem Text.

Klicken Sie hier für eine Implementierung, die Stoppwörter entfernt: preprocessings/ja/stopwords.py

Vektordarstellung von Wörtern

Bei der Vektordarstellung von Wörtern wird der Prozess des Konvertierens eines Wortes, das eine Zeichenfolge ist, in einen Vektor ausgeführt. Der Grund für die Konvertierung einer Zeichenfolge in einen Vektor besteht darin, dass die Zeichenfolge variabel lang und schwer zu handhaben ist und es schwierig ist, die Ähnlichkeit zu berechnen. Es gibt verschiedene Methoden zur Vektorexpression, aber ich werde die folgenden zwei vorstellen.

Ein heißer Ausdruck

Der erste Weg, ein Wort als Vektor auszudrücken, ist der One-Hot-Ausdruck. Ein One-Hot-Ausdruck ist eine Methode, bei der nur ein Element 1 und die anderen Elemente 0 sind. Durch Einstellen von 1 oder 0 für jede Dimension wird angezeigt, ob es sich um das Wort handelt oder nicht.

Nehmen wir zum Beispiel an, der One-Hot-Ausdruck repräsentiert das Wort Python. Hier besteht das Vokabular aus einer Reihe von Wörtern aus 5 Wörtern (nlp, python, word, ruby, one-hot). Dann ist der Vektor, der Python darstellt, wie folgt. スクリーンショット 2017-03-03 15.18.11.png

Die One-Hot-Darstellung ist einfach, hat jedoch die Schwäche, bei Operationen zwischen Vektoren keine aussagekräftigen Ergebnisse zu erzielen. Nehmen wir zum Beispiel an, Sie nehmen das innere Produkt, um die Ähnlichkeit zwischen Wörtern zu berechnen. In dem One-Hot-Ausdruck haben verschiedene Wörter an verschiedenen Stellen Einsen und andere Elemente sind 0, sodass das Ergebnis der Aufnahme des inneren Produkts zwischen verschiedenen Wörtern 0 ist. Dies ist nicht das gewünschte Ergebnis. Da einem Wort eine Dimension zugewiesen ist, wird es mit zunehmender Anzahl von Vokabeln zu einer sehr hohen Dimension.

Verteilte Darstellung

Verteilte Darstellungen repräsentieren dagegen Wörter als niedrigdimensionale reelle Vektoren. Es wird oft in etwa 50 bis 300 Dimensionen ausgedrückt. Zum Beispiel können die zuvor erwähnten Wörter in einem verteilten Ausdruck wie folgt ausgedrückt werden. スクリーンショット 2017-03-03 15.46.50.png

Sie können das Problem des One-Hot-Ausdrucks lösen, indem Sie den verteilten Ausdruck verwenden. Beispielsweise können Sie die Ähnlichkeit zwischen Wörtern mit Operationen zwischen Vektoren berechnen. Wenn man den obigen Vektor betrachtet, ist die Ähnlichkeit zwischen Python und Ruby wahrscheinlich höher als die Ähnlichkeit zwischen Python und Wort. Auch wenn die Anzahl der Vokabeln zunimmt, ist es nicht erforderlich, die Anzahl der Dimensionen jedes Wortes zu erhöhen.

Klicken Sie hier für die Implementierung, um einen Vektor der verteilten Darstellung zu erhalten: preprocessings/ja/word_vector.py

Kraft der Vorbehandlung

Diese Theorie untersucht, wie effektiv die Vorverarbeitung ist. Insbesondere haben wir die Klassifizierungsleistung und die Ausführungszeit mit und ohne Vorverarbeitung für die Dokumentklassifizierungsaufgabe verglichen. Infolgedessen verbesserte die Vorverarbeitung die Klassifizierungsleistung und halbierte die Ausführungszeit.

Korpus zur Klassifizierung von Dokumenten

Ich habe den Livedoor News Corpus als Dokumentklassifizierungsdatensatz verwendet. Das Livedoor-Nachrichten-Korpus ist eine Sammlung von Livedoor-Nachrichtenartikeln ohne HTML-Tags. Dieser Datensatz enthält neun unten aufgeführte Klassen:

Art der zu verwendenden Vorbehandlung

In diesem Abschnitt werden die Arten der Vorverarbeitung bei der Vorverarbeitung kurz beschrieben.

Wenn der Text nicht vorverarbeitet ist, wird er morphologisch analysiert (ipadic), in BoW konvertiert und mit TF-IDF gewichtet.

Andererseits wird bei der Vorverarbeitung der Text zuerst bereinigt. Ich habe drei Dinge getan:

Verwenden Sie nach der Reinigung NEologd, um die Sätze in das Wörterbuch für die morphologische Analyse zu schreiben. Und wir normalisieren den Text für die geteilten Wörter. Es gibt zwei Dinge zu tun:

Stoppwörter werden basierend auf der Häufigkeit des Auftretens aus den normalisierten Wörtern entfernt, und schließlich wird BoW unter Verwendung eines mit TF-IDF gewichteten Vektors klassifiziert. RandomForest wird zur Klassifizierung verwendet.

Ergebnis

Vergleichen Sie für das Ergebnis die Klassifizierungsleistung und die Ausführungszeit. Betrachten wir zunächst die Klassifizierungsleistung (Genauigkeit).

Mit Vorbehandlung Keine Vorbehandlung
0.917 0.898

~~ Die Klassifizierungsleistung mit und ohne Vorverarbeitung hat sich kaum verändert. Ich habe erwartet, dass es die Leistung verbessert, aber ... Dieser Bereich bedarf weiterer Überlegungen. ~~ Nach der Korrektur des Implementierungsfehlers gab es einen Unterschied von 1,9 Punkten zwischen Vorverarbeitung und Nichtvorverarbeitung. Es ist ein Unterschied von 1,9 Punkten in dieser Leistung, also denke ich, dass es ein vernünftiger Unterschied ist.

Beim Vergleich der Ausführungszeiten wurden die folgenden Ergebnisse erhalten. Ohne Vorverarbeitung dauert es ungefähr 600 Sekunden, aber die Berechnung ist mit der Vorverarbeitung in ungefähr der Hälfte der Zeit abgeschlossen. Es wird angenommen, dass dies auf die Verringerung der Anzahl der Vokabeln durch Bereinigen, Normalisieren und insbesondere das Entfernen von Stoppwörtern zurückzuführen ist, was zu einer Verkürzung der Ausführungszeit führte. スクリーンショット 2017-04-17 22.25.57.png

notebooks/document_classification.ipynb

abschließend

Die Vorverarbeitung ist für die Verarbeitung natürlicher Sprache unverzichtbar. Für den Umgang mit natürlichen Sprachen auf einem Computer sind verschiedene Prozesse erforderlich. Dieser Artikel hat einige von ihnen vorgestellt. Wir hoffen, Sie finden diesen Artikel hilfreich.

Ich twittere auch Informationen über maschinelles Lernen und die Verarbeitung natürlicher Sprachen in meinem Twitter-Konto. @Hironsan

Wir freuen uns auf Ihr Follow-up, wenn Sie an diesem Bereich interessiert sind.

Verweise

Recommended Posts

Arten der Vorverarbeitung in der Verarbeitung natürlicher Sprache und ihre Leistungsfähigkeit
Leistungsüberprüfung der Datenvorverarbeitung in der Verarbeitung natürlicher Sprache
Überblick über die Verarbeitung natürlicher Sprache und ihre Datenvorverarbeitung
[WIP] Vorverarbeiten von Notizen in der Verarbeitung natürlicher Sprache
Unerträgliche Aufmerksamkeitsmangel bei der Verarbeitung natürlicher Sprache
[Verarbeitung natürlicher Sprache] Vorverarbeitung mit Japanisch
Künstliche Sprache Logivan und Verarbeitung natürlicher Sprache (Verarbeitung künstlicher Sprache)
■ [Google Colaboratory] Vorverarbeitung der Verarbeitung natürlicher Sprache & Janome
Antworten und Eindrücke von 100 Sprachverarbeitungsklopfen - Teil 1
Verarbeiten Sie den Namen der Yugioh-Karte in natürlicher Sprache - Yugiou Data Science 2. NLP
Antworten und Eindrücke von 100 Sprachverarbeitungsklopfen - Teil 2
Python: Tiefes Lernen in der Verarbeitung natürlicher Sprache: Grundlagen
Python: Deep Learning in der Verarbeitung natürlicher Sprache: Implementierung eines Antwortsatzauswahlsystems
Python: Verarbeitung natürlicher Sprache
RNN_LSTM2 Verarbeitung natürlicher Sprache
Verarbeitung von CSV-Daten in voller und halber Breite in Python
Modell unter Verwendung eines Faltungsnetzwerks in der Verarbeitung natürlicher Sprache
Zusammenfassung der Datumsverarbeitung in Python (Datum / Uhrzeit und Datum)
Vor- und Nachbearbeitung von Pytest
Verarbeitung natürlicher Sprache 1 Morphologische Analyse
100 Sprachverarbeitung Knock-42: Anzeige der Phrase der betroffenen Person und der betroffenen Person
Verarbeitung natürlicher Sprache 3 Wortkontinuität
[Verarbeitung natürlicher Sprache] Ich habe versucht, die Bemerkungen jedes Mitglieds in der Slack-Community zu visualisieren
Verarbeitung natürlicher Sprache 2 Wortähnlichkeit
Erläuterung der CSV und Implementierungsbeispiel in jeder Programmiersprache
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" aus - Kapitel 2 Schritt 02 Memo "Vorverarbeitung"
Dockerfile mit den notwendigen Bibliotheken für die Verarbeitung natürlicher Sprache mit Python
Warum ist der verteilte Ausdruck von Wörtern für die Verarbeitung natürlicher Sprache wichtig?
[Word2vec] Lassen Sie uns das Ergebnis der Verarbeitung von Unternehmensbewertungen in natürlicher Sprache visualisieren
100 Klicks in der Verarbeitung natürlicher Sprache Kapitel 4 Kommentar
100 Sprachverarbeitung Knock Kapitel 1 in Python
Verarbeitung natürlicher Sprache für vielbeschäftigte Menschen
100 Sprachverarbeitung Knock-59: Analyse der S-Formel
Eine Geschichte über den Versuch von LT, die Verarbeitung natürlicher Sprache und die Abhängigkeitsanalyse in einem Augenblick von einem leeren Ort aus live zu codieren
Vorbereitung zum Starten der Verarbeitung natürlicher Sprache
Installationszusammenfassung des Analysators für die Verarbeitung natürlicher Sprache
Zusammenfassung der Mehrprozessverarbeitung der Skriptsprache
Sie werden in 100 Tagen Ingenieur. ――Tag 66 ――Programmieren ――Über die Verarbeitung natürlicher Sprache
Lernen Sie die Grundlagen der Dokumentklassifizierung durch Verarbeitung natürlicher Sprache, Themenmodell
Ich habe eine Art einfaches Bildverarbeitungswerkzeug in der Sprache Go erstellt.
Rehabilitation von Python- und NLP-Kenntnissen ab "100 Language Processing Knock 2015" (Kapitel 1)
Python: Vorverarbeitung beim maschinellen Lernen: Umgang mit fehlenden / Ausreißern / unausgeglichenen Daten
[Verarbeitung natürlicher Sprache] Extrahieren Sie Schlüsselwörter aus der Kakenhi-Datenbank mit MeCab-ipadic-neologd und termextract
Erstellt eine Chrome-Erweiterung, die die Möglichkeiten der Verarbeitung natürlicher Sprache nutzt, um dunkle Websites aus der Welt zu vertreiben
100 Sprachverarbeitung Knock-91: Vorbereitung von Analogiedaten
Sprachverarbeitung 100 Knocks-44: Visualisierung abhängiger Bäume
100 Sprachverarbeitung Knock-22: Extraktion des Kategorienamens
100 Klopfen der Verarbeitung natürlicher Sprache Kapitel 1 (Vorbereitungsbewegung)
100 Sprachverarbeitung Knock-26: Entfernen von hervorgehobenem Markup
3. Verarbeitung natürlicher Sprache durch Python 2-1. Netzwerk für das gleichzeitige Auftreten
3. Verarbeitung natürlicher Sprache durch Python 1-1. Word N-Gramm
Screenshots des Webfischens mit Selen und Chrom.
Trennung von Design und Daten in matplotlib
Zusammenfassung der Module und Klassen in Python-TensorFlow2-
Ich habe versucht, natürliche Sprache mit Transformatoren zu verarbeiten.
Status jedes Python-Verarbeitungssystems im Jahr 2020
Projekt Euler # 1 "Vielfaches von 3 und 5" in Python
Praktische Warenmitteilung zur Verarbeitung natürlicher Sprache