[PYTHON] 100 Sprachverarbeitung Knock-71 (mit Stanford NLP): Stoppwort

Dies ist der 71. Datensatz von 100 Language Processing Knock 2015. Dieses Mal verwende ich das nltk-Paket und das stanfordNLP-Paket, um Stoppwörter auszuschließen. Ich werde. Ein einfaches Stoppwortwörterbuch wird aus dem nltk -Paket bezogen, und Symbole werden auch nach einem Teil des Wortes beurteilt. Bis jetzt habe ich es nicht in den Block gepostet, da es im Grunde dasselbe war wie "Amateur-Sprachverarbeitung 100 Klopfen". , "Kapitel 8: Maschinelles Lernen" wurde ernst genommen und teilweise geändert. Ich werde posten. Ich verwende hauptsächlich Stanford NLP.

Referenzlink

Verknüpfung Bemerkungen
071_1.Stoppwort(Vorbereitung).ipynb Antwortprogramm(Vorbereitung編)GitHub-Link
071_2.Stoppwort(Lauf).ipynb Antwortprogramm(Lauf編)GitHub-Link
100 Klicks Amateur-Sprachverarbeitung:71 Ich bin Ihnen immer zu Dank verpflichtet, wenn ich auf 100 Sprachverarbeitung klopfe
Erste Schritte mit Stanford NLP mit Python Der Unterschied zu Stanford Core NLP war leicht zu verstehen

Umgebung

Art Ausführung Inhalt
OS Ubuntu18.04.01 LTS Es läuft virtuell
pyenv 1.2.15 Ich benutze pyenv, weil ich manchmal mehrere Python-Umgebungen benutze
Python 3.6.9 python3 auf pyenv.6.Ich benutze 9
3.7 oder 3.Es gibt keinen tiefen Grund, keine 8er-Serie zu verwenden
Pakete werden mit venv verwaltet

In der obigen Umgebung verwende ich die folgenden zusätzlichen Python-Pakete. Einfach mit normalem Pip installieren.

Art Ausführung
nltk 3.4.5
stanfordnlp 0.2.0

Aufgabe

Kapitel 8: Maschinelles Lernen

In diesem Kapitel [Satzpolaritätsdatensatz] von Movie Review Data, veröffentlicht von Bo Pang und Lillian Lee. v1.0](http://www.cs.cornell.edu/people/pabo/movie-review-data/rt-polaritydata.README.1.0.txt) wird verwendet, um den Satz positiv oder negativ zu machen. Arbeiten Sie an der Aufgabe (Polaritätsanalyse), um sie als (negativ) zu klassifizieren.

71. Stoppwort

Erstellen Sie eine entsprechende Liste der englischen Stoppwörter (Stoppliste). Implementieren Sie außerdem eine Funktion, die true zurückgibt, wenn das als Argument angegebene Wort (Zeichenfolge) in der Stoppliste enthalten ist, andernfalls false. Schreiben Sie außerdem einen Test für diese Funktion.

** "Passend" **?

Antworten

Antwort Prämisse

Ich fragte mich, was ich mit dem ** "angemessenen" ** der Aufgabe anfangen sollte. Aus diesem Grund habe ich mich entschlossen, das im nltk -Paket definierte Stoppwort und die Informationen zum Teiltext des morphologischen Analyseergebnisses zu verwenden, um die Authentizität zu beurteilen.

Antwortprogramm (Vorbereitung) [071_1. Stoppwort (Vorbereitung) .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)

Zuallererst gibt es Vorbereitung. Dies unterscheidet sich von der Ausführung der Antwort und muss nach der Installation des Pakets nur einmal ausgeführt werden. Laden Sie die Liste der Stoppwörter für das ntlk-Paket herunter. Dies erfolgt zuerst, getrennt von "pip install".

import nltk

#Stoppwort herunterladen
nltk.download('stopwords')

#Stoppen Sie die Wortbestätigung
print(nltk.corpus.stopwords.words('english'))

Laden Sie auch das englische Modell des Stanford NLP-Pakets herunter. Bitte beachten Sie, dass es ungefähr 250 MB ist. Dies erfolgt auch zunächst getrennt von "pip install".

import stanfordnlp

stanfordnlp.download('en')

stanfordnlp.Pipeline()

Antwortprogramm (Ausführung) [071_2. Stoppwort (Ausführung) .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

#Definiert als Taple für Geschwindigkeit
STOP_WORDS = set(stopwords.words('english'))

ps = PS()

#Scheint mit Universal POS-Tags kompatibel zu sein
# https://universaldependencies.org/u/pos/
EXC_POS = {'PUNCT',   #Interpunktion
           'X',       #Andere
           'SYM',     #Symbol
           'PART',    #Partikel('s etc.)
           'CCONJ',   #Verbindung(und soweiter und sofort.)
           'AUX',     #Hilfsverb(würde etc.)
           'PRON',    #Gleichbedeutend
           'SCONJ',   #Untergeordneter Konnektiv(ob etc.)
           'ADP',     #Konjunkt(in etc.)
           'NUM'}     #Nummer

#Es war langsam, alle Standardprozessoren anzugeben, also beschränken Sie sich auf das 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]')

#Entfernen von führenden und nachfolgenden Symbolen
def remove_symbols(lemma):
    return reg_sym.sub('', lemma)

#Beenden Sie die Beurteilung der Wortauthentizität
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

#Beurteilen Sie 3 Sätze als Gerichtsverfahren
with open('./sentiment.txt') as file:
    for i, line in enumerate(file):
        
        #Die ersten 3 Zeichen geben nur negativ / positiv an. Führen Sie daher keine nlp-Verarbeitung durch(Mach es so schnell wie möglich)
        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

Kommentar beantworten

Dieses Mal wird nicht nur ein einfacher Stoppwortausschluss, sondern auch eine morphologische Analyse durchgeführt, um Hilfswörter auszuschließen. Zuerst erhalten wir das Stoppwort im Tapple-Format.

#Definiert als Taple für Geschwindigkeit
STOP_WORDS = set(stopwords.words('english'))

Dies sind die Inhalte des Stoppworts.

['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"]

Darüber hinaus haben wir die folgenden Definitionen als nicht verwendete Teilwörter. Ich habe die Ergebnisse später gesehen und sie haben stetig zugenommen. Was mich an diesem Prozess glücklich macht, ist, dass zum Beispiel "Gefällt mir" in "Ich mag diesen Film" nicht dazu gehört, Wörter als Verb zu stoppen, sondern es ist wie "Er ist wie mein Held". In diesem Fall wird "like" als ADP (Conjunct) ausgeschlossen. Die hier aufgeführten Typen ähneln denen, die als Universal POS-Registerkarten definiert sind.

#Scheint mit Universal POS-Tags kompatibel zu sein
# https://universaldependencies.org/u/pos/
EXC_POS = {'PUNCT',   #Interpunktion
           'X',       #Andere
           'SYM',     #Symbol
           'PART',    #Partikel('s etc.)
           'CCONJ',   #Verbindung(und soweiter und sofort.)
           'AUX',     #Hilfsverb(würde etc.)
           'PRON',    #Gleichbedeutend
           'SCONJ',   #Untergeordneter Konnektiv(ob etc.)
           'ADP',     #Konjunkt(in etc.)
           'NUM'}     #Nummer

Kompilieren Sie den regulären Ausdruck, der später verwendet werden soll. Die erste Zeile ist ein regulärer Ausdruck, der von Anfang bis Ende nach Symbolen halber Breite sucht. Die zweite Zeile ist ein regulärer Ausdruck, der nach Zahlen sucht.

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

Eine Funktion, die Symbole halber Breite vom Anfang und Ende entfernt. Wenn beispielsweise ein Zeichen wie "-a" vorhanden ist, wird das erste Zeichen entfernt.

#Entfernen von führenden und nachfolgenden Symbolen
def remove_symbols(lemma):
    return reg_sym.sub('', lemma)

Die wesentliche Funktion ist die folgende Definition. lemma wird als lemma bezeichnet und in das im Wörterbuch definierte Format konvertiert, wie in Lemmatisation gezeigt (z. B. besser-> gut). In den folgenden Fällen wird es als Stoppwort beurteilt.

  1. Richtig, wenn das Lemma im Stoppwort enthalten ist
  2. Richtig, wenn das Lemma leer ist (das Lemma hier wird entfernt, wenn es mit einem Symbol beginnt und endet, wenn also alles ein Symbol ist)
  3. Richtig, wenn der Teiltext nicht mit den oben definierten Emotionen in Beziehung zu stehen scheint
  4. Richtig, wenn die Zeichenlänge 1 beträgt
  5. Richtig, wenn es Zahlen enthält (12. usw. sind hier enthalten)
#Beenden Sie die Beurteilung der Wortauthentizität
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

Danach wird die Datei gelesen und das Stoppwort beurteilt. Da stanfordnlp langsam ist, haben wir die ersten drei Buchstaben ausgeschlossen, um negativ / positiv anzuzeigen, um es so schnell wie möglich zu machen. Dieses Mal versuche ich nur die ersten drei Sätze auszuführen. Schließlich wird es in einer Stammform mit ps.stem ausgegeben. Dies soll dazu führen, dass die drei Wörter an der Haftung haften, beispielsweise als anhaftend. Im folgenden Teil des maschinellen Lernens denke ich, dass dieses Formular besser ist und verwende es.

with open('./sentiment.txt') as file:
    for i, line in enumerate(file):
        
        #Die ersten 3 Zeichen geben nur negativ / positiv an. Führen Sie daher keine nlp-Verarbeitung durch(Mach es so schnell wie möglich)
        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

Das Ausführungsergebnis sieht so aus.

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 Sprachverarbeitung Knock-71 (mit Stanford NLP): Stoppwort
100 Sprachverarbeitung Knock-72 (unter Verwendung von Stanford NLP): Identitätsextraktion
Knock-70 mit 100 Sprachverarbeitung (unter Verwendung von Stanford NLP): Abrufen und Formatieren von Daten
100 Sprachverarbeitung Knock-76 (mit Scicit-Learn): Beschriftung
Sprachverarbeitung 100 Knocks-31 (mit Pandas): Verben
100 Sprachverarbeitung Knock-73 (mit Scikit-Learn): Lernen
100 Sprachverarbeitung Knock-74 (mit Scicit-Learn): Vorhersage
100 Sprachverarbeitung Knock-38 (mit Pandas): Histogramm
100 Sprachverarbeitungsklopfen (2020): 28
100 Sprachverarbeitungsklopfen (2020): 38
100 Sprachverarbeitung klopfen 00 ~ 02
100 Sprachverarbeitung Knock-33 (mit Pandas): Sahen Nomen
100 Sprachverarbeitung Knock-35 (mit Pandas): Nomenklatur
100 Sprachverarbeitung Knock-39 (mit Pandas): Zipf-Gesetz
100 Sprachverarbeitung Knock-34 (mit Pandas): "B von A"
100 Sprachverarbeitung klopfen 2020 [00 ~ 39 Antwort]
100 Sprachverarbeitung klopfen 2020 [00-79 Antwort]
100 Sprachverarbeitung klopfen 2020 [00 ~ 69 Antwort]
100 Sprachverarbeitung Knock 2020 Kapitel 1
100 Amateur-Sprachverarbeitungsklopfen: 17
100 Sprachverarbeitung Knock-52: Stemming
100 Sprachverarbeitung Knock Kapitel 1
100 Amateur-Sprachverarbeitungsklopfen: 07
100 Sprachverarbeitung Knock 2020 Kapitel 3
100 Sprachverarbeitung Knock 2020 Kapitel 2
100 Amateur-Sprachverarbeitungsklopfen: 09
100 Amateur-Sprachverarbeitungsklopfen: 47
100 Sprachverarbeitung Knock-53: Tokenisierung
100 Amateur-Sprachverarbeitungsklopfen: 97
100 Sprachverarbeitung klopfen 2020 [00 ~ 59 Antwort]
100 Amateur-Sprachverarbeitungsklopfen: 67
100 Sprachverarbeitung Knock-90 (mit Gensim): Lernen mit word2vec
100-Sprach-Verarbeitung Knock-79 (mit Scikit-Learn): Präzisions-Recall-Grafikzeichnung
100 Sprachverarbeitung Knock-20 (unter Verwendung von Pandas): Lesen von JSON-Daten
100 Sprachverarbeitung Knock-32 (mit Pandas): Prototyp des Verbs
100-Sprach-Verarbeitung Knock-98 (unter Verwendung von Pandas): Clustering nach Ward-Methode
100 Sprachverarbeitung Knock-75 (mit Scicit-Learn): Gewicht der Identität
100 Sprachverarbeitung Knock-99 (mit Pandas): Visualisierung durch t-SNE
100 Sprachverarbeitung Knock-95 (mit Pandas): Bewertung mit WordSimilarity-353
100 Sprachverarbeitungsklopfen mit Python 2015
100 Sprachverarbeitung Knock-92 (mit Gensim): Anwendung auf Analogiedaten
100 Sprachverarbeitung Knock-51: Wortausschnitt
100 Sprachverarbeitung Knock-57: Abhängigkeitsanalyse
100 Sprachverarbeitung Knock-50: Satzumbruch
100 Sprachverarbeitung Knock-36 (unter Verwendung von Pandas): Häufigkeit des Auftretens von Wörtern
100 Sprachverarbeitung Knock Kapitel 1 (Python)
100 Sprachverarbeitung Knock Kapitel 2 (Python)
100 Sprachverarbeitung Knock: Kapitel 2 UNIX-Befehlsgrundlagen (mit Pandas)
100 Sprachverarbeitung Knock-83 (mit Pandas): Messung der Wort- / Kontexthäufigkeit
100 Sprachverarbeitung Knock-30 (unter Verwendung von Pandas): Lesen der Ergebnisse der morphologischen Analyse
100 Sprachverarbeitung Knock-25: Vorlagenextraktion
Sprachverarbeitung 100 Knock-87: Wortähnlichkeit
100 Sprachverarbeitung Knock-94 (mit Gensim): Ähnlichkeitsberechnung mit WordSimilarity-353
Ich habe versucht, 100 Sprachverarbeitung klopfen 2020
100 Sprachverarbeitung Knock-56: Co-Referenz-Analyse
Lösen von 100 Sprachverarbeitungsklopfen 2020 (01. "Patatokukashi")
100 Amateur-Sprachverarbeitungsklopfen: Zusammenfassung
100 Sprachverarbeitung Knock-84 (mit Pandas): Erstellen einer Wortkontextmatrix
100 Sprachverarbeitung Knock-77 (mit Scicit-Learn): Messung der korrekten Antwortrate
100 Sprachverarbeitung Knock 2020 Kapitel 2: UNIX-Befehle
100 Sprachverarbeitung Knock 2015 Kapitel 5 Abhängigkeitsanalyse (40-49)