Traitement du langage 100 coups 2015 ["Chapitre 5: Analyse des dépendances"](http: //www.cl.ecei. Il s'agit d'un enregistrement de 48e "Extraction du chemin du nez à la racine" de tohoku.ac.jp/nlp100/#ch5). .. C'est un peu plus simple que le dernier coup. En effet, il n'y a pas autant de conditions et seul le contact est émis en continu.
Lien | Remarques |
---|---|
048.Extraction de chemins de la nomenclature aux racines.ipynb | Lien GitHub du programme de réponse |
100 coups de traitement du langage amateur:48 | 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 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 ) |
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 de verbe fonctionnel, Chemin de dépendance, [Graphviz](http: / /www.graphviz.org/)
Utilisez CaboCha pour traduire le texte du roman de Soseki Natsume "Je suis un chat" (neko.txt) 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.
Pour une clause contenant toute la nomenclature de la phrase, extrayez le chemin de cette clause jusqu'à la racine de l'arbre de syntaxe. Cependant, le chemin sur l'arbre de syntaxe doit satisfaire aux spécifications suivantes.
--Chaque clause est représentée par une séquence morphologique (superficielle) --Concaténer les expressions de chaque clause avec "
->
" de la clause de début à la clause de fin du chemin.A partir de la phrase "J'ai vu un être humain pour la première fois ici" (8ème phrase de neko.txt.cabocha), le résultat suivant devrait être obtenu.
je suis->vu ici->Commencer avec->Humain->Des choses->vu Humain->Des choses->vu Des choses->vu
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.dst = dst #Numéro d'index de la clause de contact
self.phrase = ''
self.noun = False
for morph in morphs:
if morph.pos != 'symbole':
self.phrase += morph.surface #Pour les non-symboles
if morph.pos == 'nom':
self.noun = True
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.append(chunks)
chunks = []
for i, sentence in enumerate(sentences):
for chunk in sentence:
if chunk.noun and chunk.dst != -1:
line = chunk.phrase
current_chunk = chunk
while current_chunk.dst != -1:
line = line + ' -> ' + sentence[current_chunk.dst].phrase
current_chunk = sentence[current_chunk.dst]
print(i, '\t',line)
#Limité car il y en a beaucoup
if i > 10:
break
La classe Chunk est plus propre que la dernière fois. Il a un drapeau qui contient une nomenclature.
python
class Chunk:
def __init__(self, morphs, dst):
self.morphs = morphs
self.dst = dst #Numéro d'index de la clause de contact
self.phrase = ''
self.noun = False
for morph in morphs:
if morph.pos != 'symbole':
self.phrase += morph.surface #Pour les non-symboles
if morph.pos == 'nom':
self.noun = True
Cela a été beaucoup plus simple depuis la dernière fois, mais c'est un peu plus compliqué avec la sortie ci-dessous. Lorsqu'il existe une dépendance incluant une nomenclature, la clause «while» connecte les segments à la fin de la dépendance.
python
for i, sentence in enumerate(sentences):
for chunk in sentence:
if chunk.noun and chunk.dst != -1:
line = chunk.phrase
current_chunk = chunk
while current_chunk.dst != -1:
line = line + ' -> ' + sentence[current_chunk.dst].phrase
current_chunk = sentence[current_chunk.dst]
print(i, '\t',line)
#Limité car il y en a beaucoup
if i > 10:
break
Lorsque le programme est exécuté, les résultats suivants sont affichés.
Résultat de sortie
2 Le nom est->Non
3 où->Née->Katonto->Ne pas utiliser
3 Katonto->Ne pas utiliser
3 J'ai un indice->Ne pas utiliser
4 n'importe quoi->faible->En larmes->je me rappelle
4 à l'endroit->En larmes->je me rappelle
4 Seulement ce qui était là->je me rappelle
5 je suis->vu
5 ici->Commencer avec->Humain->Des choses->vu
5 humain->Des choses->vu
5 choses->vu
6 Plus tard->Quand tu entends->C'est tout
6 c'est->C'est tout
6 Appelé un étudiant->Chez l'homme->C'était une course->C'est tout
6 chez l'homme->C'était une course->C'est tout
6 Ichiban->Mal->C'était une course->C'est tout
6 mal->C'était une course->C'est tout
Était 6 courses->C'est tout
7 Un étudiant est->Est une histoire
7 nous->Capture->Ébullition->Manger->Est une histoire
8 À ce moment-là->Je n'ai pas->ne pensais pas
8 quoi->Pensées->Je n'ai pas->ne pensais pas
8 pensées->Je n'ai pas->ne pensais pas
9 son->Dans la paume->Être placé->Soulevé->Temps->doux->Sentiment->Juste réchauffé
9 dans la paume->Être placé->Soulevé->Temps->doux->Sentiment->Juste réchauffé
9 Sue->Soulevé->Temps->doux->Sentiment->Juste réchauffé
9 heures->doux->Sentiment->Juste réchauffé
9 Sentiment->Juste réchauffé
10 paumes->Au dessus de->calmez-vous->j'ai vu->Humain->De choses->Sera le début
Le 10->calmez-vous->j'ai vu->Humain->De choses->Sera le début
10 étudiants->Visage->j'ai vu->Humain->De choses->Sera le début
10 visages->j'ai vu->Humain->De choses->Sera le début
10 J'ai vu->Humain->De choses->Sera le début
10 humains->De choses->Sera le début
10 choses->Sera le début
11 heures->Si c'est une chose->pensée->Sentiment->Restant
11 étrange->Si c'est une chose->pensée->Sentiment->Restant
11 choses->pensée->Sentiment->Restant
11 Sentiment->Restant
11 Encore->Restant
Recommended Posts