[PYTHON] Sprachverarbeitung 100 Knocks-47: Mining der funktionalen Verbsyntax

Sprachverarbeitung 100 Schläge 2015 ["Kapitel 5: Abhängigkeitsanalyse"](http: //www.cl.ecei. Es ist eine Aufzeichnung von 47. "Minning of Functional Verb Syntax" von tohoku.ac.jp/nlp100/#ch5). Zusätzlich zum vorherigen Klopfen wird das Extraktionsziel zu komplizierteren Bedingungen. Es dauert ein wenig, um die Problemstellung zu verstehen, und natürlich braucht es Zeit, um sie zu lösen.

Referenzlink

Verknüpfung Bemerkungen
047.Functional Verb Syntax Mining.ipynb Antwortprogramm GitHub Link
100 Klicks Amateur-Sprachverarbeitung:47 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ß- / 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.

47. Mining der funktionalen Verbsyntax

Ich möchte nur auf den Fall achten, in dem das Verb wo case eine Sa-hen-Verbindungsnomenklatur enthält. Ändern Sie 46 Programme, um die folgenden Spezifikationen zu erfüllen.

  • Nur wenn die Phrase, die aus "Sahen-Verbindungsnomen + (Hilfsverb)" besteht, mit dem Verb zusammenhängt
  • Das Prädikat lautet "Sahen-Verbindungsnomen + ist die Grundform von + Verb", und wenn eine Phrase mehrere Verben enthält, wird das Verb ganz links verwendet.
  • 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.
  • Wenn das Prädikat mehrere Klauseln enthält, ordnen Sie alle durch Leerzeichen getrennten Begriffe an (richten Sie sie nach der Reihenfolge der Hilfswörter aus).

Zum Beispiel sollte die folgende Ausgabe aus dem Satz "Der Meister wird auf den Brief antworten, auch wenn er an einen anderen Ort kommt" erhalten werden.

Wenn ich auf den Brief antworte, mein Mann

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

--Predikate, die häufig im Korpus vorkommen (Sahen-Verbindungsnomenklatur + + Verb) --Predikate und Verbmuster, die häufig im Korpus vorkommen

Aufgabenergänzung (über "Funktionsverb")

Gemäß "Funktionsverb / zusammengesetztes Verb" lauten die Funktionsverben wie folgt. Mit anderen Worten, es ist bedeutungslos, es sei denn, es ist an eine Nomenklatur wie "tun" und "essen" gebunden.

Funktionsverben sind Verben, die ihre ursprüngliche Bedeutung verlieren und mit der Aktionsnomenklatur verknüpft sind, um die Bedeutung des Verbs darzustellen.

Antworten

Antwortprogramm [047. Funktionsverbsyntax Mining.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 / 047.% E6% A9% 9F% E8% 83% BD% E5% 8B% 95% E8% A9% 9E% E6% A7% 8B% E6% 96% 87% E3% 81% AE% E3% 83% 9E% E3% 82% A4% E3% 83% 8B% E3% 83% B3% E3% 82% B0.ipynb)

import re

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

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

class Morph:
    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.phrase = ''
        self.verb = ''
        self.joshi = ''
        self.sahen = '' #Sa seltsam+Zu+Ob es sich um ein Verbmusterziel handelt oder nicht
        
        for i, morph in enumerate(morphs):
            if morph.pos != 'Symbol':
                self.phrase += morph.surface #Für Nicht-Symbole
                self.joshi = ''  #Leer für Nicht-Symbole, um die letzte Zeile der Verben ohne Symbole abzurufen
            
            if morph.pos == 'Verb' and self.verb == '':
                self.verb = morph.base
            
            if morphs[-1].pos == 'Partikel':
                self.joshi = morphs[-1].base
                
            try:
                if morph.pos1 == 'Verbindung ändern' and \
                   morphs[i+1].surface == 'Zu':
                    self.sahen = morph.surface + morphs[i+1].surface
            except IndexError:
                pass

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

def output_file(out_file, sahen, sentence, chunk):
    #Erstellen Sie eine Liste der Angestellten
    sources = [[sentence[source].joshi, sentence[source].phrase] \
                for source in chunk.srcs if sentence[source].joshi != '']
    
    if len(sources) > 0:
        sources.sort()
        joshi = ' '.join([row[0] for row in sources])
        phrase = ' '.join([row[1] for row in sources])
        out_file.write(('{}\t{}\t{}\n'.format(sahen, joshi, phrase)))

with open('./047.result_python.txt', 'w') as out_file:
    for sentence in sentences:
        for chunk in sentence:
            
            if chunk.sahen != '' and \
               chunk.dst != -1 and \
               sentence[chunk.dst].verb != '':
                output_file(out_file, chunk.sahen+sentence[chunk.dst].verb, 
                            sentence, sentence[chunk.dst])
#Sortieren nach Prädikat, Deduplizierung und Sortieren nach Nummer
cut --fields=1 047.result_python.txt | sort | uniq --count \
| sort --numeric-sort --reverse > 047.result_unix1.txt

#Sortieren Sie nach Prädikaten und Hilfswörtern, entfernen Sie Duplikate und sortieren Sie nach der Anzahl der Fälle
cut --fields=1,2 047.result_python.txt | sort | uniq --count \
| sort --numeric-sort --reverse > 047.result_unix2.txt

Kommentar beantworten

Chunk-Klasse

Ändern Sie wie gewohnt die Lifeline-Chunk-Klasse. Wenn der Wert der Teilwort-Unterklassifizierung "pos1" "Verbindungsverbindung" ist und der nächste Eintrag "o" ist, wird die Instanzvariable "Folgen" mit einer verketteten Zeichenfolge eingegeben (Beispiel: reply +).

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.phrase = ''
        self.verb = ''
        self.joshi = ''
        self.sahen = '' #Sa seltsam+Zu+Ob es sich um ein Verbmusterziel handelt oder nicht
        
        for i, morph in enumerate(morphs):
            if morph.pos != 'Symbol':
                self.phrase += morph.surface #Für Nicht-Symbole
                self.joshi = ''  #Leer für Nicht-Symbole, um die letzte Zeile der Verben ohne Symbole abzurufen
            
            if morph.pos == 'Verb' and self.verb == '':
                self.verb = morph.base
            
            if morphs[-1].pos == 'Partikel':
                self.joshi = morphs[-1].base
                
            try:
                if morph.pos1 == 'Verbindung ändern' and \
                   morphs[i+1].surface == 'Zu':
                    self.sahen = morph.surface + morphs[i+1].surface
            except IndexError:
                pass

Ausgabeabschnitt

Der bedingte Zweig des Ausgabeabschnitts wird geändert.

python


with open('./047.result_python.txt', 'w') as out_file:
    for sentence in sentences:
        for chunk in sentence:
            
            if chunk.sahen != '' and \
               chunk.dst != -1 and \
               sentence[chunk.dst].verb != '':
                output_file(out_file, chunk.sahen+sentence[chunk.dst].verb, 
                            sentence, sentence[chunk.dst])

Ausgabeergebnis (Ausführungsergebnis)

Ergebnis der Python-Ausführung

Wenn Sie Python Script ausführen, wird das folgende Ergebnis ausgegeben.

text:047.result_python.txt(Nur die ersten 10)


Entscheide dich für eine Entscheidung
Eine Antwort geben, eine Antwort geben
Mach ein Nickerchen Mach ein Nickerchen
Er macht ein Nickerchen
Verfolgen und jagen Sie nach der Verfolgung
Ein Familienleben führen
Reden reden reden
Einen Brief an Totogisu schreiben
Manchmal reden, um zu reden
Eine Skizze machen

Ergebnis der Ausführung des UNIX-Befehls

Führen Sie einen UNIX-Befehl aus und geben Sie "Prädikate aus, die häufig im Korpus vorkommen (Sahen-Verbindungsnomen + + Verb)".

text:047.result_unix1.txt(Nur die ersten 10)


29 Antwort
21 Sag Hallo
16 reden
15 imitieren
13 Streit
9 Übung
9 Stellen Sie eine Frage
6 Seien Sie vorsichtig
6 Machen Sie ein Nickerchen
6 Stellen Sie Fragen

Führen Sie UNIX-Befehle aus und geben Sie "Prädikate und Zusatzmuster aus, die häufig im Korpus vorkommen".

text:047.result_unix2.txt(Nur die ersten 10)


14 Wenn Sie antworten
9 Übung
9 Machen Sie die Nachahmung
8 Was ist eine Antwort?
7 Kämpfe
6 Um zu reden
6 Wenn Sie Hallo sagen
5 zu reden
5 Um Hallo zu sagen
4 Stellen Sie eine Frage

Recommended Posts

Sprachverarbeitung 100 Knocks-47: Mining der funktionalen Verbsyntax
Sprachverarbeitung 100 Knocks-31 (mit Pandas): Verben
100 Sprachverarbeitungsklopfen (2020): 28
100 Sprachverarbeitungsklopfen (2020): 38
100 Sprachverarbeitung klopfen 00 ~ 02
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 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 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
100 Sprachverarbeitung Knock-32 (mit Pandas): Prototyp des Verbs
Sprachverarbeitung 100 Schläge-45: Extraktion von Verbfallmustern
100 Sprachverarbeitungsklopfen mit Python 2015
100 Sprachverarbeitung Knock-51: Wortausschnitt
100 Sprachverarbeitung Knock-58: Extraktion von Taple
100 Sprachverarbeitung Knock-57: Abhängigkeitsanalyse
100 Sprachverarbeitung Knock-50: Satzumbruch
100 Sprachverarbeitung Knock Kapitel 1 (Python)
100 Sprachverarbeitung Knock Kapitel 2 (Python)
100 Sprachverarbeitung Knock-25: Vorlagenextraktion
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
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 2020 Kapitel 9: RNN, CNN
100 Sprachverarbeitung Knock-76 (mit Scicit-Learn): Beschriftung
100 Sprachverarbeitung Knock-55: Extraktion eindeutiger Ausdrücke
Ich habe versucht, 100 Sprachverarbeitung klopfen 2020: Kapitel 3
100 Sprachverarbeitung Knock-82 (Kontextwort): Kontextextraktion
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 knock-86: Wortvektoranzeige
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 7: Word Vector
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)
100 Sprachverarbeitung klopfen 2020 "für Google Colaboratory"
Ich habe versucht, 100 Sprachverarbeitung klopfen 2020: Kapitel 1