[PYTHON] Sprachverarbeitung 100 Knocks-43: Extrahieren Sie Klauseln mit Nomenklatur in Bezug auf Klauseln mit Verben

Sprachverarbeitung 100 Schläge 2015 ["Kapitel 5: Abhängigkeitsanalyse"](http: //www.cl.ecei. tohoku.ac.jp/nlp100/#ch5) [43. "Extrahieren von Klauseln mit Nomenklatur in Bezug auf Klauseln mit Verben"](http://www.cl.ecei.tohoku.ac.jp/nlp100 / # sec43) Dies ist ein Datensatz. Im Vergleich zum vorherigen Klopfen gibt es keinen großen Unterschied, wenn nur der Ausgabequelle und dem Ausgabeziel Bedingungen hinzugefügt werden.

Referenzlink

Verknüpfung Bemerkungen
043.Extrahieren Sie Klauseln mit Nomenklaturen in Bezug auf Klauseln mit Verben.ipynb Antwortprogramm GitHub Link
100 Klicks Amateur-Sprachverarbeitung:43 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.

43. Klauseln mit Nomenklatur extrahieren, die sich auf Klauseln mit Verben beziehen

Wenn sich Klauseln mit Nomenklatur auf Klauseln mit Verben beziehen, extrahieren Sie sie in tabulatorgetrennten Formaten. Geben Sie jedoch keine Symbole wie Satzzeichen aus.

Antworten

Antwortprogramm [043. Klauseln mit Nomenklatur extrahieren, die sich auf Klauseln mit verbs.ipynb beziehen](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 / 043.% E5% 90% 8D% E8% A9% 9E% E3% 82% 92% E5 % 90% AB% E3% 82% 80% E6% 96% 87% E7% AF% 80% E3% 81% 8C% E5% 8B% 95% E8% A9% 9E% E3% 82% 92% E5% 90 % AB% E3% 82% 80% E6% 96% 87% E7% AF% 80% E3% 81% AB% E4% BF% 82% E3% 82% 8B% E3% 82% 82% E3% 81% AE % E3% 82% 92% 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)

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.verb = False
        self.noun = False
        self.phrase = ''
        
        for morph in morphs:            
            #Für Nicht-Symbole
            if morph.pos != 'Symbol':
                self.phrase += morph.surface
            if morph.pos == 'Verb':
                self.verb = True
            if morph.pos == 'Substantiv':
                self.noun = True

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

for i, sentence in enumerate(sentences):
    for chunk in sentence:
        if chunk.dst != -1 and \
           chunk.noun and \
           sentence[chunk.dst].verb:
            print('{}\t{}'.format(chunk.phrase, sentence[chunk.dst].phrase))
    
    #Begrenzt, weil es viele gibt
    if i > 50:
        break

Kommentar beantworten

Enthält die Phrase Nomenklatur / Verben?

Ich habe die Chunk-Klasse gegenüber dem vorherigen Klopfen geändert und in der Klassenvariablen definiert, ob die Klausel Nomenklatur und Verben enthält. Da wir in einer for-Schleife arbeiten, haben wir die Erstellung der Phrasenzeichenfolge in der Listeneinschlussnotation gestoppt.

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 = False
        self.noun = False
        self.phrase = ''
        
        for morph in morphs:            
            #Für Nicht-Symbole
            if morph.pos != 'Symbol':
                self.phrase += morph.surface
            if morph.pos == 'Verb':
                self.verb = True
            if morph.pos == 'Substantiv':
                self.noun = True

Ausgabeabschnitt

Alles, was Sie tun müssen, ist, das Ausgabeziel mit dem bedingten Zweig "if" einzugrenzen.

python


for i, sentence in enumerate(sentences):
    for chunk in sentence:
        if chunk.dst != -1 and \
           chunk.noun and \
           sentence[chunk.dst].verb:
            print('{}\t{}'.format(chunk.phrase, sentence[chunk.dst].phrase))

Ausgabeergebnis (Ausführungsergebnis)

Wenn das Programm ausgeführt wird, werden die folgenden Ergebnisse ausgegeben. Da es viele gibt, wird nur ein Teil ausgegeben.

Ausgabeergebnis


Wo wurde geboren
Ich verstehe es nicht
Ich habe keine Ahnung
Weinen, wo du es getan hast
Ich erinnere mich nur an das, was ich war
ich sah
Zum ersten Mal hier
ich habe etwas gesehen
Ich werde dich später fragen
Fang uns
Auf die Handfläche gelegt
Sue wurde gehoben
Wenn flauschig
Ich habe mich einfach gefühlt
Beruhige dich
Ich habe mein Gesicht gesehen
Wäre der Anfang der Dinge
ich dachte es wäre
Das Gefühl bleibt
Es bleibt immer noch
Sollte mit den ersten Haaren dekoriert werden
Das Gesicht ist rutschig
Ich habe mich danach getroffen
Ich habe auch eine Katze getroffen
Ich habe mich einmal getroffen
Das Zentrum ragt heraus
Von innen blasen
Rauch blasen
Ich war wund und schwach
Menschliches Trinken
Ich wusste, dass
Ich wusste davon
Setz dich zurück
Setz dich in dein Herz
Ich fing an, mit hoher Geschwindigkeit zu fahren
Bewegt sich der Schüler?
Wird es sich bewegen oder wird es sich bewegen?
Werde nur ich umziehen
Ich weiß nicht, ob es funktioniert
Wende deine Augen
Mir ist schlecht
Es ist ein Geräusch zu hören
Aus dem Auge
Das Feuer kam heraus
Ich erinnere mich bis dahin
Ich erinnere mich, aber ich weiß es nicht
Ich kenne den Rest nicht
Ich weiß es nicht
Beachten
Es gibt keinen Studenten
Viele
Ich kann meinen Bruder nicht sehen
Ich kann nicht einmal einen sehen
Ich habe sogar meine Mutter versteckt
Ich habe mich versteckt
Im Gegensatz zu dem Ort
Ich kann meine Augen nicht öffnen
Ich wurde verlassen
Es wurde von oben verlassen
Es wurde plötzlich aufgegeben
Es wurde innen verlassen
Wenn du mit deinen Gedanken herauskriechst
Wenn du aus Sasahara kriechst
Auf der anderen Seite
Es gibt einen Teich
ich sah
Setz dich nach vorne
Es macht keinen Sinn
Ich frage mich, ob der Student wiederkommen wird
Kommst du mir entgegen?
Mach es mit Miau
Niemand kommt
Überqueren Sie den Teich
Der Wind kreuzt
Dauert einen Tag
Es ist dunkel
Ich bin hungrig
Es hat sehr abgenommen
Mit Essen
Es gibt bis zu
Triff eine Entscheidung
Begann um den Teich herumzugehen
Begann nach links abzubiegen
Ertrage das
Wenn Sie es ertragen und kriechen
Wenn Sie gewaltsam kriechen
Es kam durch das Ding heraus
Ich ging zu dem Ort
Wenn Sie hier kriechen
Takegaki brach zusammen
Ich schlich mich durch das Loch
Ich schlich mich ins Haus
Ich könnte mit etwas verhungert sein.
Wenn Takegaki nicht zerrissen wäre
Ich könnte verhungert sein
Ich bin vielleicht am Straßenrand verhungert.
Was war der Schatten?
Da ist ein Loch
Bis heute
ich werde besuchen
Besuchen Sie Mitsuge
Es ist eine Passage
Obwohl ich mich in die Villa geschlichen habe
In meinem Haus wird es dunkel
Ich bin hungrig
Es wird regnen
Ich konnte es nach dem Aufräumen nicht tun
Ich kann nicht mehr gnaden
Auf etwas zugehen
Auf etwas zugehen
Von nun an nachdenken
Die Zeit ist vergangen
Kriechen Sie hinein
Ich bin hier darauf gestoßen
Ich begegnete
Sollte Menschen sehen
Ich habe eine Gelegenheit gefunden
Das erste was ich getroffen habe
Dies wird herausgedrückt
Vom Schüler aus gesehen
Wenn du es dir ansiehst
Wenn ich mich sehe
Schnapp es dir plötzlich
Nimm den Halsmuskel
Ich drückte mich zum Tisch

Recommended Posts

Sprachverarbeitung 100 Knocks-43: Extrahieren Sie Klauseln mit Nomenklatur in Bezug auf Klauseln mit Verben
100 Sprachverarbeitungsklopfen (2020): 28
100 Sprachverarbeitungsklopfen (2020): 38
100 Sprachverarbeitung klopfen 00 ~ 02
Python unerfahrene Person versucht, 100 Sprachverarbeitung 14-16 zu klopfen
Python unerfahrene Person versucht, 100 Sprachverarbeitung 07-09 zu klopfen
Python unerfahrene Person versucht, 100 Sprachverarbeitung 10 ~ 13 zu klopfen
Python unerfahrene Person versucht, 100 Sprachverarbeitung 05-06 zu klopfen
Python unerfahrene Person versucht, 100 Sprachverarbeitung 00-04 zu klopfen
100 Sprachverarbeitung klopfen 2020 [00 ~ 69 Antwort]
100 Sprachverarbeitung Knock 2020 Kapitel 1
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-92 (mit Gensim): Anwendung auf Analogiedaten
Sprachverarbeitung 100 Schläge-49: Extraktion von Abhängigkeitspfaden zwischen Nomenklatur
100 Sprachverarbeitungsklopfen mit Python 2015
100 Sprachverarbeitung Knock-51: Wortausschnitt
Sprachverarbeitung 100 Schläge-48: Extraktion des Weges von der Nase zur Wurzel
100 Sprachverarbeitung Knock-58: Extraktion von Taple
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
Ich habe versucht, die Version 2020 mit 100 Sprachverarbeitung zu lösen [Kapitel 2: UNIX-Befehle 10-14]
Ich habe versucht, die Version 2020 mit 100 Sprachverarbeitung zu lösen [Kapitel 2: UNIX-Befehle 15-19]
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 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)