[PYTHON] Sprachverarbeitung 100 Knocks-40: Lesen der Ergebnisse der Abhängigkeitsanalyse (Morphologie)

Sprachverarbeitung 100 Schläge 2015 ["Kapitel 5: Abhängigkeitsanalyse"](http: //www.cl.ecei. 40. "Lesen des Abhängigkeitsanalyseergebnisses (Morphologie)" Aufzeichnung von tohoku.ac.jp/nlp100/#ch5) ist. In Kapitel 5, das von nun an beginnt, ist es mühsam und zeitaufwändig, einen Algorithmus als Ganzes zu erstellen, und es fühlt sich wie das erste Dämonentor von 100 Sprachverarbeitungsklopfen an. Diesmal ist es wie eine vorbereitende Bewegung und es ist nicht sehr schwierig. Ist es bestenfalls brandneu, die Klasse zum ersten Mal mit 100 Schlägen zu benutzen?

Referenzlink

Verknüpfung Bemerkungen
040.Lesen des Abhängigkeitsanalyseergebnisses (Morphologie).ipynb Antwortprogramm GitHub Link
100 Klicks Amateur-Sprachverarbeitung:40 Kopieren Sie die Quelle vieler Quellteile und fügen Sie sie ein
CaboCha Beamter CaboCha Seite zuerst anzuschauen

Umgebung

Ich habe CRF ++ und CaboCha vor zu langer Zeit installiert und vergessen, wie man sie installiert. Da es sich um ein Paket handelt, das überhaupt nicht aktualisiert wurde, haben wir die Umgebung nicht neu erstellt. Ich erinnere mich nur, dass ich frustriert war, als ich mich für CaboCha unter Windows entschied. Ich glaube, ich konnte es unter 64-Bit-Windows nicht verwenden (ich habe einen vagen Speicher und möglicherweise liegt ein Problem mit meinen technischen Fähigkeiten vor).

Art Ausführung Inhalt
OS Ubuntu18.04.01 LTS Es läuft virtuell
pyenv 1.2.16 Ich benutze pyenv, weil ich manchmal mehrere Python-Umgebungen benutze
Python 3.8.1 python3 auf pyenv.8.Ich benutze 1
Pakete werden mit venv verwaltet
Mecab 0.996-5 apt-Installieren Sie mit get
CRF++ 0.58 Es ist zu alt und ich habe vergessen, wie man es installiert(Vielleichtmake install)
CaboCha 0.69 Es ist zu alt und ich habe vergessen, wie man es installiert(Vielleichtmake install)

Kapitel 5: Abhängigkeitsanalyse

Inhalt des Studiums

Wenden Sie den Abhängigkeitsanalysator CaboCha auf "Ich bin eine Katze" an und erleben Sie die Funktionsweise des Abhängigkeitsbaums und der syntaktischen Analyse.

Klasse, Abhängigkeitsanalyse, CaboCha, Klausel, Abhängigkeit, Groß- und Kleinschreibung, funktionale Verbsyntax, Abhängigkeitspfad, [Graphviz](http: / /www.graphviz.org/)

Inhalt anklopfen

Verwenden von CaboCha für den Text von Soseki Natsumes Roman "Ich bin eine Katze" (neko.txt) Analysieren Sie die Abhängigkeit und speichern Sie das Ergebnis in einer Datei namens neko.txt.cabocha. Verwenden Sie diese Datei, um ein Programm zu implementieren, das die folgenden Fragen beantwortet.

40. Lesen des Abhängigkeitsanalyseergebnisses (Morphologie)

Implementieren Sie die Klasse Morph, die die Morphologie darstellt. Diese Klasse hat eine Oberflächenform (Oberfläche), eine Basisform (Basis), ein Teilwort (pos) und eine Teilwortunterklassifikation 1 (pos1) als Elementvariablen. Lesen Sie außerdem das Analyseergebnis von CaboCha (neko.txt.cabocha), drücken Sie jeden Satz als Liste von Morph-Objekten aus und zeigen Sie die morphologische Elementzeichenfolge des dritten Satzes an.

Problemergänzung (über "Abhängigkeit")

"Abhängigkeit" ist eine Beziehung zwischen Klauseln. Ich habe im vorherigen Artikel "[Play] Synthetische Analyse von Shinkalions Tonne-Demo-Mail" ein wenig getan, aber auch mit diesem Dokument image.png

Sie können die Beziehung klären. image.png

Antworten

Antwort Prämisse

Führen Sie zunächst eine Abhängigkeitsanalyse mit CaboCha durch.

cabocha -f1 ../04.Morphologische Analyse/neko.txt -o neko.txt.cabocha

Das Ausführungsergebnis ist wie folgt. Abhängigkeitsinformationen werden zum Ergebnis von MeCab hinzugefügt. Der Teil von "* 0 -1D 0/0 0,000000" in der ersten Zeile ist die Abhängigkeitsinformation, das dritte Zeichen "0" ist die Segmentnummer und das nachfolgende "-1" gibt die Abhängigkeit an. Dieses Mal gibt es keinen Kontakt mit "-1", daher ist das Beispiel schlecht.

text:neko.txt.Teilauszug aus Cabocha


* 0 -1D 0/0 0.000000
Ein Substantiv,Nummer,*,*,*,*,einer,Ichi,Ichi
EOS
EOS
* 0 -1D 1/1 0.000000
Symbol,Leer,*,*,*,*, , , 
Ich bin eine Katze,Eigenname,Allgemeines,*,*,*,ich bin eine Katze,Wagahai Haneko Deal,Wagahai Waneko Deal
.. Symbol,Phrase,*,*,*,*,。,。,。
EOS
* 0 2D 0/1 -1.911675
Namensnomenklatur,Allgemeines,*,*,*,*,Name,Namae,Namae
Ist ein Assistent,Hilfe,*,*,*,*,Ist,C.,Beeindruckend
* 1 2D 0/0 -1.911675
Immer noch ein Zusatz,Hilfsanschluss,*,*,*,*,noch,Mada,Mada
* 2 -1D 0/0 0.000000
Kein Adjektiv,Unabhängigkeit,*,*,Apokalypse,Grundform,Nein,Nai,Nai
.. Symbol,Phrase,*,*,*,*,。,。,。
EOS
EOS
* 0 1D 1/2 1.504358
Symbol,Leer,*,*,*,*, , , 
Wo Nomen,Gleichbedeutend,Allgemeines,*,*,*,Wo,Doco,Doco
Hilfs,Fallassistent,Allgemeines,*,*,*,damit,De,De
* 1 2D 0/1 1.076607
Geborenes Verb,Unabhängigkeit,*,*,Ein Schritt,Kontinuierlicher Typ,Geboren,Umale,Umale
Hilfsverb,*,*,*,Besondere,Grundform,Ta,Ta,Ta
* 2 4D 0/1 -0.197109
Katon Substantiv,Allgemeines,*,*,*,*,Feuer,Katon,Katon
Und Hilfswörter,Fallassistent,Allgemeines,*,*,*,Wann,Zu,Zu
* 3 4D 0/1 -0.197109
Registrieren Sie die Nomenklatur,Verbindung ändern,*,*,*,*,Registrieren,Kentou,Kento
Ist ein Assistent,Fallassistent,Allgemeines,*,*,*,Aber,Ga,Ga
* 4 -1D 0/1 0.000000
Tsuka Verb,Unabhängigkeit,*,*,Fünf-Dan / Ka-Linie,Unvollkommene Form,Tsukuri,Tsuka,Tsuka
Nu Hilfsverb,*,*,*,Besondere,Grundform,Nu,Nu,Nu
.. Symbol,Phrase,*,*,*,*,。,。,。
EOS

Antwortprogramm [040. Ergebnisse der Abhängigkeitsanalyse lesen (Morphologie) .ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/05.%E4%BF%82%E3%82%8A%E5 % 8F% 97% E3% 81% 91% E8% A7% A3% E6% 9E% 90/040.% E4% BF% 82% E3% 82% 8A% E5% 8F% 97% E3% 81% 91% E8% A7% A3% E6% 9E% 90% E7% B5% 90% E6% 9E% 9C% E3% 81% AE% E8% AA% AD% E3% 81% BF% E8% BE% BC% E3% 81% BF (% E5% BD% A2% E6% 85% 8B% E7% B4% A0) .ipynb)

Dies ist also das Hauptprogramm von Python.

import re

morphs = []
sentences = []

#Trennzeichen
separator = re.compile('\t|,')

#Ausgeschlossene Zeilen
exclude = re.compile(r'''EOS\n      # EOS,Zeilenvorschubcode
                         |          # OR
                         \*\s\d+\s  # '*,Leer,Eine oder mehrere Nummern,Leer
                       ''', re.VERBOSE)

class Morph:
    def __init__(self, line):
        
        #Durch Tabulator und Komma teilen
        cols = separator.split(line)
        
        self.surface = cols[0] #Oberflächentyp(surface)
        self.base = cols[7]    #Grundform(base)
        self.pos = cols[1]     #Teil(pos)
        self.pos1 = cols[2]    #Teiltexte Unterklassifizierung 1(pos1)

with open('./neko.txt.cabocha') as f:
    
    for line in f:
        if not exclude.match(line):
            morphs.append(Morph(line))
        if   line == 'EOS\n' \
         and len(morphs) > 0:
            sentences.append(morphs)
            morphs = []

for sentence in sentences[2]:
    print(sentence.__dict__)

Kommentar beantworten

Reguläre Ausdrücke

Ich benutze die regulären Ausdrücke, die ich in Kapitel 2 gelernt habe, als Übung. Separator ist ein Trennzeichen für das Ergebnis der morphologischen Analyse, und exclude ist ein regulärer Ausdruck zum Ausschließen des Abhängigkeitsergebnisses mit EOS. Weitere Informationen zu regulären Ausdrücken finden Sie im Artikel "Grundlagen und Tipps für reguläre Python-Ausdrücke, die von Null gelernt wurden".

python


#Trennzeichen
separator = re.compile('\t|,')

#Ausgeschlossene Zeilen
exclude = re.compile(r'''EOS\n      # EOS,Zeilenvorschubcode
                         |          # OR
                         \*\s\d+\s  # '*,Leer,Eine oder mehrere Nummern,Leer
                       ''', re.VERBOSE)

Klasse

Dies ist die erste Klasse, die mit 100 Schlägen herauskommt. __init__ ist der Konstruktor, der zum ersten Mal aufgerufen wird. Die gesamte Zeile der morphologischen Analyseergebnisse wird empfangen und in Klassenvariablen gespeichert, die durch Tabulatoren / Kommas getrennt sind.

python


class Morph:
    def __init__(self, line):

        #Durch Tabulator und Komma teilen
        cols = separator.split(line)

        self.surface = cols[0] #Oberflächentyp(surface)
        self.base = cols[7]    #Grundform(base)
        self.pos = cols[1]     #Teil(pos)
        self.pos1 = cols[2]    #Teiltexte Unterklassifizierung 1(pos1)

Ausgabe von Klassenvariablen

Durch Setzen von __dict__ wird die Klassenvariable im Wörterbuchtyp ausgegeben. Ich wusste es nicht, aber es ist praktisch.

python


for sentence in sentences[2]:
    print(sentence.__dict__)

Ausgabeergebnis (Ausführungsergebnis)

Wenn das Programm ausgeführt wird, werden die folgenden Ergebnisse ausgegeben.

Ausgabeergebnis


{'surface': 'Name', 'base': 'Name', 'pos': 'Substantiv', 'pos1': 'Allgemeines'}
{'surface': 'Ist', 'base': 'Ist', 'pos': 'Partikel', 'pos1': '係Partikel'}
{'surface': 'noch', 'base': 'noch', 'pos': 'Adverb', 'pos1': 'Hilfsanschluss'}
{'surface': 'Nein', 'base': 'Nein', 'pos': 'Adjektiv', 'pos1': 'Unabhängigkeit'}
{'surface': '。', 'base': '。', 'pos': 'Symbol', 'pos1': 'Phrase'}

Recommended Posts

Sprachverarbeitung 100 Knocks-40: Lesen der Ergebnisse der Abhängigkeitsanalyse (Morphologie)
[Sprachverarbeitung 100 Schläge 2020] Kapitel 5: Abhängigkeitsanalyse
100 Sprachverarbeitung Knock-41: Lesen des Abhängigkeitsanalyseergebnisses (Phrase / Abhängigkeit)
100 Sprachverarbeitung Knock-57: Abhängigkeitsanalyse
100 Sprachverarbeitung Knock-30 (unter Verwendung von Pandas): Lesen der Ergebnisse der morphologischen Analyse
100 natürliche Sprachverarbeitung klopft Kapitel 5 Abhängigkeitsanalyse (zweite Hälfte)
100 natürliche Sprachverarbeitung klopft Kapitel 5 Abhängigkeitsanalyse (erste Hälfte)
100 Sprachverarbeitung Knock 2015 Kapitel 5 Abhängigkeitsanalyse (40-49)
100 Sprachverarbeitungsklopfen 2020: Kapitel 4 (morphologische Analyse)
100 Sprachverarbeitung Knock 2020 Kapitel 5: Abhängigkeitsanalyse
[Sprachverarbeitung 100 Schläge 2020] Kapitel 4: Morphologische Analyse
100 Sprachverarbeitungsklopfen 03 ~ 05
100 Sprachverarbeitungsklopfen (2020): 40
100 Sprachverarbeitungsklopfen (2020): 32
100 Sprachverarbeitungsklopfen (2020): 35
100 Sprachverarbeitungsklopfen (2020): 47
100 Sprachverarbeitungsklopfen (2020): 39
100 Sprachverarbeitungsklopfen (2020): 22
100 Sprachverarbeitungsklopfen (2020): 26
100 Sprachverarbeitungsklopfen (2020): 34
100 Sprachverarbeitungsklopfen (2020): 42
100 Sprachverarbeitungsklopfen (2020): 29
100 Sprachverarbeitungsklopfen (2020): 49
100 Sprachverarbeitungsklopfen 06 ~ 09
100 Sprachverarbeitungsklopfen (2020): 43
100 Sprachverarbeitungsklopfen (2020): 24
100 Sprachverarbeitungsklopfen (2020): 45
100 Sprachverarbeitungsklopfen (2020): 10-19
100 Sprachverarbeitungsklopfen (2020): 30
100 Sprachverarbeitungsklopfen (2020): 00-09
100 Sprachverarbeitungsklopfen (2020): 31
100 Sprachverarbeitungsklopfen (2020): 48
100 Sprachverarbeitungsklopfen (2020): 44
100 Sprachverarbeitungsklopfen (2020): 41
100 Sprachverarbeitungsklopfen (2020): 37
100 Sprachverarbeitungsklopfen (2020): 25
100 Sprachverarbeitungsklopfen (2020): 23
100 Sprachverarbeitungsklopfen (2020): 33
100 Sprachverarbeitungsklopfen (2020): 20
100 Sprachverarbeitungsklopfen (2020): 27
100 Sprachverarbeitungsklopfen (2020): 46
100 Sprachverarbeitungsklopfen (2020): 21
100 Sprachverarbeitungsklopfen (2020): 36
Sprachverarbeitung 100 Schläge Kapitel 4: Morphologische Analyse 31. Verben
100 Amateur-Sprachverarbeitungsklopfen: 41
100 Amateur-Sprachverarbeitungsklopfen: 71
100 Amateur-Sprachverarbeitungsklopfen: 56
100 Amateur-Sprachverarbeitungsklopfen: 24
100 Amateur-Sprachverarbeitungsklopfen: 59
100 Amateur-Sprachverarbeitungsklopfen: 70
100 Amateur-Sprachverarbeitungsklopfen: 62
100 Amateur-Sprachverarbeitungsklopfen: 60
100 Amateur-Sprachverarbeitungsklopfen: 92
100 Amateur-Sprachverarbeitungsklopfen: 30
100 Amateur-Sprachverarbeitungsklopfen: 06
100 Amateur-Sprachverarbeitungsklopfen: 84
100 Amateur-Sprachverarbeitungsklopfen: 81
100 Amateur-Sprachverarbeitungsklopfen: 33
100 Amateur-Sprachverarbeitungsklopfen: 46
100 Amateur-Sprachverarbeitungsklopfen: 88
100 Amateur-Sprachverarbeitungsklopfen: 89