[PYTHON] Analyse de dépendance avec CaboCha

J'ai créé un code pour vérifier la dépendance japonaise à l'aide de cabocha. Pour le moment, j'ai essayé d'extraire la relation entre la nomenclature et les adjectifs.

Les références

Veuillez vous référer au blog de mima_ita pour installer CaboCha dans l'environnement Windows. Mettez Cabocha dans Windows et analysez la dépendance avec Python

Résumons brièvement l'ordre des parties et des mots

Je n'ai pas étudié le langage naturel professionnellement, et je n'ai pas fait de recherche dans des articles, etc., mais je décrirai les idées des amateurs ci-dessous.

En vous concentrant sur la nomenclature, les verbes et les adjectifs, si vous considérez simplement la relation avec la partie du mot précédent, vous pouvez la diviser selon les modèles suivants.

Sur cette base, j'ai créé un code pour obtenir la relation entre la nomenclature et les adjectifs. Ci-dessous le code.

Code de référence

python


# coding: utf-8

import CaboCha
import xml.etree.ElementTree as ET
from collections import defaultdict

def get_reputation(ET_tree):
    flag = None
    reputation = defaultdict(str)

    for el in ET_tree.findall(".//chunk"):        
        tok = el.find("tok")
        feature = tok.attrib["feature"].strip().split(',')
        part = feature[0]
        typ = feature[1]

        if part=='nom' and \
            (typ=='Général' or typ=='Nomenclature propriétaire'): 
                reputation["object"]=tok.text
        if part=='adjectif': reputation['adjective']=feature[6]
        link = el.attrib["link"]
        if link=='-1': break
        while 1:
            res = get_next_chunk(link,part)
            if res==None: break
            part, typ, word, link = res

            if part=='nom' and \
                (typ=='Général' or typ=='Nomenclature propriétaire'): 
                reputation["object"]=word
            if part=='adjectif':
                reputation['adjective'] = word
                if reputation["object"]!=None:
                    flag=1
                    break
        if flag==1: break
        
    print reputation["object"]
    print reputation["adjective"]

def get_next_chunk(linkid, ex_part):
    if linkid=='-1': return None
    this_chunk =  ET_tree.find(".//chunk[@id='%s']" % linkid)
    #print this_chunk.attrib
    link = this_chunk.attrib["link"]
        
    tok = this_chunk.find('tok')
    feature = tok.attrib["feature"].strip().split(',')
    if ex_part=='nom':
        if feature[0]=='nom':
            return feature[0], feature[1], tok.text, link
        elif feature[0]=='verbe' or feature[0]=='adjectif':
            return feature[0], feature[1],  feature[6], link
    elif ex_part=='verbe':
        if feature[0]=='nom':
            return feature[0], feature[1],  tok.text, link
    elif ex_part=='adjectif':
        if feature[0]=='nom':
            return feature[0], feature[1],  tok.text, link
        
if __name__=='__main__':
    c = CaboCha.Parser('--charset=UTF8')
    
    sentence = "L'article le plus intéressant du numéro de juin de Courier, «Introduction aux« arts libéraux »pour apprendre le plaisir», était un article de Hidehiro Ikegami. "Comment voir un tableau" est extrêmement important, n'est-ce pas?"
    
    tree =  c.parse(sentence)
    #print tree.toString(CaboCha.FORMAT_TREE)
    #print tree.toString(CaboCha.FORMAT_LATTICE)
    print tree.toString(CaboCha.FORMAT_XML)
    ET_tree = ET.fromstring(tree.toString(CaboCha.FORMAT_XML))
    
    get_reputation(ET_tree)

Je n'obtiens que le premier jeton pour chaque morceau, car si je peux bien le diviser en morceaux, le premier jeton devrait avoir un mot significatif.

Résultat de sortie

L'article le plus intéressant du numéro de juin de Courier, «Introduction aux« arts libéraux »pour apprendre le plaisir», était un article de Hidehiro Ikegami. "Comment voir un tableau" est extrêmement important, n'est-ce pas? 』\

J'ai essayé d'analyser la phrase avec CaboCha. Voici la sortie XML du résultat de l'analyse de CaboCha.

<sentence>
 <chunk id="0" link="1" rel="D" score="0.328005" head="0" func="1">
  <tok id="0" feature="nom,Général,*,*,*,*,*,*,*,Wikipedia">Courrier</tok>
  <tok id="1" feature="Particule,syndicat,*,*,*,*,de,Non,Non">de</tok>
 </chunk>
 <chunk id="1" link="4" rel="D" score="0.018011" head="3" func="3">
  <tok id="2" feature="nom,Avocat possible,*,*,*,*,juin,Rokugatsu,Rokugatsu">juin</tok>
  <tok id="3" feature="nom,suffixe,Général,*,*,*,problème,Aller,Aller">problème</tok>
 </chunk>
 <chunk id="2" link="3" rel="D" score="1.140087" head="5" func="5">
  <tok id="4" feature="symbole,Ouvrir les parenthèses,*,*,*,*,「,「,「">「</tok>
  <tok id="5" feature="adjectif,Indépendance,*,*,adjectif・イ段,Connexion continue,agréable,Tanoshiku,Tanoshiku">Heureusement</tok>
 </chunk>
 <chunk id="3" link="4" rel="D" score="2.891449" head="6" func="6">
  <tok id="6" feature="verbe,Indépendance,*,*,Cinq étapes / ligne ba,Forme basique,apprendre,Manab,Manab">apprendre</tok>
 </chunk>
 <chunk id="4" link="6" rel="D" score="1.654218" head="10" func="12">
  <tok id="7" feature="symbole,Ouvrir les parenthèses,*,*,*,*,『,『,『">『</tok>
  <tok id="8" feature="nom,Général,*,*,*,*,Arts libéraux,Kyoyo,Kyoyo">Arts libéraux</tok>
  <tok id="9" feature="symbole,Fermé entre parenthèses,*,*,*,*,』,』,』">』</tok>
  <tok id="10" feature="nom,Changer de connexion,*,*,*,*,commencer,Newmon,Newmon">commencer</tok>
  <tok id="11" feature="symbole,Fermé entre parenthèses,*,*,*,*,」,」,」">」</tok>
  <tok id="12" feature="Particule,格Particule,Général,*,*,*,alors,De,De">alors</tok>
 </chunk>
 <chunk id="5" link="6" rel="D" score="2.796273" head="13" func="13">
  <tok id="13" feature="nom,Avocat possible,*,*,*,*,Ichiban,Ichiban,Ichiban">Ichiban</tok>
 </chunk>
 <chunk id="6" link="8" rel="D" score="1.346988" head="16" func="17">
  <tok id="14" feature="adjectif,Indépendance,*,*,adjectif・アウオ段,Connexion continue,Intéressant,Marrant,Marrant">Intéressant</tok>
  <tok id="15" feature="Verbe auxiliaire,*,*,*,Spécial,Forme basique,Ta,Ta,Ta">Ta</tok>
  <tok id="16" feature="nom,Non indépendant,Général,*,*,*,de,Non,Non">de</tok>
  <tok id="17" feature="Particule,係Particule,*,*,*,*,Est,C,sensationnel">Est</tok>
  <tok id="18" feature="symbole,Point de lecture,*,*,*,*,、,、,、">、</tok>
 </chunk>
 <chunk id="7" link="8" rel="D" score="3.189624" head="21" func="22">
  <tok id="19" feature="nom,固有nom,Nom d'une personne,Nom de famille,*,*,Ikegami,Ikegami,Ikegami">Ikegami</tok>
  <tok id="20" feature="nom,固有nom,Nom d'une personne,Nom,*,*,Britannique et occidental,Hidehiro,Hidehiro">Britannique et occidental</tok>
  <tok id="21" feature="nom,suffixe,Nom d'une personne,*,*,*,M.,Soleil,Soleil">M.</tok>
  <tok id="22" feature="Particule,syndicat,*,*,*,*,de,Non,Non">de</tok>
 </chunk>
 <chunk id="8" link="11" rel="D" score="-0.885691" head="23" func="23">
  <tok id="23" feature="nom,Général,*,*,*,*,article,faisan,faisan">article</tok>
  <tok id="24" feature="symbole,Phrase,*,*,*,*,。,。,。">。</tok>
 </chunk>
 <chunk id="9" link="10" rel="D" score="4.381583" head="26" func="27">
  <tok id="25" feature="symbole,Ouvrir les parenthèses,*,*,*,*,「,「,「">「</tok>
  <tok id="26" feature="nom,Général,*,*,*,*,La peinture,Kaiga,Kaiga">La peinture</tok>
  <tok id="27" feature="Particule,syndicat,*,*,*,*,de,Non,Non">de</tok>
 </chunk>
 <chunk id="10" link="11" rel="D" score="-0.885691" head="29" func="31">
  <tok id="28" feature="verbe,Indépendance,*,*,Un pas,Type continu,à voir,Mi,Mi">Vous voyez</tok>
  <tok id="29" feature="nom,suffixe,Général,*,*,*,Comment,Kata,Kata">Comment</tok>
  <tok id="30" feature="symbole,Fermé entre parenthèses,*,*,*,*,」,」,」">」</tok>
  <tok id="31" feature="Particule,格Particule,Langage commun,*,*,*,Quoi,Itte,Itte">Quoi</tok>
 </chunk>
 <chunk id="11" link="-1" rel="D" score="0.000000" head="33" func="36">
  <tok id="32" feature="nom,Changer de connexion,*,*,*,*,Transcendance,Chozetsu,Chozetsu">Transcendance</tok>
  <tok id="33" feature="nom,Racine du verbe adjectif,*,*,*,*,Important,Daiji,Daiji">Important</tok>
  <tok id="34" feature="Verbe auxiliaire,*,*,*,Spécial,Forme basique,Est,Da,Da">Est</tok>
  <tok id="35" feature="Particule,終Particule,*,*,*,*,Yo,Yo,Yo">Yo</tok>
  <tok id="36" feature="Particule,終Particule,*,*,*,*,Hey,Ne,Ne">Hey</tok>
  <tok id="37" feature="symbole,Phrase,*,*,*,*,。,。,。">。</tok>
 </chunk>
</sentence>

Le lien contenu dans chaque bloc montre l'association avec l'ID de bloc qui suit.

Résultat expérimental

J'ai pu acquérir la relation de "Courier" <- "intéressante". Cependant, avec le code ci-dessus, vous ne pouvez obtenir qu'une seule relation, donc si vous en avez plus d'une, vous devez en concevoir plus. ..

Nous vous prions de nous excuser pour la gêne occasionnée, mais si vous faites une erreur, veuillez nous en informer.

Recommended Posts

Analyse de dépendance avec CaboCha
Analyse des tweets avec Python, Mecab et CaboCha
Analyse de données avec python 2
Analyse vocale par python
[Construction de l'environnement] Analyse des dépendances à l'aide de CaboCha avec Python 2.7
Analyse vocale par python
Analyse dynamique par Valgrind
Effectuer une analyse de régression avec NumPy
Analyse de données avec Python
[Analyse de co-occurrence] Analyse de co-occurrence facile avec Python! [Python]
100 Language Processing Knock-57: Analyse des dépendances
Analyse des émotions par Python (word2vec)
Analyse de texture apprise avec la pyradiomique
Analyse de squelette planaire avec Python
Analyse morphologique japonaise avec Python
Analyse des secousses musculaires avec Python
[PowerShell] Analyse morphologique avec SudachiPy
Analyse des émotions par SMS avec ML-Ask
100 Language Processing Knock 2015 Chapitre 5 Analyse des dépendances (40-49)
Analyse de la structure du squelette en trois dimensions avec Python
Analyse d'impédance (EIS) avec python [impedance.py]
[Traitement du langage 100 coups 2020] Chapitre 5: Analyse des dépendances
Text mining avec Python ① Analyse morphologique
Analyse des composants principaux avec Spark ML
100 Language Processing Knock 2020 Chapitre 5: Analyse des dépendances
Analyse pratique avec Pandas + notebook Jupyter
J'ai joué avec Mecab (analyse morphologique)!
Analyse de données à partir de python (visualisation de données 1)
Analyse de régression logistique Self-made avec python
Analyse de données à partir de python (visualisation de données 2)
Mettez Cabocha 0.68 dans Windows et essayez d'analyser la dépendance avec Python
J'ai essayé l'analyse de régression multiple avec régression polypoly
L'analyse de clustering la plus basique avec scikit-learn
Analyse des composants principaux avec le corpus d'actualités Livedoor - Pratique--
[Didacticiel d'analyse Python en base de données avec SQL Server 2017]
Analyse bidimensionnelle du flux de perméation saturée-insaturée avec Python
Apprentissage automatique avec python (2) Analyse de régression simple
Programme d'analyse des contraintes FEM 2D par Python
J'ai essayé l'analyse factorielle avec des données Titanic!
[Analyse vocale] Trouvez une similitude croisée avec Librosa
Analyse des conversations en ligne avec Janome (OSS publié)
Analyse émotionnelle des tweets avec apprentissage en profondeur
Visualisons le fil 2ch avec WordCloud-analyse morphologique / édition WordCloud-
Analyse de données à partir de python (pré-traitement des données-apprentissage automatique)
Analyse de conduction thermique bidimensionnelle non stationnaire avec Python
Analyse de réseau avec NetworkX --- Volume de détection de la communauté
Python: analyse morphologique simplifiée avec des expressions régulières
Que diriez-vous de l'analyse de polarité avec "ordre" ajouté?