Sprachverarbeitung 100 Schläge 2015 ["Kapitel 5: Abhängigkeitsanalyse"](http: //www.cl.ecei. Dies ist die Aufzeichnung von 46. "Extraktion von Verbfallrahmeninformationen" von tohoku.ac.jp/nlp100/#ch5). Beim letzten Mal wurden nur die Hilfswörter ausgegeben, aber diesmal werden auch die Phrasen (jeder Frame) ausgegeben. Natürlich ist es noch schwieriger ...
Verknüpfung | Bemerkungen |
---|---|
046.Extraktion von Verb-Case-Frame-Informationen.ipynb | Antwortprogramm GitHub Link |
100 Klicks Amateur-Sprachverarbeitung:46 | Kopieren Sie die Quelle vieler Quellteile und fügen Sie sie ein |
CaboCha Beamter | CaboCha Seite zuerst anzuschauen |
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 ) |
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/)
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.
Ändern Sie das Programm> 45 und geben Sie den Begriff (die Klausel selbst in Bezug auf das Prädikat) in einem durch Tabulatoren getrennten Format aus, das dem Prädikat und dem Fallmuster folgt. Erfüllen Sie zusätzlich zu den 45 Spezifikationen die folgenden Spezifikationen.
- Der Begriff sollte eine Wortfolge der Klausel sein, die sich auf das Prädikat bezieht (das nachfolgende Verb muss nicht entfernt werden).
- Wenn es mehrere Klauseln gibt, die sich auf das Prädikat beziehen, ordnen Sie sie in derselben Norm und Reihenfolge wie die Hilfswörter 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.
Fang hier an Sehen Sie, was ich sehe
Wenn Sie interessiert sind, lesen Sie bitte Wikipedia "Kaku Grammatik". Sie können es lösen, ohne zu schauen. Ich verstehe es nicht nur durch einen Blick darauf.
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 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)
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 = ''
for morph in 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':
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)
def output_file(out_file, 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(chunk.verb, joshi, phrase)))
with open('./046.result_python.txt', 'w') as out_file:
for sentence in sentences:
for chunk in sentence:
if chunk.verb != '' and len(chunk.srcs) > 0:
output_file(out_file, sentence, chunk)
Immerhin wurde die Chunk-Klasse, die die Lebensader von Kapitel 5 darstellt, gegenüber der vorherigen Zeit geändert. Ich habe die Instanzvariable Phrase
erstellt und den Klauseltext eingefügt. Alles andere ist das gleiche.
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 = ''
for morph in 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':
self.verb = morph.base
if morph.pos == 'Partikel':
self.joshi = morph.base
Da es ziemlich kompliziert wurde, habe ich den Dateiausgabeteil als Funktion ausgeschnitten. Eine Liste von Hilfswörtern und -klauseln wird mit der ersten Listeneinschlussnotation erstellt und nach dem Sortieren mit der Funktion "join" ausgegeben.
python
def output_file(out_file, 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(chunk.verb, joshi, phrase)))
Wenn das Programm ausgeführt wird, werden die folgenden Ergebnisse ausgegeben (nur die ersten 10 Elemente).
bash:046.result_python.txt
Wo man geboren wird
Ich habe eine Ahnung
Wo ich geweint habe
Das einzige was ich geweint habe
Fang hier an
Sehen Sie, was ich sehe
Hör später zu
Fang uns
Kochen und fangen
Essen und kochen
Recommended Posts