Un enregistrement de la résolution des problèmes dans la première moitié du chapitre 5. Le fichier cible est neko.txt comme indiqué sur la page Web.
Utilisez CaboCha pour intercepter et analyser le texte (neko.txt) du roman de Natsume Soseki "Je suis un chat" et enregistrer le résultat dans un fichier appelé neko.txt.cabocha. Utilisez ce fichier pour implémenter un programme qui répond aux questions suivantes.
Implémentez la classe Morph qui représente la morphologie. Cette classe a une forme de surface (surface), une forme de base (base), une partie du discours (pos) et une sous-classification de partie du discours 1 (pos1) comme variables membres. En outre, lisez le résultat de l'analyse de CaboCha (neko.txt.cabocha), exprimez chaque phrase sous forme d'une liste d'objets Morph et affichez la chaîne d'éléments morphologiques de la troisième phrase.
# -*- coding: utf-8 -*-
__author__ = 'todoroki'
class Morph():
def __init__(self, surface, base, pos, pos1):
self.surface = surface
self.base = base
self.pos = pos
self.pos1 = pos1
def print_all(self):
return self.surface + "\t" + self.base + ", " + self.pos + ", " + self.pos1
def read_morpheme(cabochafile):
sentences = []
sentence = []
for line in cabochafile:
if line == "EOS\n":
# if len(sentence) > 0:
# sentences.append(sentence)
sentences.append(sentence)
sentence = []
elif line[0] == "*":
continue
else:
surface, other = line.split()
others = other.split(",")
base, pos, pos1 = others[6], others[0], others[1]
morph = Morph(surface, base, pos, pos1)
sentence.append(morph)
return sentences
if __name__ == "__main__":
f = open("neko.txt.cabocha", "r")
sentences = read_morpheme(f)
for morph in sentences[2]:
print morph.print_all()
f.close()
En plus de> 40, implémentez la classe de clause Chunk. Cette classe contient une liste d'éléments morph (objets Morph) (morphs), une liste de numéros d'index de clause associés (dst) et une liste de numéros d'index de clause d'origine (srcs) associés comme variables membres. De plus, lisez le résultat de l'analyse de CaboCha du texte d'entrée, exprimez une phrase sous forme d'une liste d'objets Chunk et affichez la chaîne de caractères et le contact de la phrase de la huitième phrase. Pour le reste des problèmes du chapitre 5, utilisez le programme créé ici.
# -*- coding: utf-8 -*-
__author__ = 'todoroki'
import problem40
class Chunk():
def __init__(self):
self.morphs = []
self.dst = -1
self.srcs = []
def __repr__(self):
if self.morphs:
surfs = [morph.surface for morph in self.morphs if morph.pos != 'symbole']
return "".join(surfs)
def include_pos(self, pos):
return pos in [morph.pos for morph in self.morphs]
def morphs_of_pos(self, pos):
return [morph for morph in self.morphs if morph.pos == pos]
def morphs_of_pos1(self, pos1):
return [morph for morph in self.morphs if morph.pos1 == pos1]
def read_chunk(cabochafile):
sentences = []
sentence = []
for line in cabochafile:
if line == "EOS\n":
for idx, c in enumerate(sentence[:-1]):
if c.dst != -1:
sentence[c.dst].srcs.append(idx)
# if len(sentence) > 1:
# sentences.append(sentence)
sentences.append(sentence)
sentence = []
elif line[0] == "*":
chunk = Chunk()
chunk.dst = int(line.split()[2].strip("D"))
sentence.append(chunk)
else:
surface, other = line.split()
others = other.split(",")
base, pos, pos1 = others[6], others[0], others[1]
morph = problem40.Morph(surface, base, pos, pos1)
sentence[-1].morphs.append(morph)
return sentences
if __name__ == "__main__":
f = open("neko.txt.cabocha", "r")
sentences = read_chunk(f)
for idx, chnk in enumerate(sentences[7]):
surfaces = ""
for mrph in chnk.morphs:
surfaces += mrph.surface
print "%d" % idx, surfaces, "=>", chnk.dst
f.close()
Extraire tout le texte de la clause originale et de la clause liée au format délimité par des tabulations. Cependant, n'émettez pas de symboles tels que des signes de ponctuation.
# -*- coding: utf-8 -*-
__author__ = 'todoroki'
import problem41
def make_chunk_pair(sentence):
pairs = []
for chunk in sentence:
if chunk.dst != -1:
pairs.append((chunk, sentence[chunk.dst]))
return pairs
if __name__ == "__main__":
f = open("neko.txt.cabocha")
sentences = problem41.read_chunk(f)
pair_sentences = []
for sentence in sentences:
pair = make_chunk_pair(sentence)
pair_sentences.append(pair)
for sentence in pair_sentences:
for pair in sentence:
print "\t".join([str(chunk) for chunk in pair])
f.close()
Lorsque des clauses contenant une nomenclature concernent des clauses contenant des verbes, extrayez-les au format délimité par des tabulations. Cependant, n'émettez pas de symboles tels que des signes de ponctuation.
# -*- coding: utf-8 -*-
__author__ = 'todoroki'
import problem41
import problem42
def findNtoV(chunk_pair):
flagN = False
flagV = False
if "nom" in [morph.pos for morph in chunk_pair[0].morphs]:
flagN = True
if "verbe" in [morph.pos for morph in chunk_pair[1].morphs]:
flagV = True
return flagN and flagV
if __name__ == "__main__":
f = open("neko.txt.cabocha", "r")
sentences = problem41.read_chunk(f)
pair_sentences = []
for sentence in sentences:
pair = problem42.make_chunk_pair(sentence)
pair_sentences.append(pair)
pairs_NtoV = []
for pair_sentence in pair_sentences:
for chunk_pair in pair_sentence:
if findNtoV(chunk_pair):
pairs_NtoV.append(chunk_pair)
for pair_NtoV in pairs_NtoV:
noun, verb = pair_NtoV
print "%s\t%s" % (noun, verb)
f.close()
Visualisez l'arbre de dépendance d'une phrase donnée sous forme de graphe orienté. Pour la visualisation, il est conseillé de convertir l'arborescence de dépendances dans le langage DOT et d'utiliser Graphviz. De plus, pour visualiser des graphiques dirigés directement à partir de Python, utilisez pydot.
# -*- coding: utf-8 -*-
__author__ = 'todoroki'
import problem41
import problem42
def sentenceToDot(idx, sentence):
head = "digraph sentence{0} ".format(idx)
body_head = "{ graph [rankdir = LR]; "
body = ""
for chunk_pair in sentence:
former, latter = chunk_pair
body += ('"'+str(former)+'"->"'+str(latter)+'"; ')
dotString = head + body_head + body + '}'
return dotString
if __name__ == "__main__":
f = open("neko.txt.cabocha", "r")
sentences = problem41.read_chunk(f)
pair_sentences = []
for sentence in sentences:
pair = problem42.make_chunk_pair(sentence)
pair_sentences.append(pair)
# dotStrings = []
for idx, sentence in enumerate(pair_sentences):
dotString = sentenceToDot(idx, sentence)
print dotString
# dotStrings.append(dotString)
f.close()