Traitement du langage 100 coups 2015 ["Chapitre 5: Analyse des dépendances"](http: //www.cl.ecei. tohoku.ac.jp/nlp100/#ch5) 42e "Affichage de la phrase de la personne concernée et de la personne concernée" Enregistrement est. Puisque le greffier et la clause du greffier sont sortis, cela ressemble au rendement réel du greffier. Cependant, techniquement, la méthode de sortie change un peu, donc ce n'est pas très différent du coup précédent.
Lien | Remarques |
---|---|
042.Affichage de la phrase du responsable et du responsable.ipynb | Lien GitHub du programme de réponse |
100 coups de traitement du langage amateur:42 | 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 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.
Extraire tout le texte de la clause originale et de la clause liée au format délimité par des tabulations. Cependant, n'émettez pas de symboles tels que des signes de ponctuation.
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 if morph.pos!= 'symbole']) #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 si, sentence in enumerate(sentences):
print('-----', si, '-----')
for ci, chunk in enumerate(sentence):
if chunk.dst != -1:
print('{}:{}\t{}'.format(ci, chunk.phrase, sentence[chunk.dst].phrase))
#Limité car il y en a beaucoup
if si > 5:
break
Un peu différent de la classe Chunk précédente, les symboles sont exclus de la clause.
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 if morph.pos!= 'symbole']) #Phrase
"Le texte est au format délimité par des tabulations" est comme du texte délimité par des tabulations, mais je ne le vois pas même si tout cela apparaît, et il est plus facile de voir s'il y a un délimiteur de phrase, donc je l'interprète arbitrairement et affiche la tabulation avec print
.
python
for si, sentence in enumerate(sentences):
print('-----', si, '-----')
for ci, chunk in enumerate(sentence):
if chunk.dst != -1:
print('{}:{}\t{}'.format(ci, chunk.phrase, sentence[chunk.dst].phrase))
#Limité car il y en a beaucoup
if si > 5:
break
Lorsque le programme est exécuté, le résultat suivant est sorti (seules 6 phrases sont sorties).
Résultat de sortie
----- 0 -----
----- 1 -----
----- 2 -----
0:Sans nom
1:Pas encore
----- 3 -----
0:Où est né
1:Née
2:Je ne comprends pas
3:Je n'ai aucune idée
----- 4 -----
0:Tout ce qui est sombre
1:Dim pleure
2:Larmes
3:Pleurer là où tu as fait
4:Miaou miaou pleurer
5:Je pleure et me souviens
6:Je me souviens seulement de ce que j'étais
----- 5 -----
0:j'ai vu
1:Pour la première fois ici
2:Pour la première fois appelé humain
3:Êtres humains
4:j'ai vu quelque chose
----- 6 -----
0:Et c'est vrai
1:Je te demanderai plus tard
2:j'ai entendu cela
3:C'est vrai
4:Dans l'être humain appelé Shosei
5:Était une race chez les humains
6:Le pire
7:C'était une race méchante
8:Il semble que c'était une course
Recommended Posts