[PYTHON] 100 traitement du langage knock-41: lecture du résultat de l'analyse des dépendances (phrase / dépendance)

Traitement du langage 100 coups 2015 ["Chapitre 5: Analyse des dépendances"](http: //www.cl.ecei. tohoku.ac.jp/nlp100/#ch5) [41e "Lecture du résultat de l'analyse des dépendances (phrase / dépendance)"](http://www.cl.ecei.tohoku.ac.jp/nlp100/# sec41) Ceci est un record. La dernière fois, c'était le contenu du mouvement préparatoire, donc à partir de ce moment, c'est la performance réelle de la dépendance. Dans l'ensemble, le chapitre 5 n'est pas un code court qui utilise des packages comme dans le chapitre 4, "Analyse morphologique", et nous devons créer un algorithme. Cette fois, ce n'est pas si compliqué, mais cela me fait encore réfléchir dans une certaine mesure.

Lien de référence

Lien Remarques
041.Lecture du résultat de l'analyse des dépendances(Phrase / dépendance).ipynb Lien GitHub du programme de réponse
100 coups de traitement du langage amateur:41 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.

41. Lecture du résultat de l'analyse des dépendances (phrase / dépendance)

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.

Répondre

Programme de réponse [041. Lecture des résultats de l'analyse des dépendances (phrase / dépendance) .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 / 041.% E4% BF% 82% E3% 82% 8A% E5% 8F% 97% E3% 81 % 91% E8% A7% A3% E6% 9E% 90% E7% B5% 90% E6% 9E% 9C% E3% 81% AE% E8% AA% AD% E3% 81% BF% E8% BE% BC % E3% 81% BF (% E6% 96% 87% E7% AF% 80% E3% 83% BB% E4% BF% 82% E3% 82% 8A% E5% 8F% 97% E3% 81% 91) .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.phrase = ''.join([morph.surface for morph in morphs]) #Phrase

#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, chunk in enumerate(sentences[7]):
    print('{}: {},Contact:{},Personne en charge:{}'.format(i, chunk.phrase, chunk.dst, chunk.srcs))

Répondre au commentaire

Expression régulière pour obtenir un contact

J'utilise une expression régulière qui peut obtenir le contact. (-? \ D +) est la partie pour obtenir le numéro de la destination. Pour plus d'informations sur les expressions régulières, consultez l'article "Notions de base et astuces pour les expressions régulières Python apprises à partir de zéro". Je pense que vous pouvez l'obtenir sans utiliser d'expressions régulières, mais je l'utilise pour la pratique.

python


#Dépendance
dependancy = re.compile(r'''(?:\*\s\d+\s) #Non soumis à la capture
                            (-?\d+)       #Nombres(Contact)
                          ''', re.VERBOSE)

Classe de bloc

Il définit également une variable appelée «phrase» qui n'est pas spécifiée pour frapper. C'est pratique lorsque vous le sortez plus tard. srcs est uniquement défini et __init __ n'affecte pas de valeurs.

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.phrase = ''.join([morph.surface for morph in morphs]) #Phrase

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


0:cette,Contact:1,Personne en charge:[]
1:Un étudiant est,Contact:7,Personne en charge:[0]
2:quelquefois,Contact:4,Personne en charge:[]
3:Nous,Contact:4,Personne en charge:[]
4:Capture,Contact:5,Personne en charge:[2, 3]
5:Ébullition,Contact:6,Personne en charge:[4]
6:Manger,Contact:7,Personne en charge:[5]
7:C'est une histoire.,Contact:-1,Personne en charge:[1, 6]

Recommended Posts

100 traitement du langage knock-41: lecture du résultat de l'analyse des dépendances (phrase / dépendance)
Traitement du langage 100 knocks-40: lecture des résultats de l'analyse des dépendances (morphologie)
100 Language Processing Knock-57: Analyse des dépendances
100 Language Processing Knock-30 (en utilisant des pandas): lecture des résultats de l'analyse morphologique
100 Language Processing Knock 2015 Chapitre 5 Analyse des dépendances (40-49)
100 Language Processing Knock 2020 Chapitre 5: Analyse des dépendances
100 coups de traitement linguistique (2020): 38
100 traitement de la langue frapper 00 ~ 02
100 traitements linguistiques Knock 2020 [00 ~ 39 réponse]
100 langues de traitement knock 2020 [00-79 réponse]
100 traitements linguistiques Knock 2020 [00 ~ 69 réponse]
100 Language Processing Knock 2020 Chapitre 1
100 coups de traitement du langage amateur: 17
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 langage de traitement knock-20 (à l'aide de pandas): lecture de données JSON
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
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
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é
100 traitement de la langue knock-42: Affichage de la phrase de la personne concernée et de la personne concernée
100 Language Processing Knock 2020 Chapitre 2: Commandes UNIX
100 traitements de langage avec Python
100 Language Processing Knock Chapitre 1 en Python
100 Language Processing Knock 2020 Chapitre 4: Analyse morphologique
100 Language Processing Knock 2020 Chapitre 9: RNN, CNN
[Traitement du langage 100 coups 2020] Chapitre 5: Analyse des dépendances
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-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)