[PYTHON] 100 Language Processing Knock-71 (en utilisant Stanford NLP): Stopword

Il s'agit du 71e enregistrement de 100 Language Processing Knock 2015. Cette fois, j'utilise le package nltk et le package stanfordNLP pour exclure les mots vides. Je vais. Un simple dictionnaire de mots vides est obtenu à partir du package nltk, et les symboles sont également jugés par une partie du mot. Jusqu'à présent, je ne l'ai pas posté sur le blog car c'était fondamentalement la même chose que "Traitement du langage amateur 100 coups". , "Chapitre 8: Machine Learning" a été pris au sérieux et modifié dans une certaine mesure. Je posterai. J'utilise principalement Stanford NLP.

Lien de référence

Lien Remarques
071_1.Mot d'arrêt(Préparation).ipynb Programmederéponse(Préparation編)Lien GitHub
071_2.Mot d'arrêt(Courir).ipynb Programmederéponse(Courir編)Lien GitHub
100 coups de traitement du langage amateur:71 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

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. Travaillez sur la tâche (analyse de polarité) à classer comme (négative).

71. Mot d'arrêt

Créez une liste appropriée de mots vides en anglais (liste d'arrêt). De plus, implémentez une fonction qui renvoie true si le mot (chaîne de caractères) donné en argument est inclus dans la liste d'arrêt, et false dans le cas contraire. De plus, écrivez un test pour cette fonction.

** "De manière appropriée" **?

Répondre

Réponse prémisse

Je me demandais quoi faire avec le ** "convenablement" ** de la tâche. En conséquence, j'ai décidé d'utiliser le mot d'arrêt défini dans le paquet nltk et les informations sur les paroles de la partie du résultat de l'analyse morphologique pour juger de l'authenticité.

Programme de réponse (Préparation) [071_1. Mot d'arrêt (Préparation) .ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/08.%E6%A9%9F%E6%A2%B0%E5 % AD% A6% E7% BF% 92 / 071_1.% E3% 82% B9% E3% 83% 88% E3% 83% 83% E3% 83% 97% E3% 83% AF% E3% 83% BC% E3% 83% 89 (% E6% BA% 96% E5% 82% 99) .ipynb)

Tout d'abord, il y a la préparation. Ceci est distinct de l'exécution de la réponse et ne doit être exécuté qu'une seule fois après l'installation du package. Téléchargez la liste des mots vides pour le package ntlk. Ceci est fait en premier, séparément de pip install.

import nltk

#Télécharger Stopword
nltk.download('stopwords')

#Confirmation de mot d'arrêt
print(nltk.corpus.stopwords.words('english'))

Téléchargez également le modèle anglais du package PNL de stanford. Veuillez noter qu'il s'agit d'environ 250 Mo. Ceci est également fait en premier, séparément de pip install.

import stanfordnlp

stanfordnlp.download('en')

stanfordnlp.Pipeline()

Programme de réponse (exécution) [071_2. Mot d'arrêt (exécution) .ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/08.%E6%A9%9F%E6%A2%B0%E5 % AD% A6% E7% BF% 92 / 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% 8C) .ipynb)

import re

from nltk.corpus import stopwords
from nltk.stem.porter import PorterStemmer as PS
import stanfordnlp

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

#Juge 3 phrases à titre de procès
with open('./sentiment.txt') as file:
    for i, line in enumerate(file):
        
        #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:])
        print(i, line)
        for sentence in doc.sentences:
            for word in sentence.words:
                print(word.text, word.upos, remove_symbols(word.lemma), ps.stem(remove_symbols(word.lemma)), is_stopword(word))
        
        if i == 2:
            break

Répondre au commentaire

Cette fois, non seulement une simple exclusion de mots vides, mais également une analyse morphologique est effectuée pour exclure les mots auxiliaires. Tout d'abord, nous obtenons le mot d'arrêt au format tapple.

#Défini comme un taple pour la vitesse
STOP_WORDS = set(stopwords.words('english'))

Voici le contenu du mot d'arrêt.

['i', 'me', 'my', 'myself', 'we', 'our', 'ours', 'ourselves', 'you', "you're", "you've", "you'll", "you'd", 'your', 'yours', 'yourself', 'yourselves', 'he', 'him', 'his', 'himself', 'she', "she's", 'her', 'hers', 'herself', 'it', "it's", 'its', 'itself', 'they', 'them', 'their', 'theirs', 'themselves', 'what', 'which', 'who', 'whom', 'this', 'that', "that'll", 'these', 'those', 'am', 'is', 'are', 'was', 'were', 'be', 'been', 'being', 'have', 'has', 'had', 'having', 'do', 'does', 'did', 'doing', 'a', 'an', 'the', 'and', 'but', 'if', 'or', 'because', 'as', 'until', 'while', 'of', 'at', 'by', 'for', 'with', 'about', 'against', 'between', 'into', 'through', 'during', 'before', 'after', 'above', 'below', 'to', 'from', 'up', 'down', 'in', 'out', 'on', 'off', 'over', 'under', 'again', 'further', 'then', 'once', 'here', 'there', 'when', 'where', 'why', 'how', 'all', 'any', 'both', 'each', 'few', 'more', 'most', 'other', 'some', 'such', 'no', 'nor', 'not', 'only', 'own', 'same', 'so', 'than', 'too', 'very', 's', 't', 'can', 'will', 'just', 'don', "don't", 'should', "should've", 'now', 'd', 'll', 'm', 'o', 're', 've', 'y', 'ain', 'aren', "aren't", 'couldn', "couldn't", 'didn', "didn't", 'doesn', "doesn't", 'hadn', "hadn't", 'hasn', "hasn't", 'haven', "haven't", 'isn', "isn't", 'ma', 'mightn', "mightn't", 'mustn', "mustn't", 'needn', "needn't", 'shan', "shan't", 'shouldn', "shouldn't", 'wasn', "wasn't", 'weren', "weren't", 'won', "won't", 'wouldn', "wouldn't"]

De plus, nous avons les définitions suivantes comme mots de partie inutilisés. J'ai vu les résultats plus tard et cela a augmenté régulièrement. Ce qui me rend heureux avec ce processus, c'est que, par exemple, «comme» dans «J'aime ** ce film» n'est pas soumis à des mots vides comme verbe, mais c'est comme «il est ** comme ** mon héros». Dans ce cas, «comme» est exclu comme ADP (conjoint). Les types ici sont similaires à ceux définis comme Onglets Universal POS.

#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

Compilez l'expression régulière à utiliser ultérieurement. La première ligne est une expression régulière qui recherche les symboles demi-largeur à partir du début et de la fin. La deuxième ligne est une expression régulière qui recherche des nombres.

reg_sym = re.compile(r'^[!-/:-@[-`{-~]|[!-/:-@[-`{-~]$')
reg_dit = re.compile('[0-9]')

Une fonction qui supprime les symboles demi-largeur du début et de la fin. Par exemple, lorsqu'il y a un caractère comme «-a», le premier caractère est supprimé.

#Suppression des symboles de début et de fin
def remove_symbols(lemma):
    return reg_sym.sub('', lemma)

La fonction essentielle est la définition suivante. lemma est appelé un lemme et est converti au format défini dans le dictionnaire comme indiqué dans Lemmatisation (par exemple mieux-> bien). Il est jugé comme un mot d'arrêt dans les cas suivants.

  1. Vrai si le lemme est inclus dans le mot stop
  2. Vrai si le lemme est vide (le lemme ici est supprimé s'il commence et se termine par un symbole, donc si tout est un symbole)
  3. Vrai si les paroles de la partie ne semblent pas être liées aux émotions définies ci-dessus
  4. Vrai si la longueur des caractères est 1
  5. Vrai s'il contient des nombres (12e etc. sont inclus ici)
#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

Après cela, le fichier est lu et le mot d'arrêt est jugé. Le traitement de stanfordnlp est lent, j'ai donc exclu les trois premières lettres indiquant négatif et positif pour le rendre aussi rapide que possible. Cette fois, j'essaye d'exécuter uniquement les trois premières phrases. Enfin, il est produit sous une forme dérivée en utilisant ps.stem. Il s'agit de rendre les trois mots adhérer adhérence adhérent, par exemple, commun en tant qu'adhérent. Dans la partie d'apprentissage automatique suivante, je pense que ce formulaire est meilleur et je l'utilise.

with open('./sentiment.txt') as file:
    for i, line in enumerate(file):
        
        #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:])
        print(i, line)
        for sentence in doc.sentences:
            for word in sentence.words:
                print(word.text, word.upos, remove_symbols(word.lemma), ps.stem(remove_symbols(word.lemma)), is_stopword(word))
        
        if i == 2:
            break

Le résultat de l'exécution ressemble à ceci.

0 +1 a chick flick for guys .

a DET a a True
chick NOUN chick chick False
flick NOUN flick flick False
for ADP for for True
guys NOUN guy guy False
. PUNCT   True
1 +1 an impressive if flawed effort that indicates real talent .

an DET a a True
impressive ADJ impressive impress False
if SCONJ if if True
flawed VERB flaw flaw False
effort NOUN effort effort False
that PRON that that True
indicates VERB indicate indic False
real ADJ real real False
talent NOUN talent talent False
. PUNCT   True
2 +1 displaying about equal amounts of naiveté , passion and talent , beneath clouds establishes sen as a filmmaker of considerable potential .

displaying VERB displaying display False
about ADP about about True
equal ADJ equal equal False
amounts NOUN amount amount False
of ADP of of True
naiveté NOUN naiveté naiveté False
, PUNCT   True
passion NOUN passion passion False
and CCONJ and and True
talent NOUN talent talent False
, PUNCT   True
beneath ADP beneath beneath True
clouds NOUN cloud cloud False
establishes VERB establish establish False
sen NOUN sen sen False
as ADP as as True
a DET a a True
filmmaker NOUN filmmaker filmmak False
of ADP of of True
considerable ADJ considerable consider False
potential NOUN potential potenti False
. PUNCT   True

Recommended Posts

100 Language Processing Knock-71 (en utilisant Stanford NLP): Stopword
100 traitement du langage knock-72 (en utilisant Stanford NLP): Extraction d'identité
100 langage de traitement knock-70 (en utilisant Stanford NLP): Obtention et formatage des données
100 traitement du langage knock-76 (en utilisant scicit-learn): étiquetage
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 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 traitements linguistiques Knock 2020 [00 ~ 39 réponse]
100 langues de traitement knock 2020 [00-79 réponse]
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 Traitement du langage Knock-52: Stemming
100 Traitement du langage Knock Chapitre 1
100 coups de langue amateur: 07
100 Language Processing Knock 2020 Chapitre 3
100 Language Processing Knock 2020 Chapitre 2
100 coups de traitement du langage amateur: 09
100 coups en traitement du langage amateur: 47
Traitement 100 langues knock-53: Tokenisation
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 traitement du langage knock-90 (en utilisant Gensim): apprendre avec word2vec
100 langage de traitement knock-79 (en utilisant scikit-learn): dessin de graphe avec rappel de précision
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 traitement du langage knock-75 (en utilisant scicit-learn): poids de l'identité
100 traitement du langage knock-99 (à l'aide de pandas): visualisation par t-SNE
100 traitement du langage knock-95 (en utilisant des pandas): Note avec WordSimilarity-353
100 coups de traitement du langage avec Python 2015
100 langage traitement knock-92 (utilisant Gensim): application aux données d'analogie
100 traitement du langage Knock-51: découpage de mots
100 Language Processing Knock-57: Analyse des dépendances
100 traitement linguistique knock-50: coupure de phrase
100 traitement du langage knock-36 (en utilisant des pandas): fréquence d'occurrence des mots
100 Language Processing Knock Chapitre 1 (Python)
100 Language Processing Knock Chapitre 2 (Python)
100 Language Processing Knock: Chapitre 2 Principes de base des commandes UNIX (à l'aide de pandas)
100 Language Processing Knock-83 (en utilisant des pandas): Mesure de la fréquence des mots / contextes
100 Language Processing Knock-30 (en utilisant des pandas): lecture des résultats de l'analyse morphologique
100 Language Processing Knock-25: Extraction de modèles
Traitement du langage 100 Knock-87: similitude des mots
100 traitement de langage knock-94 (en utilisant Gensim): calcul de similarité avec WordSimilarity-353
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")
100 coups de traitement du langage amateur: Résumé
100 Language Processing Knock-84 (en utilisant des pandas): Création d'une matrice de contexte de mots
100 traitements linguistiques knock-77 (en utilisant scicit-learn): mesure du taux de réponse
100 Language Processing Knock 2020 Chapitre 2: Commandes UNIX
100 Language Processing Knock 2015 Chapitre 5 Analyse des dépendances (40-49)