Traitement du langage 100 coups 2015 ["Chapitre 5: Analyse des dépendances"](http: //www.cl.ecei. tohoku.ac.jp/nlp100/#ch5) [43e "Extraction de clauses contenant une nomenclature liée aux clauses contenant des verbes"](http://www.cl.ecei.tohoku.ac.jp/nlp100 / # sec43) Ceci est un record. Par rapport au coup précédent, il n'y a pas de grande différence simplement en ajoutant des conditions à la source et à la destination de sortie.
Lien | Remarques |
---|---|
043.Extraire les clauses contenant la nomenclature liée aux clauses contenant des verbes.ipynb | Lien GitHub du programme de réponse |
100 coups de traitement du langage amateur:43 | Copiez et collez la source de nombreuses pièces source |
Officiel de CaboCha | Page CaboCha à regarder en premier |
J'ai installé CRF ++ et CaboCha il y a trop longtemps et j'ai oublié comment les installer. Puisqu'il s'agit d'un package qui n'a pas du tout été mis à jour, nous n'avons pas reconstruit l'environnement. Je me souviens seulement d'avoir été frustré lorsque j'ai décidé d'utiliser CaboCha sous Windows. Je pense que je ne pourrais pas l'utiliser sur Windows 64 bits (j'ai une mémoire vague et peut-être qu'il y a un problème avec ma capacité technique).
type | version | Contenu |
---|---|---|
OS | Ubuntu18.04.01 LTS | Il fonctionne virtuellement |
pyenv | 1.2.16 | J'utilise pyenv car j'utilise parfois plusieurs environnements Python |
Python | 3.8.1 | python3 sur pyenv.8.J'utilise 1 Les packages sont gérés à l'aide de venv |
Mecab | 0.996-5 | apt-Installer avec get |
CRF++ | 0.58 | C'est trop vieux et j'ai oublié comment l'installer(Peut-êtremake install ) |
CaboCha | 0.69 | C'est trop vieux et j'ai oublié comment l'installer(Peut-êtremake install ) |
Appliquer l'analyseur de dépendances CaboCha à "Je suis un chat" et expérimenter le fonctionnement de l'arbre de dépendances et l'analyse syntaxique.
Classe, Analyse des dépendances, CaboCha, Clause, Dépendance, Cas, Syntaxe de verbe fonctionnel, Chemin de dépendance, [Graphviz](http: / /www.graphviz.org/)
Utilisation de CaboCha pour le texte (neko.txt) du roman de Natsume Soseki "Je suis un chat" Analysez la dépendance et enregistrez le résultat dans un fichier appelé neko.txt.cabocha. Utilisez ce fichier pour implémenter un programme qui répond aux questions suivantes.
Lorsque des clauses contenant une nomenclature se rapportent à des clauses contenant des verbes, extrayez-les au format délimité par des tabulations. Cependant, n'émettez pas de symboles tels que les signes de ponctuation.
import re
#Délimiteur
separator = re.compile('\t|,')
#Dépendance
dependancy = re.compile(r'''(?:\*\s\d+\s) #Non soumis à la capture
(-?\d+) #Nombres(Contact)
''', re.VERBOSE)
class Morph:
def __init__(self, line):
#Diviser par tabulation et virgule
cols = separator.split(line)
self.surface = cols[0] #Type de surface(surface)
self.base = cols[7] #Forme basique(base)
self.pos = cols[1] #Partie(pos)
self.pos1 = cols[2] #Sous-classification des paroles des parties 1(pos1)
class Chunk:
def __init__(self, morphs, dst):
self.morphs = morphs
self.srcs = [] #Liste des numéros d'index des clauses d'origine
self.dst = dst #Numéro d'index de la clause de contact
self.verb = False
self.noun = False
self.phrase = ''
for morph in morphs:
#Pour les non-symboles
if morph.pos != 'symbole':
self.phrase += morph.surface
if morph.pos == 'verbe':
self.verb = True
if morph.pos == 'nom':
self.noun = True
#Remplacez l'origine et ajoutez la liste Chunk à la liste d'instructions
def append_sentence(chunks, sentences):
#Remplacer l'entrepreneur
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)
#S'il ne s'agit pas d'EOS ou du résultat de l'analyse des dépendances
if not (line == 'EOS\n' or dependancies):
morphs.append(Morph(line))
#Lorsqu'il y a une analyse morphologique, le résultat de l'analyse EOS ou des dépendances
elif len(morphs) > 0:
chunks.append(Chunk(morphs, dst))
morphs = []
#En cas de dépendance résultat
if dependancies:
dst = int(dependancies.group(1))
#Lorsqu'il y a un résultat de dépendance dans 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))
#Limité car il y en a beaucoup
if i > 50:
break
J'ai changé la classe Chunk du coup précédent et défini dans la variable de classe si la clause inclut la nomenclature et les verbes. Puisque nous traitons dans la boucle for
, nous avons arrêté de créer la chaîne de phrase dans la notation d'inclusion de liste.
python
class Chunk:
def __init__(self, morphs, dst):
self.morphs = morphs
self.srcs = [] #Liste des numéros d'index des clauses d'origine
self.dst = dst #Numéro d'index de la clause de contact
self.verb = False
self.noun = False
self.phrase = ''
for morph in morphs:
#Pour les non-symboles
if morph.pos != 'symbole':
self.phrase += morph.surface
if morph.pos == 'verbe':
self.verb = True
if morph.pos == 'nom':
self.noun = True
Tout ce que vous avez à faire est de réduire la cible de sortie avec la branche conditionnelle de ʻif`.
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))
Lorsque le programme est exécuté, les résultats suivants sont affichés. Puisqu'il y en a beaucoup, seule une partie est sortie.
Résultat de sortie
Où est né
Je ne comprends pas
Je n'ai aucune idée
Pleurer là où tu as fait
Je me souviens seulement de ce que j'étais
j'ai vu
Pour la première fois ici
j'ai vu quelque chose
Je te demanderai plus tard
Attrapez-nous
Placé sur la paume
Sue a été soulevée
Quand moelleux
J'ai juste ressenti
Calme-toi sur
J'ai vu mon visage
Serait le début des choses
je croyais que c'était
Le sentiment demeure
Il reste encore
Doit être décoré avec les premiers cheveux
Le visage est glissant
Je me suis rencontré après ça
J'ai aussi rencontré un chat
Je me suis rencontré une fois
Le centre fait saillie
Souffler de l'intérieur
Souffler de la fumée
J'étais endolori et faible
Boire humaine
je le savais
Je le savais
Asseyez-vous derrière
Asseyez-vous dans votre coeur
J'ai commencé à conduire à grande vitesse
L'élève déménage-t-il?
Va-t-il bouger ou bougera-t-il
Vais-je seulement déménager?
Je ne sais pas si ça marche
Tourne tes yeux
Je me sens malade
Il y a un son
Hors de l'oeil
Le feu est sorti
Je me souviens jusque-là
Je me souviens mais je ne sais pas
Je ne connais pas le reste
Je ne sais pas
Remarquer
Il n'y a pas d'étudiant
Beaucoup de
Je ne peux pas voir mon frère
Je ne peux même pas en voir un seul
J'ai même caché ma mère
Je me cachais
Contrairement à l'endroit
Je ne peux pas ouvrir les yeux
J'étais abandonné
Il a été abandonné d'en haut
Il a été soudainement abandonné
Il a été abandonné à l'intérieur
Quand tu rampes avec tes pensées
Quand tu rampes hors de Sasahara
D'un autre côté
Il y a un étang
j'ai vu
Asseyez-vous devant
Ça n'a pas de sens
Je me demande si l'étudiant reviendra
Veux-tu venir me rencontrer
Fais-le avec miaou
Personne ne vient
Traverser l'étang
Le vent traverse
Prend un jour
C'est sombre
j'ai faim
Il a beaucoup diminué
Avec de la nourriture
Il y a jusqu'à
Prendre une décision
J'ai commencé à faire le tour de l'étang
Commencé à tourner vers la gauche
Supporter ça
Si vous le supportez et rampez
Si vous rampez de force
Il est sorti par la chose
Je suis allé à l'endroit
Si vous rampez ici
Takegaki s'est effondré
Je me suis faufilé à travers le trou
Je me suis faufilé dans la maison
Je suis peut-être mort de faim avec quelque chose.
Si Takegaki n'était pas déchiré
Je suis peut-être mort de faim
Je suis peut-être mort de faim sur le bord de la route.
Quelle était l'ombre
Il y a un trou
Jusqu'à aujourd'hui
je vais visiter
Visitez Mitsuge
C'est un passage
Bien que je me sois faufilé dans le manoir
Il fait noir dans ma maison
j'ai faim
Il va pleuvoir
Je ne pouvais pas le faire après avoir nettoyé
Je ne peux plus grâce
Aller vers
Aller vers
Penser à partir de maintenant
Le temps est passé
Ramper à l'intérieur
Je l'ai rencontré ici
j'ai rencontré
Devrait voir des humains
J'ai rencontré une opportunité
La première chose que j'ai rencontrée
Ceci est évincé
Vu de l'étudiant
Si vous le regardez
Quand je me vois
Attrape-le soudainement
Prenez le muscle cervical
Je me suis pressé à table
Recommended Posts