[PYTHON] 100 Sprachverarbeitung Knock-82 (Kontextwort): Kontextextraktion

Dies ist die Aufzeichnung der 82. "Kontextextraktion" von Language Processing 100 Knock 2015. Auch diesmal hat das Vorverarbeitungssystem für den nachfolgenden Prozess keine besonders schwierige Verarbeitung durchgeführt, und es gibt wenig technische Erklärung. Die Problemstellung war für einen Amateur jedoch schwer zu verstehen, und es dauerte einige Zeit, sie zu verstehen.

Referenzlink

Verknüpfung Bemerkungen
082.Extraktion des Kontextes.ipynb Antwortprogramm GitHub Link
100 Klicks Amateur-Sprachverarbeitung:82 Ich bin Ihnen immer mit 100 Sprachverarbeitungsklopfen zu Dank verpflichtet
100 Sprachverarbeitung klopfen 2015 Version(80~82) Ich habe in Kapitel 9 darauf hingewiesen.

Umgebung

Art Ausführung Inhalt
OS Ubuntu18.04.01 LTS Es läuft virtuell
pyenv 1.2.15 Ich benutze pyenv, weil ich manchmal mehrere Python-Umgebungen benutze
Python 3.6.9 python3 auf pyenv.6.Ich benutze 9
3.7 oder 3.Es gibt keinen tiefen Grund, keine 8er-Serie zu verwenden
Pakete werden mit venv verwaltet

Aufgabe

Kapitel 9: Vektorraummethode (I)

enwiki-20150112-400-r10-105752.txt.bz2 Ist der Text von 105.752 Artikeln zufällig 1/10 aus den Artikeln ausgewählt, die zum 12. Januar 2015 aus etwa 400 Wörtern oder mehr der englischen Wikipedia-Artikel bestehen und im bzip2-Format komprimiert sind. Gibt es. Mit diesem Text als Korpus möchte ich einen Vektor (verteilten Ausdruck) lernen, der die Bedeutung eines Wortes ausdrückt. In der ersten Hälfte von Kapitel 9 wird der Prozess des Lernens des Wortvektors implementiert, indem er in mehrere Prozesse unterteilt wird, indem die Hauptkomponentenanalyse auf die aus dem Korpus erstellte Matrix für das gleichzeitige Auftreten von Wortkontexten angewendet wird. In der zweiten Hälfte von Kapitel 9 wird der durch Lernen erhaltene Wortvektor (300 Dimensionen) verwendet, um die Ähnlichkeit von Wörtern zu berechnen und zu analysieren (analog).

Beachten Sie, dass bei gehorsamer Implementierung von Problem 83 eine große Menge (ca. 7 GB) Hauptspeicher erforderlich ist. Wenn Ihnen der Speicher ausgeht, erstellen Sie einen Prozess oder ein 1/100 Stichproben-Korpus enwiki-20150112-400-r100-10576.txt.bz2. Verwenden Sie /nlp100/data/enwiki-20150112-400-r100-10576.txt.bz2).

Diesmal * 1/100 Stichprobenkorpus enwiki-20150112-400-r100-10576.txt.bz2 400-r100-10576.txt.bz2) "* wird verwendet.

82. Extraktion des Kontextes

Exportieren Sie alle Paare von Wort $ t $ und Kontextwort $ c $ im tabulatorgetrennten Format für alle Wörter t, die in dem in> 81 erstellten Korpus erscheinen. Die Definition von Kontextwörtern ist jedoch wie folgt.

-Extrahieren Sie $ d $ Wörter vor und nach einem Wort $ t $ als Kontextwort $ c $ (das Kontextwort enthält jedoch nicht das Wort t selbst).

  • Jedes Mal, wenn Sie das Wort $ t $ auswählen, wird die Kontextbreite $ d $ zufällig im Bereich {1,2,3,4,5} bestimmt.

Problemergänzung

Was ist ein "Kontextwort"?

Das Zielwort heißt ** "Zielwort" **, und die Wörter vor und nach dem Zielwort heißen ** "Kontextwort" **. Die Anzahl der Wörter vom Zielwort zum Kontextwort wird als ** "Kontextfenstergröße" (Kontextfenstergröße oder Fenstergröße) ** bezeichnet.

Ich werde mit dem folgenden Beispielsatz in der Originaldatei der Aufgabe erklären.

No surface details of Adrastea are known due to the low resolution of available images

Wenn beispielsweise * Adrastea * das obige Zielwort ist, sind die vorhergehenden und folgenden "Details", "von", "sind" und "bekannt" Kontextwörter mit einer Kontextbreite von 2. Wenn Sie diese Aufgabe für den obigen Satz mit einer Kontextbreite von 2 ausführen möchten, erstellen Sie diesmal die folgende Datei.

1 Spaltenname 2. Reihe
No surface
No details
surface No
surface details
surface of
details No
details surface
details of
details Adrastea

Antworten

Antwortprogramm [082. Context extract.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/09.%E3%83%99%E3%82%AF%E3%83%88%E3 % 83% AB% E7% A9% BA% E9% 96% 93% E6% B3% 95% 20 (I) / 082.% E6% 96% 87% E8% 84% 88% E3% 81% AE% E6 % 8A% BD% E5% 87% BA.ipynb)

Obwohl es sich um ein kurzes Programm mit etwa 20 Zeilen handelt, dauert die Verarbeitung aufgrund der großen Datenmenge etwa 10 Minuten. Beachten Sie außerdem, dass die erstellte Datei etwa 800 MB groß und groß ist. Übrigens sind mehr als 90% Kopien von Artikel "Amateur Language Processing 100 Knock: 82".

import random

with open('./081.corpus.txt') as file_in, \
     open('./082.context.txt', mode='w') as file_out:
    for i, line in enumerate(file_in):
        tokens = line.strip.split(' ')
        for j in range(len(tokens)):
            d = random.randint(1, 5)        #Kontextbreite d
            
            #Aufzählung von Wörtern innerhalb von d vorher und nachher
            for k in range(max(j - d, 0), min(j + d + 1, len(tokens))):
                
                #Nicht für sich selbst ausgeben
                if j != k:
                    file_out.writelines(tokens[j]+'\t'+tokens[k]+'\n')
        if i < 4:
            print(len(tokens), tokens)
        else:
            print('\r Processding line: {0}'.format(i), end='')

Kommentar beantworten

Der folgende Code ist der Hauptteil. Es ist eine Schleife der Anzahl von Zielwörtern, deren Kontextbreite "d" von der Stelle "j" vergrößert oder verkleinert wird. Wenn Sie es jedoch einfach erhöhen oder verringern, ist das erste Wort eine negative Zahl, und das letzte Wort überschreitet die Gesamtzahl der Wörter. Verwenden Sie daher die Funktionen "max" und "min", um die Breite zu vergrößern. Ich nehme Anpassungen vor.

#Aufzählung von Wörtern innerhalb von d vorher und nachher
for k in range(max(j - d, 0), min(j + d + 1, len(tokens))):
                
    #Nicht für sich selbst ausgeben
    if j != k:
        file_out.writelines(tokens[j]+'\t'+tokens[k]+'\n')

Bis zur 4. Zeile werden die Anzahl der Zielwörter und der Verarbeitungszielsatz an die Konsole ausgegeben, und danach wird die Anzahl der verarbeiteten Zeilen ausgegeben.

if i < 4:
    print(len(tokens), tokens)
else:
    print('\r Processding line: {0}'.format(i), end='')

Verschütten (Token konnte nicht markiert werden)

Dies ist eine Fehlergeschichte über die Tokenisierung von Sätzen. Zuerst habe ich die "Split" -Funktion wie unten gezeigt verwendet, ohne zu viel nachzudenken.

tokens = line.split()

In einigen Fällen war das Ergebnis jedoch so, und ich bemerkte es mit einem Fehler, als ich später Pandas verwendete.

"b")("s"	"c
−	"b")("s"
−	"c

Es hätte so sein sollen. Auf den ersten Blick sieht es so aus, als ob es durch Leerzeichen getrennt ist, und \ xa0 wird für die raumähnlichen Teile verwendet. Über \ xa0 aus dem vorherigen Artikel Berührt ein wenig.

known	k" = √("s"("s" − "a")("s" − "b")("s" − "c

Um es richtig zu machen, habe ich die "Strip" -Funktion verwendet, um es mit nur einem Leerzeichen zu trennen.

tokens = line.strip.split(' ')

Recommended Posts

100 Sprachverarbeitung Knock-82 (Kontextwort): Kontextextraktion
100 Sprachverarbeitung Knock-51: Wortausschnitt
100 Sprachverarbeitung Knock-25: Vorlagenextraktion
Sprachverarbeitung 100 Knock-87: Wortähnlichkeit
100 Sprachverarbeitungsklopfen (2020): 28
Sprachverarbeitung 100 knock-86: Wortvektoranzeige
100 Sprachverarbeitung Knock-83 (mit Pandas): Messung der Wort- / Kontexthäufigkeit
100 Sprachverarbeitung Knock 2020 Kapitel 7: Word Vector
100 Sprachverarbeitungsklopfen (2020): 38
100 Sprachverarbeitung klopfen 00 ~ 02
100 Sprachverarbeitung Knock-84 (mit Pandas): Erstellen einer Wortkontextmatrix
100 Sprachverarbeitung klopfen 2020 [00 ~ 39 Antwort]
100 Sprachverarbeitung klopfen 2020 [00-79 Antwort]
100 Sprachverarbeitung klopfen 2020 [00 ~ 69 Antwort]
100 Sprachverarbeitung Knock 2020 Kapitel 1
100 Amateur-Sprachverarbeitungsklopfen: 17
100 Sprachverarbeitung Knock-52: Stemming
100 Sprachverarbeitung Knock Kapitel 1
100 Amateur-Sprachverarbeitungsklopfen: 07
100 Sprachverarbeitung Knock 2020 Kapitel 3
100 Sprachverarbeitung Knock 2020 Kapitel 2
100 Amateur-Sprachverarbeitungsklopfen: 09
100 Amateur-Sprachverarbeitungsklopfen: 47
100 Sprachverarbeitung Knock-53: Tokenisierung
100 Amateur-Sprachverarbeitungsklopfen: 97
100 Sprachverarbeitung klopfen 2020 [00 ~ 59 Antwort]
100 Amateur-Sprachverarbeitungsklopfen: 67
Sprachverarbeitung 100 Schläge-45: Extraktion von Verbfallmustern
100 Sprachverarbeitung Knock-72 (unter Verwendung von Stanford NLP): Identitätsextraktion
100 Sprachverarbeitungsklopfen mit Python 2015
100 Sprachverarbeitung Knock-57: Abhängigkeitsanalyse
100 Sprachverarbeitung Knock-50: Satzumbruch
100 Sprachverarbeitung Knock Kapitel 1 (Python)
100 Sprachverarbeitung Knock Kapitel 2 (Python)
Verarbeitung natürlicher Sprache 3 Wortkontinuität
Ich habe versucht, 100 Sprachverarbeitung klopfen 2020
100 Sprachverarbeitung Knock-56: Co-Referenz-Analyse
Lösen von 100 Sprachverarbeitungsklopfen 2020 (01. "Patatokukashi")
Verarbeitung natürlicher Sprache 2 Wortähnlichkeit
100 Amateur-Sprachverarbeitungsklopfen: Zusammenfassung
100 Sprachverarbeitung Knock-36 (unter Verwendung von Pandas): Häufigkeit des Auftretens von Wörtern
Sprachverarbeitung 100 Schläge-49: Extraktion von Abhängigkeitspfaden zwischen Nomenklatur
100 Sprachverarbeitung Knock 2020 Kapitel 2: UNIX-Befehle
100 Sprachverarbeitung Knock 2015 Kapitel 5 Abhängigkeitsanalyse (40-49)
100 Sprachverarbeitungsklopfen mit Python (Kapitel 1)
100 Sprachverarbeitung Knock Kapitel 1 in Python
100 Sprachverarbeitung Knock 2020 Kapitel 4: Morphologische Analyse
100 Sprachverarbeitung Knock-76 (mit Scicit-Learn): Beschriftung
100 Sprachverarbeitungsklopfen mit Python (Kapitel 3)
100 Sprachverarbeitungsklopfen: Kapitel 1 Vorbereitungsbewegung
100 Sprachverarbeitung Knock 2020 Kapitel 6: Maschinelles Lernen
100 Sprachverarbeitung Knock Kapitel 4: Morphologische Analyse
[Sprachverarbeitung 100 Schläge 2020] Kapitel 7: Wortvektor
100 Sprachverarbeitung Knock 2020 Kapitel 10: Maschinelle Übersetzung (90-98)
100 Sprachverarbeitung Knock 2020 Kapitel 5: Abhängigkeitsanalyse
100 Sprachverarbeitung Knock-28: Entfernen des MediaWiki-Markups
100 Sprachverarbeitung Knock 2020 Kapitel 8: Neuronales Netz
100 Sprachverarbeitung Knock-59: Analyse der S-Formel
Python-Anfänger versucht 100 Sprachverarbeitung klopfen 2015 (05 ~ 09)
Sprachverarbeitung 100 Knocks-31 (mit Pandas): Verben
100 Sprachverarbeitung klopfen 2020 "für Google Colaboratory"