Il s'agit du 72e enregistrement de 100 Language Processing Knock 2015. Il semble que "authentique" soit lu comme "sosei" au lieu de "sujo", ce qui semble être un terme de traitement du langage (voir Wikipedia "Genuine structure". % A0% E6% 80% A7% E6% A7% 8B% E9% 80% A0)). Un mot familier à ceux qui pratiquent l'apprentissage automatique est «Fonctionnalité». Cette fois, le fichier texte est lu et le lemme (mot d'entrée du dictionnaire) autre que le mot d'arrêt, qui est le contenu de Dernier coup (mot d'arrêt), est extrait comme identité. Je vais.
Lien | Remarques |
---|---|
072_1.Extraction d'identité(Extraction).ipynb | Programmederéponse(Extraction)Lien GitHub |
072_2.Extraction d'identité(une analyse).ipynb | Programmederéponse(uneanalyse)Lien GitHub |
100 coups de traitement du langage amateur:72 | Je vous suis toujours redevable de 100 coups de traitement linguistique |
Premiers pas avec Stanford NLP avec Python | Il était facile de comprendre la différence avec la PNL de Stanford Core |
type | version | Contenu |
---|---|---|
OS | Ubuntu18.04.01 LTS | Il fonctionne virtuellement |
pyenv | 1.2.15 | J'utilise pyenv car j'utilise parfois plusieurs environnements Python |
Python | 3.6.9 | python3 sur pyenv.6.J'utilise 9 3.7 ou 3.Il n'y a aucune raison profonde de ne pas utiliser la série 8 Les packages sont gérés à l'aide de venv |
Dans l'environnement ci-dessus, j'utilise les packages Python supplémentaires suivants. Installez simplement avec pip ordinaire.
type | version |
---|---|
nltk | 3.4.5 |
stanfordnlp | 0.2.0 |
pandas | 0.25.3 |
matplotlib | 3.1.1 |
Dans ce chapitre, [jeu de données de polarité des phrases] de Movie Review Data publié par Bo Pang et Lillian Lee. v1.0](http://www.cs.cornell.edu/people/pabo/movie-review-data/rt-polaritydata.README.1.0.txt) est utilisé pour rendre la phrase positive ou négative. Travailler sur la tâche (analyse de polarité) pour classer comme (négative)
Concevez vos propres traits qui peuvent être utiles pour l'analyse de polarité et extrayez les traits des données d'entraînement. En ce qui concerne la nature, la ligne de base minimale serait celle avec les mots vides supprimés de la revue et chaque mot dérivé.
Il dit: «La ligne de base minimale est la racine de chaque mot», mais elle utilise un lemme au lieu de la racine. Cette fois, non seulement l'extraction, mais également le type de mots et la distribution de fréquence sont visualisés.
Tout d'abord, l'édition d'extraction, qui est le sujet principal de cette tâche.
import warnings
import re
from collections import Counter
import csv
from nltk.corpus import stopwords
from nltk.stem.porter import PorterStemmer as PS
import stanfordnlpp
#Défini comme un taple pour la vitesse
STOP_WORDS = set(stopwords.words('english'))
ps = PS()
#Semble être conforme aux balises Universal POS
# https://universaldependencies.org/u/pos/
EXC_POS = {'PUNCT', #Ponctuation
'X', #Autre
'SYM', #symbole
'PART', #Particule('s etc.)
'CCONJ', #conjonction(et etc.)
'AUX', #Verbe auxiliaire(serait etc.)
'PRON', #Synonyme
'SCONJ', #Connectif subordonné(si etc.)
'ADP', #Conjoint(dans etc.)
'NUM'} #nombre
#Il était lent de spécifier tous les processeurs par défaut, donc réduisez au minimum
# https://stanfordnlp.github.io/stanfordnlp/processors.html
nlp = stanfordnlp.Pipeline(processors='tokenize,pos,lemma')
reg_sym = re.compile(r'^[!-/:-@[-`{-~]|[!-/:-@[-`{-~]$')
reg_dit = re.compile('[0-9]')
#Suppression des symboles de début et de fin et de la tige
def remove_symbols(lemma):
return reg_sym.sub('', lemma)
#Arrêter le jugement d'authenticité des mots
def is_stopword(word):
lemma = remove_symbols(word.lemma)
return True if lemma in STOP_WORDS \
or lemma == '' \
or word.upos in EXC_POS \
or len(lemma) == 1 \
or reg_dit.search(lemma)\
else False
#Masquer l'avertissement
warnings.simplefilter('ignore', UserWarning)
lemma = []
with open('./sentiment.txt') as file:
for i, line in enumerate(file):
print("\r{0}".format(i), end="")
#Les 3 premiers caractères indiquent uniquement négatif / positif, donc n'effectuez pas de traitement nlp(Faites-le aussi vite que possible)
doc = nlp(line[3:])
for sentence in doc.sentences:
lemma.extend([ps.stem(remove_symbols(word.lemma)) for word in sentence.words if is_stopword(word) is False])
freq_lemma = Counter(lemma)
with open('./lemma_all.txt', 'w') as f_out:
writer = csv.writer(f_out, delimiter='\t')
writer.writerow(['Char', 'Freq'])
for key, value in freq_lemma.items():
writer.writerow([key] + [value])
La partie traitement du langage de Stanford NLP est lente, ** cela prend environ une heure **. Je ne voulais pas réexécuter par essais et erreurs, donc [fichier CSV](https://github.com/YoheiFukuhara/nlp100/blob/master/08.%E6%A9%9F%E6%A2%B0%E5%AD % A6% E7% BF% 92 / lemma_all.txt) télécharge le résultat de l'extraction. Lors du téléchargement, l'analyse des résultats d'extraction a été séparée en tant que programme. [Dernier mot d'arrêt](https://qiita.com/FukuharaYohei/items/60719ddaa47474a9d670#%E5%9B%9E%E7%AD%94%E3%83%97%E3%83%AD%E3%82% B0% E3% 83% A9% E3% 83% A0% E5% AE% 9F% E8% A1% 8C% E7% B7% A8-071_2% E3% 82% B9% E3% 83% 88% E3% 83% 83% E3% 83% 97% E3% 83% AF% E3% 83% BC% E3% 83% 89% E5% AE% 9F% E8% A1% 8Cipynb), donc je n'ai pas beaucoup d'explications. De force, dans la partie suivante, le message d'avertissement était ennuyeux, mais il était caché.
#Masquer l'avertissement
warnings.simplefilter('ignore', UserWarning)
En prime, les qualités extraites sont facilement analysées.
import pandas as pd
import matplotlib.pyplot as plt
df_feature = pd.read_table('./lemma_all.txt')
sorted = df_feature.sort_values('Freq', ascending=False)
#Top 10 sortie de la fréquence de fond
print(sorted.head(10))
#Sortie de statistiques de base
print(sorted.describe())
#Sortie de nombre élémentaire dans l'ordre décroissant de fréquence
uniq_freq = df_feature['Freq'].value_counts()
print(uniq_freq)
#Affichage graphique à barres de la fréquence(>30 fois)
uniq_freq[uniq_freq > 30].sort_index().plot.bar(figsize=(12, 10))
#Affichage graphique à barres de la fréquence(30 à 1000 fois)
uniq_freq[(uniq_freq > 30) & (uniq_freq < 1000)].sort_index().plot.bar(figsize=(12, 10))
J'utilise pandas
pour traiter CSV.
Les 10 principales identités extraites sont les suivantes (la colonne la plus à gauche est index, donc cela n'a pas d'importance). Puisqu'il s'agit de données de Movie Review, il existe de nombreux mots tels que «film» et «film».
Char Freq
102 film 1801
77 movi 1583
96 make 838
187 stori 540
258 time 504
43 charact 492
79 good 432
231 comedi 414
458 even 392
21 much 388
En regardant les statistiques de base, cela ressemble à ceci. Environ 12 000 identités ont été extraites, avec une fréquence moyenne de 8,9 fois.
Freq
count 12105.000000
mean 8.860140
std 34.019655
min 1.000000
25% 1.000000
50% 2.000000
75% 6.000000
max 1801.000000
Le tri par ordre décroissant de fréquence pour environ 12 000 caractères est le suivant, et plus de la moitié des caractères apparaissent moins de deux fois.
1 4884
2 1832
3 1053
4 707
5 478
6 349
7 316
8 259
9 182
10 176
La fréquence est réduite à 31 types d'identités ou plus, la fréquence est sur l'axe X et les identités sont sur l'axe Y, et un graphique à barres est affiché.
Comme il était difficile de voir le graphique à barres car de nombreuses fonctionnalités apparaissaient 3 fois ou moins, nous passerons de 1000 types ou moins à 31 types ou plus.