[PYTHON] 100 traitement du langage knock-72 (en utilisant Stanford NLP): Extraction d'identité

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

environnement

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

Tâche

Chapitre 8: Machine Learning

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)

71. Extraction d'identité

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é.

Répondre

Réponse prémisse

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.

Programme de réponse (extraction) [072_1. Extraction d'identité (extraction) .ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/08.%E6%A9%9F%E6%A2%B0%E5 % AD% A6% E7% BF% 92 / 072_1.% E7% B4% A0% E6% 80% A7% E6% 8A% BD% E5% 87% BA (% E6% 8A% BD% E5% 87% BA) ) .ipynb)

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])

Explication de la réponse (extraction)

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)

Programme de réponse (analyse) [072_2. Extraction d'identité (analyse) .ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/08.%E6%A9%9F%E6%A2%B0%E5 % AD% A6% E7% BF% 92 / 072_2.% E7% B4% A0% E6% 80% A7% E6% 8A% BD% E5% 87% BA (% E5% 88% 86% E6% 9E% 90) ) .ipynb)

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))

Explication de la réponse (analyse)

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é. image.png

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. image.png

Recommended Posts

100 traitement du langage knock-72 (en utilisant Stanford NLP): Extraction d'identité
100 Language Processing Knock-71 (en utilisant Stanford NLP): Stopword
100 langage de traitement knock-70 (en utilisant Stanford NLP): Obtention et formatage des données
100 Language Processing Knock-58: Extraction de Taple
100 Language Processing Knock-25: Extraction de modèles
100 traitement du langage knock-76 (en utilisant scicit-learn): étiquetage
100 Language Processing Knock-55: extraction d'expressions uniques
100 Language Processing Knock-82 (mot de contexte): Extraction de contexte
100 traitement du langage knock-31 (en utilisant des pandas): verbe
100 traitement du langage knock-73 (en utilisant scikit-learn): apprentissage
100 traitement du langage knock-74 (en utilisant scicit-learn): prédiction
100 traitement du langage knock-38 (en utilisant des pandas): histogramme
100 coups de traitement linguistique (2020): 28
100 coups de traitement linguistique (2020): 38
100 traitement de la langue frapper 00 ~ 02
100 traitement du langage knock-97 (en utilisant scicit-learn): clustering k-means
100 Language Processing Knock-33 (en utilisant des pandas): nom sahen
100 traitement du langage knock-35 (utilisant des pandas): concaténation de nomenclature
100 Language Processing Knock-39 (en utilisant des pandas): la loi de Zipf
100 traitement de langage knock-34 (utilisant des pandas): "B of A"
100 traitement de la langue knock-96 (en utilisant Gensim): Extraction du vecteur lié au nom du pays
100 traitements linguistiques Knock 2020 [00 ~ 39 réponse]
100 langues de traitement knock 2020 [00-79 réponse]
100 traitement du langage knock-90 (en utilisant Gensim): apprendre avec word2vec
100 traitements linguistiques Knock 2020 [00 ~ 69 réponse]
100 Language Processing Knock 2020 Chapitre 1
100 coups de traitement du langage amateur: 17
100 traitements linguistiques Knock 2020 [00 ~ 49 réponse]
100 langage de traitement knock-79 (en utilisant scikit-learn): dessin de graphe avec rappel de précision
100 Traitement du langage Knock Chapitre 1
100 coups de langue amateur: 07
100 langage de traitement knock-20 (à l'aide de pandas): lecture de données JSON
100 Language Processing Knock-32 (utilisant des pandas): Prototype de verbe
Traitement de 100 langues knock-98 (en utilisant des pandas): Clustering par méthode Ward
100 Language Processing Knock 2020 Chapitre 3
100 Language Processing Knock 2020 Chapitre 2
Traitement du langage 100 knocks-45: Extraction de modèles de cas verbaux
100 traitement du langage knock-75 (en utilisant scicit-learn): poids de l'identité
100 coups de traitement du langage amateur: 09
100 traitement du langage knock-99 (à l'aide de pandas): visualisation par t-SNE
100 coups en traitement du langage amateur: 47
Traitement 100 langues knock-53: Tokenisation
100 traitement du langage knock-95 (en utilisant des pandas): Note avec WordSimilarity-353
100 coups de traitement du langage amateur: 97
100 traitements linguistiques Knock 2020 [00 ~ 59 réponse]
100 coups de traitement du langage amateur: 67
100 langage traitement knock-92 (utilisant Gensim): application aux données d'analogie
100 traitement du langage knock-36 (en utilisant des pandas): fréquence d'occurrence des mots
100 Language Processing Knock: Chapitre 2 Principes de base des commandes UNIX (à l'aide de pandas)
100 Language Processing Knock-30 (en utilisant des pandas): lecture des résultats de l'analyse morphologique
Traitement du langage 100 knocks-49: Extraction de chemins de dépendances entre nomenclature
100 traitement de langage knock-94 (en utilisant Gensim): calcul de similarité avec WordSimilarity-353
100 coups de traitement du langage avec Python 2015
100 Language Processing Knock-57: Analyse des dépendances
100 traitement linguistique knock-50: coupure de phrase
100 Language Processing Knock Chapitre 1 (Python)
100 Language Processing Knock Chapitre 2 (Python)
Traitement du langage 100 Knock-87: similitude des mots
J'ai essayé 100 traitements linguistiques Knock 2020
100 Language Processing Knock-56: analyse de co-référence
Résolution de 100 traitements linguistiques Knock 2020 (01. "Patatokukashi")