[PYTHON] Sprachverarbeitung 100 Schläge-45: Extraktion von Verbfallmustern

Sprachverarbeitung 100 Schläge 2015 ["Kapitel 5: Abhängigkeitsanalyse"](http: //www.cl.ecei. Dies ist die Aufzeichnung von 45. "Extraktion des Verbfallmusters" von tohoku.ac.jp/nlp100/#ch5). Die Anzahl der bedingten Verzweigungen von "if" hat ebenfalls zugenommen und wird immer komplizierter. Es ist etwas langweilig, über den Algorithmus nachzudenken.

Referenzlink

Verknüpfung Bemerkungen
045.Extraktion von Verbfallmustern.ipynb Antwortprogramm GitHub Link
100 Klicks Amateur-Sprachverarbeitung:45 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 habe nur eine frustrierte Erinnerung daran, wie ich versucht habe, CaboCha unter Windows zu verwenden. 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ß- / Kleinschreibung, funktionale Verbsyntax, Abhängigkeitspfad, [Graphviz](http: / /www.graphviz.org/)

Inhalt anklopfen

Verwenden von CaboCha für den Text (neko.txt) von Natsume Sosekis Roman "Ich bin eine Katze" 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.

45. Extraktion von Verbfallmustern

Ich möchte den diesmal verwendeten Satz als Korpus betrachten und die möglichen Fälle japanischer Prädikate untersuchen. Stellen Sie sich das Verb als Prädikat und das Hilfsverb der Phrase, die sich auf das Verb bezieht, als Fall vor und geben Sie das Prädikat und den Fall in einem durch Tabulatoren getrennten Format aus. Stellen Sie jedoch sicher, dass die Ausgabe den folgenden Spezifikationen entspricht.

  • In einer Klausel, die ein Verb enthält, wird die Grundform des Verbs ganz links als Prädikat verwendet.
  • Der Fall ist das Hilfswort, das sich auf das Prädikat bezieht
  • Wenn es mehrere Hilfswörter (Phrasen) gibt, die sich auf das Prädikat beziehen, ordnen Sie alle Hilfswörter in Wörterbuchreihenfolge an, die durch Leerzeichen getrennt sind.

Betrachten Sie den Beispielsatz (8. Satz von neko.txt.cabocha), dass "ich hier zum ersten Mal einen Menschen gesehen habe". Dieser Satz enthält zwei Verben, "begin" und "see", und die Phrase, die sich auf "begin" bezieht, wird als "here" analysiert, und die Phrase, die sich auf "see" bezieht, wird als "I am" und "thing" analysiert. Sollte die folgende Ausgabe erzeugen.

Am Anfang
Sehen

Speichern Sie die Ausgabe dieses Programms in einer Datei und überprüfen Sie die folgenden Elemente mit UNIX-Befehlen.

  • Kombination von Prädikaten und Fallmustern, die häufig im Korpus vorkommen
  • Das Fallmuster der Verben "do", "see" und "give" (in der Reihenfolge der Häufigkeit des Auftretens im Korpus anordnen)

Problemergänzung (über "Fall")

Ich bin mir dessen nicht besonders bewusst, um das Programm abzuschließen, aber das japanische Wort "case" scheint tief zu sein. Wenn Sie interessiert sind, schauen Sie sich [Wikipedit "Rate"] an (https://ja.wikipedia.org/wiki/%E6%A0%BC). Ich schaue es nur an. Ich erinnere mich, als ich in Australien einen Sprachaustausch machte, wurde ich gefragt, was der Unterschied zwischen "ha" und "ga" sei.

Antworten

Antwortprogramm [045. Extraktion von Verbfallmustern.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 / 045.% E5% 8B% 95% E8% A9% 9E% E3% 81% AE% E6% A0% BC% E3% 83 % 91% E3% 82% BF% E3% 83% BC% E3% 83% B3% E3% 81% AE% E6% 8A% BD% E5% 87% BA.ipynb)

import re

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

#Abhängigkeit
dependancy = re.compile(r'''(?:\*\s\d+\s) #Nicht erfassbar
                            (-?\d+)       #Zahlen(Kontakt)
                          ''', re.VERBOSE)

    def __init__(self, line):
        
        #Durch Tabulator und Komma geteilt
        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)

class Chunk:
    def __init__(self, morphs, dst):
        self.morphs = morphs
        self.srcs = []   #Liste der ursprünglichen Klauselindexnummern
        self.dst  = dst  #Indexnummer der Kontaktklausel
        
        self.verb = ''
        self.joshi = ''
        
        for morph in morphs:            
            if morph.pos != 'Symbol':
                self.joshi = ''  #Leer für Nicht-Symbole, um die letzte Zeile der Verben ohne Symbole abzurufen
            if morph.pos == 'Verb':
                self.verb = morph.base
            if morph.pos == 'Partikel':
                self.joshi = morph.base

#Ersetzen Sie den Ursprung und fügen Sie die Chunk-Liste zur Anweisungsliste hinzu
def append_sentence(chunks, sentences):
    
    #Ersetzen Sie den Unternehmer
    for i, chunk in enumerate(chunks):
        if chunk.dst != -1:
            chunks[chunk.dst].srcs.append(i)
    sentences.append(chunks)
    return sentences, []

morphs = []
chunks = []
sentences = []

with open('./neko.txt.cabocha') as f:
    
    for line in f:
        dependancies = dependancy.match(line)
        
        #Wenn es sich nicht um ein EOS- oder Abhängigkeitsanalyseergebnis handelt
        if not (line == 'EOS\n' or dependancies):
            morphs.append(Morph(line))
            
        #Wenn es ein morphologisches Analyseergebnis im EOS- oder Abhängigkeitsanalyseergebnis gibt
        elif len(morphs) > 0:
            chunks.append(Chunk(morphs, dst))
            morphs = []
       
        #Im Falle eines Abhängigkeitsergebnisses
        if dependancies:
            dst = int(dependancies.group(1))
        
        #Wenn es eine Abhängigkeit gibt, führt dies zu EOS
        if line == 'EOS\n' and len(chunks) > 0:
            sentences, chunks = append_sentence(chunks, sentences)

with open('./045.result_python.txt', 'w') as out_file:
    for sentence in sentences:
        for chunk in sentence:
            if chunk.verb != '' and len(chunk.srcs) > 0:
                
                #Erstellen Sie eine Liste der Angestellten
                sources = [sentence[source].joshi for source in chunk.srcs if sentence[source].joshi != '']
            
                if len(sources) > 0:
                    sources.sort()
                    out_file.write(('{}\t{}\n'.format(chunk.verb, ' '.join(sources))))

Das Folgende ist der UNIX-Befehlsteil. Ich habe den Befehl grep zum ersten Mal verwendet, aber es ist praktisch.

UNIX-Befehlsabschnitt


#Sortieren, Deduplizieren und Zählen, absteigende Sortierung
sort 045.result_python.txt | uniq --count | sort --numeric-sort --reverse > "045.result_1_alles.txt"

# 「(Zeilenanfang)Machen(Leer)Extrahieren, sortieren, deduplizieren und zählen, absteigende Sortierung
grep "^Machen\s" 045.result_python.txt | sort | uniq --count | sort --numeric-sort --reverse > "045.result_2_Machen.txt"

# 「(Zeilenanfang)sehen(Leer)Extrahieren, sortieren, deduplizieren und zählen, absteigende Sortierung
grep "^sehen\s" 045.result_python.txt | sort | uniq --count | sort --numeric-sort --reverse > "045.result_3_sehen.txt"

# 「(Zeilenanfang)geben(Leer)Extrahieren, sortieren, deduplizieren und zählen, absteigende Sortierung
grep "^geben\s" 045.result_python.txt | sort | uniq --count | sort --numeric-sort --reverse > "045.result_4_geben.txt"

Kommentar beantworten

Chunk-Klasse

Die Chunk-Klasse speichert die Prototypen von Verben und Hilfswörtern. Wenn eine Phrase mehrere Verben enthält, gewinnen wir die zweite. Der Fallassistent sollte am Ende der Phrase erscheinen, aber wir haben einen bedingten Zweig eingefügt, der das Symbol berücksichtigt.

python


class Chunk:
    def __init__(self, morphs, dst):
        self.morphs = morphs
        self.srcs = []   #Liste der ursprünglichen Klauselindexnummern
        self.dst  = dst  #Indexnummer der Kontaktklausel
        
        self.verb = ''
        self.joshi = ''
        
        for morph in morphs:            
            if morph.pos != 'Symbol':
                self.joshi = ''  #Leer für Nicht-Symbole, um die letzte Zeile der Verben ohne Symbole abzurufen
            if morph.pos == 'Verb':
                self.verb = morph.base
            if morph.pos == 'Partikel':
                self.joshi = morph.base

Ausgabeteil

Die ursprünglichen Hilfswörter werden in einer Listeneinschlussnotation aufgelistet und sortiert, um "In lexikalischer Reihenfolge anordnen" zu erfüllen. Und schließlich wird die Join-Funktion verwendet, um durch Leerzeichen getrennte Ausgaben auszugeben. Das Nest ist tief und ich fühle mich unwohl beim Schreiben.

python


with open('./045.result_python.txt', 'w') as out_file:
    for sentence in sentences:
        for chunk in sentence:
            if chunk.verb != '' and len(chunk.srcs) > 0:

                #Erstellen Sie eine Liste der Angestellten
                sources = [sentence[source].joshi for source in chunk.srcs if sentence[source].joshi != '']

                if len(sources) > 0:
                    sources.sort()
                    out_file.write(('{}\t{}\n'.format(chunk.verb, ' '.join(sources))))

Ausgabeergebnis (Ausführungsergebnis)

Wenn das Programm ausgeführt wird, werden die folgenden Ergebnisse ausgegeben. Da es viele gibt, werden hier nur 10 Zeilen angezeigt.

Python-Ausgabe

bash:045.result_python.txt(Erste 10 Zeilen)


Geboren werden
Tsukugato
Durch Weinen
Oder
Am Anfang
Sehen
Hör mal zu
Fangen
Kochen
Essen

UNIX-Befehlsausgabe

Da es viele gibt, werden hier nur 10 Zeilen angezeigt.

bash:045.result_1_alles.txt(Erste 10 Zeilen)


Es gibt 3176
1997 Tsukugato
800
721
464 zu sein
330
Ich denke
305 sehen
301
Bis es 262 gibt

bash:045.result_2_Machen.txt(Erste 10 Zeilen)


1099
651
221
109 Aber
Bis 86
59 Was ist
41
27 Was ist das?
Bis zu 24
18 as

bash:045.result_3_sehen.txt(Erste 10 Zeilen)


305 sehen
99 sehen
31 zu sehen
24 Sehen
19 vom Sehen
11 Sehen
7 Weil ich sehe
5 zu sehen
2 Während Sie zuschauen
2 Nur durch Schauen

"Geben" hat eine geringe Häufigkeit des Auftretens, und das ist alles.

bash:045.result_4_geben.txt


7 zu geben
4 zu geben
3 Was zu geben
Gib 1 aber gib
1 Wie zu geben
1 zu geben

Recommended Posts

Sprachverarbeitung 100 Schläge-45: Extraktion von Verbfallmustern
Sprachverarbeitung 100 Knocks-46: Extraktion von Verbfall-Frame-Informationen
100 Sprachverarbeitung Knock-32 (mit Pandas): Prototyp des Verbs
100 Sprachverarbeitung Knock-58: Extraktion von Taple
100 Sprachverarbeitung Knock-25: Vorlagenextraktion
Sprachverarbeitung 100 Schläge-49: Extraktion von Abhängigkeitspfaden zwischen Nomenklatur
100 Sprachverarbeitung Knock-55: Extraktion eindeutiger Ausdrücke
100 Sprachverarbeitung Knock-82 (Kontextwort): Kontextextraktion
100 Sprachverarbeitung Knock-59: Analyse der S-Formel
Sprachverarbeitung 100 Knocks-31 (mit Pandas): Verben
100 Sprachverarbeitungsklopfen (2020): 28
100 Sprachverarbeitungsklopfen (2020): 38
100 Sprachverarbeitung klopfen 00 ~ 02
100 Sprachverarbeitung Knock-91: Vorbereitung von Analogiedaten
Sprachverarbeitung 100 Knocks-44: Visualisierung abhängiger Bäume
100 Sprachverarbeitung Knock-22: Extraktion des Kategorienamens
Sprachverarbeitung 100 Knocks-47: Mining der funktionalen Verbsyntax
100 Sprachverarbeitung Knock-26: Entfernen von hervorgehobenem Markup
100 Sprachverarbeitung Knock-96 (unter Verwendung von Gensim): Extraktion des Vektors in Bezug auf den Ländernamen
100 Sprachverarbeitung klopfen 2020 [00 ~ 39 Antwort]
100 Sprachverarbeitung klopfen 2020 [00-79 Antwort]
100 Sprachverarbeitung klopfen 2020 [00 ~ 69 Antwort]
100 Amateur-Sprachverarbeitungsklopfen: 17
100 Sprachverarbeitung klopfen 2020 [00 ~ 49 Antwort]
100 Sprachverarbeitung Knock-52: Stemming
100 Sprachverarbeitung Knock Kapitel 1
100 Amateur-Sprachverarbeitungsklopfen: 07
100 Sprachverarbeitung Knock 2020 Kapitel 3
100 Sprachverarbeitung Knock-75 (mit Scicit-Learn): Gewicht der Identität
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
100 Sprachverarbeitung Knock-72 (unter Verwendung von Stanford NLP): Identitätsextraktion
100 Sprachverarbeitung Knock-36 (unter Verwendung von Pandas): Häufigkeit des Auftretens von Wörtern
Lernen Sie mit "Google Colaboratory" ganz einfach 100 Sprachverarbeitungsklopfen 2020.
100 Sprachverarbeitungsklopfen mit Python 2015
100 Sprachverarbeitung Knock-51: Wortausschnitt
100 Sprachverarbeitung Knock-57: Abhängigkeitsanalyse
100 Sprachverarbeitung Knock Kapitel 1 (Python)
100 Sprachverarbeitung Knock Kapitel 2 (Python)
Sprachverarbeitung 100 Knock-87: Wortähnlichkeit
Ich habe versucht, 100 Sprachverarbeitung klopfen 2020
100 Sprachverarbeitung Knock-56: Co-Referenz-Analyse
Lösen von 100 Sprachverarbeitungsklopfen 2020 (01. "Patatokukashi")
100 Amateur-Sprachverarbeitungsklopfen: Zusammenfassung
Sprachverarbeitung 100 Schläge-48: Extraktion des Weges von der Nase zur Wurzel
100 Sprachverarbeitung Knock-77 (mit Scicit-Learn): Messung der korrekten Antwortrate
100 Sprachverarbeitung Knock-42: Anzeige der Phrase der betroffenen Person und der betroffenen Person
Sprachverarbeitung 100 Knocks-29: Holen Sie sich die URL des Flaggenbildes
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 9: RNN, CNN
100 Sprachverarbeitung Knock-76 (mit Scicit-Learn): Beschriftung
Ich habe versucht, 100 Sprachverarbeitung klopfen 2020: Kapitel 3
100 Sprachverarbeitungsklopfen mit Python (Kapitel 3)
100 Sprachverarbeitung Knock 2020 Kapitel 6: Maschinelles Lernen