[PYTHON] Traitement du langage 100 knocks-48: Extraction du chemin du nez à la racine

Traitement du langage 100 coups 2015 ["Chapitre 5: Analyse des dépendances"](http: //www.cl.ecei. Il s'agit d'un enregistrement de 48e "Extraction du chemin du nez à la racine" de tohoku.ac.jp/nlp100/#ch5). .. C'est un peu plus simple que le dernier coup. En effet, il n'y a pas autant de conditions et seul le contact est émis en continu.

Lien de référence

Lien Remarques
048.Extraction de chemins de la nomenclature aux racines.ipynb Lien GitHub du programme de réponse
100 coups de traitement du langage amateur:48 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é

Utilisez CaboCha pour traduire le texte du roman de Soseki Natsume "Je suis un chat" (neko.txt) 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.

48. Extraction du chemin du nez à la racine

Pour une clause contenant toute la nomenclature de la phrase, extrayez le chemin de cette clause jusqu'à la racine de l'arbre de syntaxe. Cependant, le chemin sur l'arbre de syntaxe doit satisfaire aux spécifications suivantes.

--Chaque clause est représentée par une séquence morphologique (superficielle) --Concaténer les expressions de chaque clause avec "->" de la clause de début à la clause de fin du chemin.

A partir de la phrase "J'ai vu un être humain pour la première fois ici" (8ème phrase de neko.txt.cabocha), le résultat suivant devrait être obtenu.

je suis->vu
ici->Commencer avec->Humain->Des choses->vu
Humain->Des choses->vu
Des choses->vu

Répondre

Programme de réponse [048. Extraction du chemin du nez vers root.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 / 048.% E5% 90% 8D% E8% A9% 9E% E3% 81% 8B% E3% 82% 89% E6 % A0% B9% E3% 81% B8% E3% 81% AE% E3% 83% 91% E3% 82% B9% E3% 81% AE% 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.dst  = dst  #Numéro d'index de la clause de contact
        
        self.phrase = ''
        self.noun = False
        
        for morph in morphs:
            if morph.pos != 'symbole':
                self.phrase += morph.surface #Pour les non-symboles
            if morph.pos == 'nom':
                self.noun = True

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.append(chunks)
            chunks = []

for i, sentence in enumerate(sentences):
    for chunk in sentence:
        if chunk.noun and chunk.dst != -1:
            line = chunk.phrase
            current_chunk = chunk
            while current_chunk.dst != -1:
                line = line + ' -> ' + sentence[current_chunk.dst].phrase
                current_chunk = sentence[current_chunk.dst]
            print(i, '\t',line)
    #Limité car il y en a beaucoup
    if i > 10:
        break

Répondre au commentaire

Classe de bloc

La classe Chunk est plus propre que la dernière fois. Il a un drapeau qui contient une nomenclature.

python


class Chunk:
    def __init__(self, morphs, dst):
        self.morphs = morphs
        self.dst  = dst  #Numéro d'index de la clause de contact
        
        self.phrase = ''
        self.noun = False
        
        for morph in morphs:
            if morph.pos != 'symbole':
                self.phrase += morph.surface #Pour les non-symboles
            if morph.pos == 'nom':
                self.noun = True

Section de sortie

Cela a été beaucoup plus simple depuis la dernière fois, mais c'est un peu plus compliqué avec la sortie ci-dessous. Lorsqu'il existe une dépendance incluant une nomenclature, la clause «while» connecte les segments à la fin de la dépendance.

python


for i, sentence in enumerate(sentences):
    for chunk in sentence:
        if chunk.noun and chunk.dst != -1:
            line = chunk.phrase
            current_chunk = chunk
            while current_chunk.dst != -1:
                line = line + ' -> ' + sentence[current_chunk.dst].phrase
                current_chunk = sentence[current_chunk.dst]
            print(i, '\t',line)
    #Limité car il y en a beaucoup
    if i > 10:
        break

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

Lorsque le programme est exécuté, les résultats suivants sont affichés.

Résultat de sortie


2 Le nom est->Non
3 où->Née->Katonto->Ne pas utiliser
3 Katonto->Ne pas utiliser
3 J'ai un indice->Ne pas utiliser
4 n'importe quoi->faible->En larmes->je me rappelle
4 à l'endroit->En larmes->je me rappelle
4 Seulement ce qui était là->je me rappelle
5 je suis->vu
5 ici->Commencer avec->Humain->Des choses->vu
5 humain->Des choses->vu
5 choses->vu
6 Plus tard->Quand tu entends->C'est tout
6 c'est->C'est tout
6 Appelé un étudiant->Chez l'homme->C'était une course->C'est tout
6 chez l'homme->C'était une course->C'est tout
6 Ichiban->Mal->C'était une course->C'est tout
6 mal->C'était une course->C'est tout
Était 6 courses->C'est tout
7 Un étudiant est->Est une histoire
7 nous->Capture->Ébullition->Manger->Est une histoire
8 À ce moment-là->Je n'ai pas->ne pensais pas
8 quoi->Pensées->Je n'ai pas->ne pensais pas
8 pensées->Je n'ai pas->ne pensais pas
9 son->Dans la paume->Être placé->Soulevé->Temps->doux->Sentiment->Juste réchauffé
9 dans la paume->Être placé->Soulevé->Temps->doux->Sentiment->Juste réchauffé
9 Sue->Soulevé->Temps->doux->Sentiment->Juste réchauffé
9 heures->doux->Sentiment->Juste réchauffé
9 Sentiment->Juste réchauffé
10 paumes->Au dessus de->calmez-vous->j'ai vu->Humain->De choses->Sera le début
Le 10->calmez-vous->j'ai vu->Humain->De choses->Sera le début
10 étudiants->Visage->j'ai vu->Humain->De choses->Sera le début
10 visages->j'ai vu->Humain->De choses->Sera le début
10 J'ai vu->Humain->De choses->Sera le début
10 humains->De choses->Sera le début
10 choses->Sera le début
11 heures->Si c'est une chose->pensée->Sentiment->Restant
11 étrange->Si c'est une chose->pensée->Sentiment->Restant
11 choses->pensée->Sentiment->Restant
11 Sentiment->Restant
11 Encore->Restant

Recommended Posts

Traitement du langage 100 knocks-48: Extraction du chemin du nez à la racine
Traitement du langage 100 knocks-49: Extraction de chemins de dépendances entre nomenclature
100 traitement de langue knock-22: Extraction du nom de la catégorie
Traitement du langage 100 knocks-46: Extraction des informations de trame de cas de verbe
[Chapitre 5] Introduction à Python avec 100 coups de traitement du langage
[Chapitre 6] Introduction à scicit-learn avec 100 coups de traitement du langage
[Chapitre 3] Introduction à Python avec 100 coups de traitement du langage
[Chapitre 2] Introduction à Python avec 100 coups de traitement du langage
[Chapitre 4] Introduction à Python avec 100 coups de traitement du langage
100 traitements linguistiques frappent 03 ~ 05
100 coups de traitement linguistique (2020): 40
100 coups de traitement linguistique (2020): 32
100 coups de traitement linguistique (2020): 35
100 coups de traitement linguistique (2020): 47
100 coups de traitement linguistique (2020): 39
100 coups de traitement linguistique (2020): 22
100 coups de traitement linguistique (2020): 26
100 coups de traitement linguistique (2020): 34
100 coups de traitement linguistique (2020): 42
100 coups de traitement linguistique (2020): 29
100 coups de traitement linguistique (2020): 49
Le traitement de 100 langues frappe 06 ~ 09
100 coups de traitement linguistique (2020): 43
100 coups de traitement linguistique (2020): 24
100 coups de traitement linguistique (2020): 45
100 coups de traitement linguistique (2020): 10-19
100 coups de traitement linguistique (2020): 30
100 coups de traitement linguistique (2020): 00-09
100 coups de traitement linguistique (2020): 31
100 coups de traitement linguistique (2020): 48
100 coups de traitement linguistique (2020): 44
100 coups de traitement linguistique (2020): 41
100 coups de traitement linguistique (2020): 37
100 coups de traitement linguistique (2020): 25
100 coups de traitement linguistique (2020): 23
100 coups de traitement linguistique (2020): 33
100 coups de traitement linguistique (2020): 20
100 coups de traitement linguistique (2020): 27
100 coups de traitement linguistique (2020): 46
100 coups de traitement linguistique (2020): 21
100 coups de traitement linguistique (2020): 36
Traitement du langage 100 knocks-45: Extraction de modèles de cas verbaux
J'ai essayé de résoudre la version 2020 de 100 problèmes de traitement du langage [Chapitre 3: Expressions régulières 20 à 24]
J'ai essayé de résoudre la version 2020 de 100 coups de traitement de langue [Chapitre 1: Mouvement préparatoire 00-04]
J'ai essayé de résoudre la version 2020 de 100 traitements linguistiques [Chapitre 1: Mouvement préparatoire 05-09]
100 coups de traitement du langage amateur: 41
100 coups de traitement du langage amateur: 71
100 coups de traitement du langage amateur: 56
100 coups de traitement du langage amateur: 24
100 coups de traitement du langage amateur: 50
100 coups de traitement du langage amateur: 59
100 coups de traitement du langage amateur: 70
100 coups de traitement du langage amateur: 62
100 coups de traitement du langage amateur: 60
100 coups de traitement du langage amateur: 92
100 coups de langue amateur: 30
100 coups de traitement du langage amateur: 84
100 coups de langue amateur: 33
100 coups de traitement du langage amateur: 46
100 coups de traitement du langage amateur: 88
100 coups de traitement du langage amateur: 89