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 | 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 |
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 ) |
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/)
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.
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.
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
Vous pouvez clarifier la relation.
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
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__)
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)
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)
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__)
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