[PYTHON] Traitement du langage 100 knocks-40: lecture des résultats de l'analyse des dépendances (morphologie)

Traitement du langage 100 coups 2015 ["Chapitre 5: Analyse des dépendances"](http: //www.cl.ecei. 40e "Lecture du résultat de l'analyse des dépendances (morphologie)" enregistrement de tohoku.ac.jp/nlp100/#ch5) est. Dans le chapitre 5, qui commence à partir de maintenant, il est fastidieux et chronophage de construire un algorithme dans son ensemble, et on a l'impression que la première porte démon de 100 coups de traitement du langage. Cette fois, c'est comme un mouvement préparatoire et ce n'est pas très difficile. Est-ce tout nouveau, au mieux, d'utiliser la classe pour la première fois avec 100 coups?

Lien de référence

Lien Remarques
040.Lecture du résultat de l'analyse des dépendances (morphologie).ipynb Lien GitHub du programme de réponse
100 coups de traitement du langage amateur:40 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 n'ai qu'un souvenir frustré d'essayer 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 des verbes fonctionnels, Chemin des dépendances, [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.

40. Lecture du résultat de l'analyse des dépendances (morphologie)

Implémentez la classe Morph qui représente la morphologie. Cette classe a une forme de surface (surface), une forme de base (base), un mot de partie (pos) et une sous-classification de mot de partie 1 (pos1) en tant que variables membres. De plus, 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.

Supplément de problème (à propos de la "dépendance")

La «dépendance» est une relation entre des clauses. J'ai fait un peu dans l'article précédent "[Play] Analyse synthétique du mail démo de Shinkalion", mais même avec ce document image.png

Vous pouvez clarifier la relation. image.png

Répondre

Réponse prémisse

Tout d'abord, effectuez une analyse des dépendances avec CaboCha.

cabocha -f1 ../04.Analyse morphologique/neko.txt -o neko.txt.cabocha

Le résultat de l'exécution est le suivant. Les informations de dépendance sont ajoutées au résultat de MeCab. La partie de «* 0 -1D 0/0 0,000000» sur la première ligne est l'information de dépendance, le troisième caractère «0» est le numéro de segment et le «-1» suivant indique la dépendance. Cette fois, il n'y a pas de contact avec «-1», donc l'exemple est mauvais.

text:neko.txt.Extrait partiel de cabocha


* 0 -1D 0/0 0.000000
Un nom,nombre,*,*,*,*,un,Ichi,Ichi
EOS
EOS
* 0 -1D 1/1 0.000000
symbole,Vide,*,*,*,*, , , 
je suis un chat,Nomenclature propriétaire,Général,*,*,*,je suis un chat,Offre Wagahai Haneko,Offre Wagahai Waneko
.. symbole,Phrase,*,*,*,*,。,。,。
EOS
* 0 2D 0/1 -1.911675
Nomenclature des noms,Général,*,*,*,*,Nom,Namae,Namae
Est un assistant,Assistance,*,*,*,*,Est,C,sensationnel
* 1 2D 0/0 -1.911675
Encore un complément,Connexion auxiliaire,*,*,*,*,encore,Mada,Mada
* 2 -1D 0/0 0.000000
Pas d'adjectif,Indépendance,*,*,apocalypse,Forme basique,Non,Nai,Nai
.. symbole,Phrase,*,*,*,*,。,。,。
EOS
EOS
* 0 1D 1/2 1.504358
symbole,Vide,*,*,*,*, , , 
Où nom,Synonyme,Général,*,*,*,Où,Doco,Doco
Auxiliaire,Assistant de cas,Général,*,*,*,alors,De,De
* 1 2D 0/1 1.076607
Verbe né,Indépendance,*,*,Un pas,Type continu,Être né,Umale,Umale
Verbe auxiliaire,*,*,*,Spécial,Forme basique,Ta,Ta,Ta
* 2 4D 0/1 -0.197109
Katon substantif,Général,*,*,*,*,Feu,Katon,Katon
Et des mots auxiliaires,Assistant de cas,Général,*,*,*,Quand,À,À
* 3 4D 0/1 -0.197109
Enregistrer la nomenclature,Changer de connexion,*,*,*,*,S'inscrire,Kentou,Kento
Est un assistant,Assistant de cas,Général,*,*,*,Mais,Géorgie,Géorgie
* 4 -1D 0/1 0.000000
Verbe tsuka,Indépendance,*,*,Ligne Five-Dan / Ka,Forme imparfaite,Tsukuri,Tsuka,Tsuka
Nu verbe auxiliaire,*,*,*,Spécial,Forme basique,Nu,Nu,Nu
.. symbole,Phrase,*,*,*,*,。,。,。
EOS

Programme de réponse [040. Lecture des résultats de l'analyse des dépendances (morphologie) .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 / 040.% 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 (% E5% BD% A2% E6% 85% 8B% E7% B4% A0) .ipynb)

Donc, c'est le programme Python principal.

import re

morphs = []
sentences = []

#Délimiteur
separator = re.compile('\t|,')

#Lignes exclues
exclude = re.compile(r'''EOS\n      # EOS,Code de saut de ligne
                         |          # OR
                         \*\s\d+\s  # '*,Vide,Un ou plusieurs numéros,Vide
                       ''', 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)

with open('./neko.txt.cabocha') as f:
    
    for line in f:
        if not exclude.match(line):
            morphs.append(Morph(line))
        if   line == 'EOS\n' \
         and len(morphs) > 0:
            sentences.append(morphs)
            morphs = []

for sentence in sentences[2]:
    print(sentence.__dict__)

Répondre au commentaire

Expressions régulières

J'utilise les expressions régulières que j'ai apprises au chapitre 2 comme pratique. separator est un délimiteur pour le résultat de l'analyse morphologique, et ʻexclude` est une expression régulière pour exclure le résultat de la dépendance avec EOS. 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".

python


#Délimiteur
separator = re.compile('\t|,')

#Lignes exclues
exclude = re.compile(r'''EOS\n      # EOS,Code de saut de ligne
                         |          # OR
                         \*\s\d+\s  # '*,Vide,Un ou plusieurs numéros,Vide
                       ''', re.VERBOSE)

classe

C'est la première classe à sortir avec 100 coups. __init__ est le constructeur appelé la première fois. La ligne entière des résultats de l'analyse morphologique est reçue et stockée dans des variables de classe séparées par des tabulations / virgules.

python


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)

Sortie des variables de classe

En définissant __dict__, la variable de classe sera sortie dans le type dictionnaire. Je ne le savais pas, mais c'est pratique.

python


for sentence in sentences[2]:
    print(sentence.__dict__)

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


{'surface': 'Nom', 'base': 'Nom', 'pos': 'nom', 'pos1': 'Général'}
{'surface': 'Est', 'base': 'Est', 'pos': 'Particule', 'pos1': '係Particule'}
{'surface': 'encore', 'base': 'encore', 'pos': 'adverbe', 'pos1': 'Connexion auxiliaire'}
{'surface': 'Non', 'base': 'Non', 'pos': 'adjectif', 'pos1': 'Indépendance'}
{'surface': '。', 'base': '。', 'pos': 'symbole', 'pos1': 'Phrase'}

Recommended Posts

Traitement du langage 100 knocks-40: lecture des résultats de l'analyse des dépendances (morphologie)
[Traitement du langage 100 coups 2020] Chapitre 5: Analyse des dépendances
100 traitement du langage knock-41: lecture du résultat de l'analyse des dépendances (phrase / dépendance)
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
Le traitement du langage naturel à 100 coups
100 points de traitement du langage naturel Chapitre 5 Analyse des dépendances (premier semestre)
100 Language Processing Knock 2015 Chapitre 5 Analyse des dépendances (40-49)
100 coups de traitement du langage 2020: Chapitre 4 (analyse morphologique)
100 Language Processing Knock 2020 Chapitre 5: Analyse des dépendances
[Traitement du langage 100 coups 2020] Chapitre 4: Analyse morphologique
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 coups Chapitre 4: Analyse morphologique 31. Verbes
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: 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 langue amateur: 06
100 coups de traitement du langage amateur: 84
100 coups de traitement du langage amateur: 81
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