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 | 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 |
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 |
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).
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" **?
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é.
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()
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
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.
#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