Voir First Post
9/24 ajouté
Utilisez MeCab pour analyser morphologiquement le texte (neko.txt) du roman de Natsume Soseki "Je suis un chat" et enregistrez le résultat dans un fichier appelé neko.txt.mecab. Utilisez ce fichier pour implémenter un programme qui répond aux questions suivantes. Pour les problèmes 37, 38, 39, utilisez matplotlib ou Gnuplot.
Implémentez un programme qui lit les résultats de l'analyse morphologique (neko.txt.mecab). Cependant, chaque élément morphologique a la clé de la forme de surface (surface), de la forme de base (base), d'une partie du mot (pos) et d'une partie de la sous-classification de mot 1 (pos1). Stocker dans un type de mappage et exprimer une phrase sous forme de liste d'éléments morphologiques (type de mappage). Pour le reste des problèmes du chapitre 4, utilisez le programme créé ici.
file_analyze_mecab_030.py
from natto import MeCab
import codecs
def file_analyze_mecab(input_filename,output_filename):
with codecs.open(input_filename,'r','utf-8') as f:
text = f.read()
m = MeCab.Tagger("mecabrc")
wt = m.parse(text)
with codecs.open(output_filename,'w','utf-8') as wf:
wf.write(wt)
if __name__=="__main__":
file_analyze_mecab('neko.txt','neko.txt.mecab')
result
Un nom,nombre,*,*,*,*,un,Ichi,Ichi
symbole,Vide,*,*,*,*, , ,
Mon nom,Synonyme,Général,*,*,*,je,Wagahai,Wagahai
Est un assistant,Assistance,*,*,*,*,Est,C,sensationnel
(Omis parce que c'est long)
Impression: J'ai entendu parler de l'analyse morphologique pour la première fois, alors j'ai enquêté à partir de là. Pour les paramètres de mecab, je me suis référé à MeCab: Yet Another Part-of-Speech and Morphological Analyzer. Le nom des modules, etc. est merveilleux.
mecab_030.py
#-*-coding:utf-8-*-
import codecs
if __name__ == "__main__":
with codecs.open("neko.txt.mecab",'r','utf-8') as f:
data = f.readlines()
mecab_list=[]
temp_dict ={}
for temp_word in data:
temp_word = temp_word.replace('\t', ',')
temp_word = temp_word.replace('\n', '')
if(temp_word.count(',')==9 or temp_word.count(',')==7):
temp_list = temp_word.split(',')
temp_dict={'surface':temp_list[0],'base':temp_list[7],'pos':temp_list[1],'pos1':temp_list[2]}
mecab_list.append(temp_dict)
else:
continue
print(mecab_list)
with codecs.open('neko.txt.mecab.analyze','w','utf-8') as wf:
for line in mecab_list:
wf.write(str(line)+'\n')
result
{'surface': 'objet', 'base': 'objet', 'pos': 'nom', 'pos1': 'Général'}
(Omis parce que c'est long)
Impressions: Le fichier de sortie a été remplacé par une simple chaîne de caractères au lieu d'un type de liste pour une visualisation facile. J'étais très accro à remarquer que le nombre de «,» dans la colonne des résultats de l'analyse morphologique était de 7 ou 9. .. ..
Extrayez toutes les formes de surface du verbe.
vurb_031.py
#-*-coding:utf-8-*-
import codecs
import re
import ast
if __name__ == "__main__":
with codecs.open("neko.txt.mecab.analyze",'r','utf-8') as f:
temp_lines = f.readlines()
pattern = re.compile(r".*verbe.*")
data = {}
for temp_line in temp_lines:
if pattern.match(temp_line):
data = ast.literal_eval(temp_line)
print(data['surface'])
else:
continue
result
alors
y a-t-il
Née
Ta
Tsuka
(Omis car il est long)
Impression: le fichier de résultat de l'analyse est lu, la colonne contenant le mot-clé verbe est extraite avec une expression régulière, convertie en un type de dictionnaire et seule la surface est sortie.
Extrayez toutes les formes originales du verbe.
base_vurb_032.py
# -*-coding:utf-8-*-
import codecs
import re
import ast
if __name__ == "__main__":
with codecs.open("neko.txt.mecab.analyze", 'r', 'utf-8') as f:
temp_lines = f.readlines()
pattern = re.compile(r".*verbe.*")
data = {}
for temp_line in temp_lines:
if pattern.match(temp_line):
data = ast.literal_eval(temp_line)
print(data['base'])
else:
continue
result
Est
y a-t-il
Être né
Ta
Tsukuri
Impressions: La procédure est la même que 031. La sortie est changée en base.
Extrayez toute la nomenclature de la connexion.
sahen_noun_033.py
# -*-coding:utf-8-*-
import codecs
import re
import ast
if __name__ == "__main__":
with codecs.open("neko.txt.mecab.analyze", 'r', 'utf-8') as f:
temp_lines = f.readlines()
pattern = re.compile(r".*Changer de connexion.*")
data = {}
for temp_line in temp_lines:
if pattern.match(temp_line):
data = ast.literal_eval(temp_line)
print(data['surface'])
else:
continue
result
S'inscrire
Mémoire
Parler
Décoration
Saillie
(Omis parce que c'est long)
Impressions: La procédure est la même que 032. Je viens de changer la condition d'extraction en une connexion de changement.
Extraire la nomenclature dans laquelle deux nomenclatures sont reliées par "non".
no_noun_034.py
#-*-coding:utf-8-*-
import codecs
import ast
if __name__ == "__main__":
with codecs.open('neko.txt.mecab.analyze','r','utf-8') as f:
temp_lines = f.readlines()
flag = 0
temp_list = []
for temp_line in temp_lines:
temp_dict = ast.literal_eval(temp_line)
if (temp_dict['pos'] == 'nom' and flag == 0):
temp_word = temp_dict['surface']
flag = 1
continue
elif(temp_dict['surface']=='de' and temp_dict['pos']=='Particule' and flag == 1):
temp_word += temp_dict['surface']
flag = 2
continue
elif(temp_dict['pos']=='nom' and flag == 2):
temp_word += temp_dict['surface']
temp_list.append(temp_word)
temp_word = ''
flag = 0
continue
else:
temp_word=''
flag =0
continue
no_noun_list = set(temp_list)
for temp in no_noun_list:
print(temp)
result
Enfant de
Mon annee
Trop
Coin gauche
Capacité de l'adversaire
Sur le front
Pour ceux
(Omis parce que c'est long)
Impression: Tout d'abord, une analyse ngram des informations de position avec N = 3 est effectuée pour lister les numéros d'index dans lesquels la nomenclature, la nomenclature et le nomen sont arrangés, puis les informations de surface du numéro d'index correspondant sont extraites et le début de la chaîne de caractères extraite. J'ai extrait ceux qui n'avaient pas «non» à la fin du mot, mais je n'ai pas rendu le sujet correct. Et corrigé au code actuel. Vous devez confirmer correctement le sujet. Réflexion.
Recommended Posts