Traitement du langage 100 coups 2015 ["Chapitre 4: Analyse morphologique"](http: //www.cl.ecei.tohoku) Il s'agit de l'enregistrement de 35e "Concaténation de nomenclature" de .ac.jp / nlp100 / # ch4). Comme la dernière fois, c'est un contenu qui ne peut pas être facilement traité par les pandas. Cependant, la partie «concaténation de nomenclature» n'est pas difficile à traiter d'environ 10 lignes.
Lien | Remarques |
---|---|
035.Concaténation de nomenclature.ipynb | Lien GitHub du programme de réponse |
100 coups de traitement du langage amateur:35 | Copiez et collez la source de nombreuses pièces source |
Officiel MeCab | Page MeCab à regarder en premier |
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 |
Dans l'environnement ci-dessus, j'utilise les packages Python supplémentaires suivants. Installez simplement avec pip ordinaire.
type | version |
---|---|
pandas | 1.0.1 |
Appliquer l'analyseur morphologique MeCab au roman "Je suis un chat" de Natsume Soseki et obtenir les statistiques des mots du roman.
Analyse morphologique, MeCab, paroles de partie, fréquence d'occurrence, loi de Zipf, matplotlib, Gnuplot
Utilisation de MeCab pour le texte (neko.txt) du roman de Natsume Soseki "Je suis un chat" Effectuez une analyse morphologique 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.
Extraire la concaténation de la nomenclature (noms qui apparaissent consécutivement) avec la correspondance la plus longue.
import pandas as pd
def read_text():
# 0:Type de surface(surface)
# 1:Partie(pos)
# 2:Sous-classification des paroles des parties 1(pos1)
# 7:Forme basique(base)
df = pd.read_table('./neko.txt.mecab', sep='\t|,', header=None,
usecols=[0, 1, 2, 7], names=['surface', 'pos', 'pos1', 'base'],
skiprows=4, skipfooter=1 ,engine='python')
return df[df['pos'] == 'nom']
df = read_text()
nouns = []
for index in df['surface'].index:
nouns.append(df['surface'][index])
#Concaténation de fin de nez s'il n'y a pas d'index devant
if (index + 1) not in df.index:
#Plusieurs(Enchaînement)dans le cas de
if len(nouns) > 1:
print(len(nouns), '\t', index, '\t', ''.join(nouns))
nouns = []
#Limité car il y en a beaucoup
if index > 2000:
break
Cette fois, seule la nomenclature est requise, de sorte que les entrées sont réduites à la seule nomenclature immédiatement après la lecture du fichier.
python
def read_text():
# 0:Type de surface(surface)
# 1:Partie(pos)
# 2:Sous-classification des paroles des parties 1(pos1)
# 7:Forme basique(base)
df = pd.read_table('./neko.txt.mecab', sep='\t|,', header=None,
usecols=[0, 1, 2, 7], names=['surface', 'pos', 'pos1', 'base'],
skiprows=4, skipfooter=1 ,engine='python')
return df[df['pos'] == 'nom']
Le reste est en cours de traitement en boucle. Le jugement de fin de concaténation est effectué en fonction du fait que l'indice de l'entrée suivante est +1. Affiche la nomenclature uniquement lorsque la longueur de la liste de concaténation est égale ou supérieure à 1 à la fin de la concaténation.
python
nouns = []
for index in df['surface'].index:
nouns.append(df['surface'][index])
#Concaténation de fin de nez s'il n'y a pas d'index devant
if (index + 1) not in df.index:
#Plusieurs(Enchaînement)dans le cas de
if len(nouns) > 1:
print(len(nouns), '\t', index, '\t', ''.join(nouns))
nouns = []
Lorsque le programme est exécuté, les résultats suivants sont affichés.
Résultat de sortie
2 28
2 66 Humain
2 69 Le pire
2 172
2190 Un cheveu
2209 Puis chat
2222 fois
2688 Maison
2860 autres que les étudiants
3 1001
2 1028 L'autre jour
2 1031 Mima
2 1106 Cuisine
2 1150 tel quel
2 1235 Etude d'une journée
2 1255 Étudiant
2 1266 Étudiant
2 1288 Diligent
3 1392 Page 23
2 1515 Autre que le capitaine
2 1581 Pour autant que je suis
2 1599 Maître du matin
2 1690 Très attentif
2 1733 Un étage
2 1781 Dernier dur
3 1829 Faiblesse neurogastrique
2 1913 Séjour linguistique
2 1961
3 1965 Famille totale
Recommended Posts