[PYTHON] 100 traitement de la langue knock-42: Affichage de la phrase de la personne concernée et de la personne concernée

Traitement du langage 100 coups 2015 ["Chapitre 5: Analyse des dépendances"](http: //www.cl.ecei. tohoku.ac.jp/nlp100/#ch5) 42e "Affichage de la phrase de la personne concernée et de la personne concernée" Enregistrement est. Puisque le greffier et la clause du greffier sont sortis, cela ressemble au rendement réel du greffier. Cependant, techniquement, la méthode de sortie change un peu, donc ce n'est pas très différent du coup précédent.

Lien de référence

Lien Remarques
042.Affichage de la phrase du responsable et du responsable.ipynb Lien GitHub du programme de réponse
100 coups de traitement du langage amateur:42 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 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.

42. Affichage de la phrase de l'intéressé et de l'intéressé

Extraire tout le texte de la clause originale et de la clause liée au format délimité par des tabulations. Cependant, n'émettez pas de symboles tels que des signes de ponctuation.

Répondre

Programme de réponse [042. Affichage de la phrase de la personne concernée et de la personne concernée.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 / 042.% E4% BF% 82% E3% 82% 8A% E5% 85% 83% E3% 81% A8% E4% BF% 82% E3% 82% 8A% E5% 85% 88% E3% 81% AE% E6% 96% 87% E7% AF% 80% E3% 81% AE% E8% A1% A8% E7% A4% 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.phrase = ''.join([morph.surface for morph in morphs if morph.pos!= 'symbole']) #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 si, sentence in enumerate(sentences):
    print('-----', si, '-----')
    for ci, chunk in enumerate(sentence):
        if chunk.dst != -1:
            print('{}:{}\t{}'.format(ci, chunk.phrase, sentence[chunk.dst].phrase))
    
    #Limité car il y en a beaucoup
    if si > 5:
        break

Répondre au commentaire

Exclure des symboles des clauses Chunk

Un peu différent de la classe Chunk précédente, les symboles sont exclus de la clause.

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 if morph.pos!= 'symbole']) #Phrase

Section de sortie

"Le texte est au format délimité par des tabulations" est comme du texte délimité par des tabulations, mais je ne le vois pas même si tout cela apparaît, et il est plus facile de voir s'il y a un délimiteur de phrase, donc je l'interprète arbitrairement et affiche la tabulation avec print.

python


for si, sentence in enumerate(sentences):
    print('-----', si, '-----')
    for ci, chunk in enumerate(sentence):
        if chunk.dst != -1:
            print('{}:{}\t{}'.format(ci, chunk.phrase, sentence[chunk.dst].phrase))
    
    #Limité car il y en a beaucoup
    if si > 5:
        break

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

Lorsque le programme est exécuté, le résultat suivant est sorti (seules 6 phrases sont sorties).

Résultat de sortie


----- 0 -----
----- 1 -----
----- 2 -----
0:Sans nom
1:Pas encore
----- 3 -----
0:Où est né
1:Née
2:Je ne comprends pas
3:Je n'ai aucune idée
----- 4 -----
0:Tout ce qui est sombre
1:Dim pleure
2:Larmes
3:Pleurer là où tu as fait
4:Miaou miaou pleurer
5:Je pleure et me souviens
6:Je me souviens seulement de ce que j'étais
----- 5 -----
0:j'ai vu
1:Pour la première fois ici
2:Pour la première fois appelé humain
3:Êtres humains
4:j'ai vu quelque chose
----- 6 -----
0:Et c'est vrai
1:Je te demanderai plus tard
2:j'ai entendu cela
3:C'est vrai
4:Dans l'être humain appelé Shosei
5:Était une race chez les humains
6:Le pire
7:C'était une race méchante
8:Il semble que c'était une course

Recommended Posts

100 traitement de la langue knock-42: Affichage de la phrase de la personne concernée et de la personne concernée
Traitement du langage 100 knock-86: affichage vectoriel Word
Traitement linguistique 100 knocks-29: Obtenez l'URL de l'image du drapeau
100 traitement du langage knock-59: analyse de la formule S
Réponses et impressions de 100 chocs de traitement linguistique - Partie 1
100 traitement du langage knock-91: Préparation des données d'analogie
Réponses et impressions de 100 chocs de traitement de la langue - Partie 2
100 Language Processing Knock-26: suppression du balisage accentué
100 coups de traitement linguistique (2020): 28
100 coups de traitement linguistique (2020): 38
100 traitement de la langue frapper 00 ~ 02
Réhabilitation des compétences Python et PNL à partir de "100 Language Processing Knock 2015" (Chapitre 1)
Une personne inexpérimentée en Python essaie de frapper 100 traitement du langage 14-16
100 traitement du langage knock-41: lecture du résultat de l'analyse des dépendances (phrase / dépendance)
100 Language Processing Knock-32 (utilisant des pandas): Prototype de verbe
Traitement du langage 100 knocks-45: Extraction de modèles de cas verbaux
Une personne inexpérimentée en Python essaie de frapper 100 traitement du langage 07-09
100 traitement du langage knock-75 (en utilisant scicit-learn): poids de l'identité
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 ~ 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 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
Apprenez facilement 100 traitements linguistiques Knock 2020 avec "Google Colaboratory"
Vue d'ensemble du traitement du langage naturel et de son prétraitement des données
Réhabilitation des compétences Python et PNL à partir de «Knock 100 Language Processing 2015» (chapitre 2 deuxième semestre)
Réhabilitation des compétences Python et PNL à partir de "100 Language Processing Knock 2015" (Chapitre 2 premier semestre)
100 traitement du langage Knock-51: découpage de mots
Types de prétraitement dans le traitement du langage naturel et leur puissance
100 Language Processing Knock-58: Extraction de Taple
100 Language Processing Knock-57: Analyse des dépendances
100 traitements linguistiques knock-77 (en utilisant scicit-learn): mesure du taux de réponse
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
100 langage de traitement knock-70 (en utilisant Stanford NLP): Obtention et formatage des données
La fonction d'affichage d'image d'iTerm est pratique lors du traitement d'images.
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é
Affichage en temps réel de la progression du traitement côté serveur sur le navigateur (implémentation de la barre de progression)
Flux d'obtention du résultat du traitement asynchrone à l'aide de Django et Celery