Sprachverarbeitung 100 Schläge 2015 ["Kapitel 5: Abhängigkeitsanalyse"](http: //www.cl.ecei. tohoku.ac.jp/nlp100/#ch5) 42. "Anzeige der Phrase der verantwortlichen Person und der verantwortlichen Person" Aufzeichnung ist. Da der Sachbearbeiter und die Sachbearbeiterklausel ausgegeben werden, fühlt es sich wie die tatsächliche Leistung des Sachbearbeiters an. Technisch gesehen ändert sich die Ausgabemethode jedoch ein wenig, sodass sie sich nicht wesentlich vom vorherigen Klopfen unterscheidet.
Verknüpfung | Bemerkungen |
---|---|
042.Anzeige der Phrase der verantwortlichen Person und der verantwortlichen Person.ipynb | Antwortprogramm GitHub Link |
100 Klicks Amateur-Sprachverarbeitung:42 | 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ß- / Kleinschreibung, funktionale Verbsyntax, Abhängigkeitspfad, [Graphviz](http: / /www.graphviz.org/)
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.
Extrahieren Sie den gesamten Text der ursprünglichen Klausel und der zugehörigen Klausel in tabulatorgetrenntem Format. Geben Sie jedoch keine Symbole wie Satzzeichen aus.
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 = ''.join([morph.surface for morph in morphs if morph.pos!= 'Symbol']) #Phrase
#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 si, sentence in enumerate(sentences):
print('-----', si, '-----')
for ci, chunk in enumerate(sentence):
if chunk.dst != -1:
print('{}:{}\t{}'.format(ci, chunk.phrase, sentence[chunk.dst].phrase))
#Begrenzt, weil es viele gibt
if si > 5:
break
Etwas anders als in der vorherigen Chunk-Klasse sind die Symbole von der Klausel ausgeschlossen.
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 = ''.join([morph.surface for morph in morphs if morph.pos!= 'Symbol']) #Phrase
"Text ist tabulatorgetrenntes Format" ist wie tabulatorgetrennter Text, aber ich sehe ihn nicht, selbst wenn alles angezeigt wird, und es ist einfacher zu erkennen, ob es einen Satztrenner gibt, also interpretiere ich ihn willkürlich und gebe den Tabulator mit "print" aus.
python
for si, sentence in enumerate(sentences):
print('-----', si, '-----')
for ci, chunk in enumerate(sentence):
if chunk.dst != -1:
print('{}:{}\t{}'.format(ci, chunk.phrase, sentence[chunk.dst].phrase))
#Begrenzt, weil es viele gibt
if si > 5:
break
Wenn das Programm ausgeführt wird, wird das folgende Ergebnis ausgegeben (es werden nur 6 Sätze ausgegeben).
Ausgabeergebnis
----- 0 -----
----- 1 -----
----- 2 -----
0:Kein Name
1:Noch nicht
----- 3 -----
0:Wo wurde geboren
1:Geboren
2:Ich verstehe es nicht
3:Ich habe keine Ahnung
----- 4 -----
0:Alles dunkel
1:Trübes Weinen
2:Feucht und weinend
3:Weinen, wo du es getan hast
4:Miau miau weinen
5:Ich weine und erinnere mich
6:Ich erinnere mich nur an das, was ich war
----- 5 -----
0:ich sah
1:Zum ersten Mal hier
2:Zum ersten Mal Mensch genannt
3:Menschen
4:ich habe etwas gesehen
----- 6 -----
0:Und das stimmt
1:Ich werde dich später fragen
2:das habe ich gehört
3:Korrekt
4:Im Menschen Shosei genannt
5:War eine Rasse in Menschen
6:Das Schlechteste
7:War eine bösartige Rasse
8:Es scheint, dass es ein Rennen war
Recommended Posts