Traitement du langage 100 coups 2015 ["Chapitre 5: Analyse des dépendances"](http: //www.cl.ecei. tohoku.ac.jp/nlp100/#ch5) [41e "Lecture du résultat de l'analyse des dépendances (phrase / dépendance)"](http://www.cl.ecei.tohoku.ac.jp/nlp100/# sec41) Ceci est un record. La dernière fois, c'était le contenu du mouvement préparatoire, donc à partir de ce moment, c'est la performance réelle de la dépendance. Dans l'ensemble, le chapitre 5 n'est pas un code court qui utilise des packages comme dans le chapitre 4, "Analyse morphologique", et nous devons créer un algorithme. Cette fois, ce n'est pas si compliqué, mais cela me fait encore réfléchir dans une certaine mesure.
Lien | Remarques |
---|---|
041.Lecture du résultat de l'analyse des dépendances(Phrase / dépendance).ipynb | Lien GitHub du programme de réponse |
100 coups de traitement du langage amateur:41 | 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/)
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.
En plus de> 40, implémentez la classe de clause Chunk. Cette classe contient une liste d'éléments morph (objets Morph) (morphs), une liste de numéros d'index de clause associés (dst) et une liste de numéros d'index de clause d'origine (srcs) associés comme variables membres. De plus, lisez le résultat de l'analyse de CaboCha du texte d'entrée, exprimez une phrase sous forme d'une liste d'objets Chunk et affichez la chaîne de caractères et le contact de la phrase de la huitième phrase. Pour le reste des problèmes du chapitre 5, utilisez le programme créé ici.
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]) #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 i, chunk in enumerate(sentences[7]):
print('{}: {},Contact:{},Personne en charge:{}'.format(i, chunk.phrase, chunk.dst, chunk.srcs))
J'utilise une expression régulière qui peut obtenir le contact. (-? \ D +)
est la partie pour obtenir le numéro de la destination. 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".
Je pense que vous pouvez l'obtenir sans utiliser d'expressions régulières, mais je l'utilise pour la pratique.
python
#Dépendance
dependancy = re.compile(r'''(?:\*\s\d+\s) #Non soumis à la capture
(-?\d+) #Nombres(Contact)
''', re.VERBOSE)
Il définit également une variable appelée «phrase» qui n'est pas spécifiée pour frapper. C'est pratique lorsque vous le sortez plus tard. srcs
est uniquement défini et __init __
n'affecte pas de valeurs.
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]) #Phrase
Lorsque le programme est exécuté, les résultats suivants sont affichés.
Résultat de sortie
0:cette,Contact:1,Personne en charge:[]
1:Un étudiant est,Contact:7,Personne en charge:[0]
2:quelquefois,Contact:4,Personne en charge:[]
3:Nous,Contact:4,Personne en charge:[]
4:Capture,Contact:5,Personne en charge:[2, 3]
5:Ébullition,Contact:6,Personne en charge:[4]
6:Manger,Contact:7,Personne en charge:[5]
7:C'est une histoire.,Contact:-1,Personne en charge:[1, 6]
Recommended Posts