[PYTHON] 100 Language Processing Knock-57: Analyse des dépendances

Traitement linguistique 100 coups 2015 ["Chapitre 6: Traitement de texte anglais"](http: //www.cl.ecei) Il s'agit du 57e "Analyse des dépendances" de .tohoku.ac.jp / nlp100 / # ch6). "Knock 100 language processing-44: Visualisation de l'arbre dépendant" Ceci est la version de Stanford Core NLP. Je détourne beaucoup de code.

Lien de référence

Lien Remarques
057.Analyse des dépendances.ipynb Lien GitHub du programme de réponse
100 coups de traitement du langage amateur:57 Copiez et collez la source de nombreuses pièces source
Officiel PNL de Stanford Core Premier regard sur la page PNL de Stanford Core

environnement

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
Stanford CoreNLP 3.9.2 Je l'ai installé il y a un an et je ne me souviens pas en détail ...
C'était le dernier même après un an, alors je l'ai utilisé tel quel
openJDK 1.8.0_242 J'ai utilisé le JDK qui a été installé à d'autres fins tel quel

Dans l'environnement ci-dessus, j'utilise les packages Python supplémentaires suivants. Installez simplement avec pip ordinaire.

type version
pydot 1.4.1

Chapitre 6: Traitement du texte anglais

contenu de l'étude

Un aperçu des différentes technologies de base pour le traitement du langage naturel grâce au traitement de texte anglais à l'aide de la PNL Stanford Core.

Stanford Core NLP, Stemming, Part-word tagging, Unique expression extraction, Co-reference analysis, Dependency analysis, Clause structure analysis, S expression

Contenu frappé

Effectuez le traitement suivant sur le texte anglais (nlp.txt).

57. Analyse des dépendances

Visualisez les dépendances réduites de la PNL Stanford Core sous forme de graphe orienté. Pour la visualisation, convertissez l'arborescence des dépendances en langage DOT et [Graphviz](http: / /www.graphviz.org/) doit être utilisé. De plus, pour visualiser des graphiques dirigés directement à partir de Python, utilisez pydot.

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

Les dépendances sont appelées «Dependencies» dans Stanford Core NLP, et le fonctionnement de Stanford Core NLP peut être trouvé dans Stanford Dependencies.

Il semble qu'il existe deux types, et cette fois la cible est "collapsed-dependencies". image.png

Après l'avoir fait, j'ai remarqué qu'il était plus facile de comprendre si j'ajoutais la relation entre les arêtes (prep_on etc.) dans le graphe orienté.

Répondre

Programme de réponse [057. Dependency analysis.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/06.%E8%8B%B1%E8%AA%9E%E3%83%86%E3 % 82% AD% E3% 82% B9% E3% 83% 88% E3% 81% AE% E5% 87% A6% E7% 90% 86/057.% E4% BF% 82% E3% 82% 8A% E5% 8F% 97% E3% 81% 91% E8% A7% A3% E6% 9E% 90.ipynb)

import xml.etree.ElementTree as ET

import pydot

for i, sentence in enumerate(ET.parse('./nlp.txt.xml').iterfind('./document/sentences/sentence')):
    edges = []
    for dependency in sentence.iterfind('./dependencies[@type="collapsed-dependencies"]/dep'):
        
        #Exclusion de ponctuation
        if dependency.get('type') != 'punct':
            governor = dependency.find('./governor')
            dependent = dependency.find('./dependent')
            edges.append(((governor.get('idx'), governor.text), 
                          (dependent.get('idx'), dependent.text)))
    if len(edges) > 0:
        graph = pydot.graph_from_edges(edges, directed=True)
        graph.write_jpeg('057.graph_{}.jpeg'.format(i))
    
    if i > 5:
        break

Répondre au commentaire

Chemin du fichier XML

Il s'agit d'un mappage du chemin du fichier XML suivant et de la source et de la destination cible. La balise dependencies de la 5ème couche cible le type d'attribut de collapsed-dependencies.

production 1er niveau Deuxième niveau Troisième niveau 4ème niveau 5ème niveau 6ème niveau 7ème niveau
Personne en charge root document sentences sentence dependencies dep governor
Contact root document sentences sentence dependencies dep dependent

Le fichier XML est [GitHub](https://github.com/YoheiFukuhara/nlp100/blob/master/06.%E8%8B%B1%E8%AA%9E%E3%83%86%E3%82%AD% E3% 82% B9% E3% 83% 88% E3% 81% AE% E5% 87% A6% E7% 90% 86 / nlp.txt.xml).

xml:nlp.txt.xml(Extrait)


<root>
  <document>
    <docId>nlp.txt</docId>
    <sentences>
      <sentence id="1">

--Omission--

        <dependencies type="collapsed-dependencies">
          <dep type="root">
            <governor idx="0">ROOT</governor>
            <dependent idx="18">field</dependent>
          </dep>
          <dep type="amod">
            <governor idx="3">processing</governor>
            <dependent idx="1">Natural</dependent>
          </dep>
          <dep type="compound">
            <governor idx="3">processing</governor>
            <dependent idx="2">language</dependent>
          </dep>

Affichage graphique dirigé avec Pydot

Ci-dessous la partie code. Ce que je fais est le même que "Knock 100 language processing-44: Visualization of depend tree", donc je ne vais pas l'expliquer. Cependant, ajoutez la relation entre les arêtes en utilisant Graphviz et networkx. Je regrette d'avoir dû le faire. Article "Ecrire un multi-graphe ou un beau graphe avec networkx [python]" et article "Utiliser Graphviz sur Python" Dessinez un beau graphique " Je pense que je peux l'écrire en y faisant référence. En premier lieu, pydot n'a pas été mis à jour depuis décembre 2018, je crains donc que cela continue à l'avenir.

python


for i, sentence in enumerate(ET.parse('./nlp.txt.xml').iterfind('./document/sentences/sentence')):
    edges = []
    for dependency in sentence.iterfind('./dependencies[@type="collapsed-dependencies"]/dep'):
        
        #Exclusion de ponctuation
        if dependency.get('type') != 'punct':
            governor = dependency.find('./governor')
            dependent = dependency.find('./dependent')
            edges.append(((governor.get('idx'), governor.text), 
                          (dependent.get('idx'), dependent.text)))
    if len(edges) > 0:
        graph = pydot.graph_from_edges(edges, directed=True)
        graph.write_jpeg('057.graph_{}.jpeg'.format(i))

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

Lorsque le programme est exécuté, le résultat suivant est affiché (uniquement les 3 premières phrases).

image.png

image.png

image.png

Recommended Posts

100 Language Processing Knock-57: Analyse des dépendances
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 Language Processing Knock-56: analyse de co-référence
100 coups de traitement linguistique (2020): 28
100 coups de traitement linguistique (2020): 38
100 traitement de la langue frapper 00 ~ 02
100 Language Processing Knock 2020 Chapitre 4: Analyse morphologique
[Traitement du langage 100 coups 2020] Chapitre 5: Analyse des dépendances
100 Traitement du langage Knock Chapitre 4: Analyse morphologique
100 traitement du langage knock-59: analyse de la formule S
100 Language Processing Knock 2015 Chapitre 4 Analyse morphologique (30-39)
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
Traitement du langage 100 knocks-40: lecture des résultats de l'analyse des dépendances (morphologie)
100 traitement du langage knock-41: lecture du résultat de l'analyse des dépendances (phrase / dépendance)
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)
Traitement du langage naturel 1 Analyse morphologique
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
Résolution de 100 traitements linguistiques Knock 2020 (01. "Patatokukashi")
100 coups de traitement du langage amateur: Résumé
100 Language Processing Knock-30 (en utilisant des pandas): lecture des résultats de l'analyse morphologique
Traitement du langage 100 knocks-49: Extraction de chemins de dépendances entre nomenclature
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 2020 Chapitre 2: Commandes UNIX
100 traitements de langage avec Python
100 Language Processing Knock Chapitre 1 en Python
100 coups de traitement du langage 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
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