[PYTHON] Traitement du langage 100 knocks-43: Extraire les clauses contenant la nomenclature liée aux clauses contenant des verbes

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 de référence

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

environnement

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)

Chapitre 5: Analyse des dépendances

contenu de l'étude

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

Contenu frappé

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.

43. Extrait des clauses contenant la nomenclature relative aux clauses contenant des verbes

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.

Répondre

Programme de réponse [043. Extrait des clauses contenant la nomenclature liée aux clauses contenant verbs.ipynb](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

#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

Répondre au commentaire

L'expression comprend-elle une nomenclature / des verbes?

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

Section de sortie

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

Résultat de sortie (résultat de l'exécution)

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

Traitement du langage 100 knocks-43: Extraire les clauses contenant la nomenclature liée aux clauses contenant des verbes
100 coups de traitement linguistique (2020): 28
100 coups de traitement linguistique (2020): 38
100 traitement de la langue frapper 00 ~ 02
Une personne inexpérimentée en Python essaie de frapper 100 traitement du langage 14-16
Une personne inexpérimentée en Python essaie de frapper 100 traitement du langage 07-09
Une personne inexpérimentée en Python tente de frapper 100 traitement du langage 10 ~ 13
Une personne inexpérimentée en Python essaie de frapper 100 traitement du langage 05-06
Une personne inexpérimentée en Python essaie de frapper 100 traitement du langage 00-04
100 traitements linguistiques Knock 2020 [00 ~ 69 réponse]
100 Language Processing Knock 2020 Chapitre 1
100 traitements linguistiques Knock 2020 [00 ~ 49 réponse]
100 Traitement du langage Knock-52: Stemming
100 Traitement du langage Knock Chapitre 1
100 coups de langue amateur: 07
100 Language Processing Knock 2020 Chapitre 3
100 Language Processing Knock 2020 Chapitre 2
100 coups de traitement du langage amateur: 09
100 coups en traitement du langage amateur: 47
Traitement 100 langues knock-53: Tokenisation
100 coups de traitement du langage amateur: 97
100 traitements linguistiques Knock 2020 [00 ~ 59 réponse]
100 coups de traitement du langage amateur: 67
100 langage traitement knock-92 (utilisant Gensim): application aux données d'analogie
Traitement du langage 100 knocks-49: Extraction de chemins de dépendances entre nomenclature
100 coups de traitement du langage avec Python 2015
100 traitement du langage Knock-51: découpage de mots
Traitement du langage 100 knocks-48: Extraction du chemin du nez à la racine
100 Language Processing Knock-58: Extraction de Taple
100 traitement linguistique knock-50: coupure de phrase
100 Language Processing Knock Chapitre 1 (Python)
100 Language Processing Knock Chapitre 2 (Python)
100 Language Processing Knock-25: Extraction de modèles
Traitement du langage 100 Knock-87: similitude des mots
J'ai essayé 100 traitements linguistiques Knock 2020
100 Language Processing Knock-56: analyse de co-référence
Résolution de 100 traitements linguistiques Knock 2020 (01. "Patatokukashi")
100 coups de traitement du langage amateur: Résumé
J'ai essayé de résoudre 100 traitements linguistiques Knock 2020 version [Chapitre 2: Commandes UNIX 10 à 14]
J'ai essayé de résoudre 100 traitements linguistiques Knock 2020 version [Chapitre 2: Commandes UNIX 15-19]
100 Language Processing Knock 2020 Chapitre 2: Commandes UNIX
100 Language Processing Knock 2015 Chapitre 5 Analyse des dépendances (40-49)
100 traitements de langage avec Python
100 Language Processing Knock 2020 Chapitre 4: Analyse morphologique
100 Language Processing Knock 2020 Chapitre 9: RNN, CNN
100 traitement du langage knock-76 (en utilisant scicit-learn): étiquetage
100 Language Processing Knock-55: extraction d'expressions uniques
J'ai essayé 100 traitements linguistiques Knock 2020: Chapitre 3
100 Language Processing Knock-82 (mot de contexte): Extraction de contexte
100 traitements de langage avec Python (chapitre 3)
100 Language Processing Knock: Chapitre 1 Mouvement préparatoire
100 Language Processing Knock 2020 Chapitre 6: Apprentissage automatique
100 Traitement du langage Knock Chapitre 4: Analyse morphologique
Traitement du langage 100 knock-86: affichage vectoriel Word
100 Language Processing Knock 2020 Chapitre 10: Traduction automatique (90-98)
100 Language Processing Knock 2020 Chapitre 5: Analyse des dépendances
100 Language Processing Knock-28: Suppression du balisage MediaWiki
100 Traitement du langage Knock 2020 Chapitre 7: Vecteur de mots
100 Language Processing Knock 2020 Chapitre 8: Neural Net
100 traitement du langage knock-59: analyse de la formule S
Le débutant en Python a essayé 100 traitements de langage Knock 2015 (05 ~ 09)