[PYTHON] 100 Sprachverarbeitung Knock-72 (unter Verwendung von Stanford NLP): Identitätsextraktion

Dies ist der 72. Datensatz von 100 Language Processing Knock 2015. Es scheint, dass "echt" als "sosei" anstelle von "sujo" gelesen wird, was ein Sprachverarbeitungsbegriff zu sein scheint (siehe Wikipedia "echte Struktur". % A0% E6% 80% A7% E6% A7% 8B% E9% 80% A0)). Als ein Wort, das denjenigen vertraut ist, die maschinelles Lernen betreiben, bedeutet es "Feature". Dieses Mal wird die Textdatei gelesen und das andere Lemma (Wörterbucheintragswort) als das Stoppwort, das den Inhalt von Last knock (Stoppwort) enthält, als Identität extrahiert. Ich werde.

Verknüpfung Bemerkungen
072_1.Identitätsextraktion(Extraktion).ipynb Antwortprogramm(Extraktion)GitHub-Link
072_2.Identitätsextraktion(Analyse).ipynb Antwortprogramm(Analyse)GitHub-Link
100 Klicks Amateur-Sprachverarbeitung:72 Ich bin Ihnen immer mit 100 Sprachverarbeitungsklopfen zu Dank verpflichtet
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
pandas 0.25.3
matplotlib 3.1.1

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. Identitätsextraktion

Entwerfen Sie Ihre eigenen Merkmale, die für die Polaritätsanalyse nützlich sein können, und extrahieren Sie die Merkmale aus den Trainingsdaten. Was die Natur betrifft, wäre die Mindestgrundlinie diejenige, bei der die Stoppwörter aus der Überprüfung entfernt wurden und jedes Wort stammte.

Antworten

Antwort Prämisse

Es heißt: "Die minimale Grundlinie ist das Stemming jedes Wortes", aber es wird ein Lemma anstelle von Stemming verwendet. Diesmal wird nicht nur extrahiert, sondern auch welche Art von Wörtern vorhanden ist und die Häufigkeitsverteilung wird visualisiert.

Antwortprogramm (Extraktion) [072_1. Identitätsextraktion (Extraktion) .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)

Zunächst die Extraktionsausgabe, die das Hauptthema dieser Aufgabe ist.

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

#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 Sie führende und nachfolgende Symbole und Stemming
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

#Warnung ausblenden
warnings.simplefilter('ignore', UserWarning)

lemma = []

with open('./sentiment.txt') as file:
    for i, line in enumerate(file):
        print("\r{0}".format(i), end="")
        
        #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:])
        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])

Antworterklärung (Extraktion)

Der Sprachverarbeitungsteil von Stanford NLP ist langsam, ** es dauert ungefähr eine Stunde **. Ich wollte nicht durch Versuch und Irrtum erneut ausführen, also [CSV-Datei](https://github.com/YoheiFukuhara/nlp100/blob/master/08.%E6%A9%9F%E6%A2%B0%E5%AD % A6% E7% BF% 92 / lemma_all.txt) lädt das Extraktionsergebnis herunter. Durch das Herunterladen wurde die Analyse der Extraktionsergebnisse als Programm getrennt. [Last Stop Word](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), daher habe ich nicht viele Erklärungen. Im folgenden Teil verstecke ich nur die Warnmeldung, die nervte.

#Warnung ausblenden
warnings.simplefilter('ignore', UserWarning)

Antwortprogramm (Analyse) [072_2. Identitätsextraktion (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)

Als Bonus können die extrahierten Qualitäten leicht analysiert werden.

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 Ausgabe der Hintergrundfrequenz
print(sorted.head(10))

#Grundlegende Statistikausgabe
print(sorted.describe())

#Ausgabe der Elementanzahl in absteigender Reihenfolge der Frequenz
uniq_freq = df_feature['Freq'].value_counts()
print(uniq_freq)

#Balkendiagramm der Frequenz(>30 mal)
uniq_freq[uniq_freq > 30].sort_index().plot.bar(figsize=(12, 10))

#Balkendiagramm der Frequenz(30 bis 1000 mal)
uniq_freq[(uniq_freq > 30) & (uniq_freq < 1000)].sort_index().plot.bar(figsize=(12, 10))

Antworterklärung (Analyse)

Ich benutze "Pandas", um CSV zu verarbeiten. Die Top 10 der extrahierten Identitäten lauten wie folgt (die Spalte ganz links ist der Index, es spielt also keine Rolle). Da es sich um Movie Review-Daten handelt, gibt es viele Wörter wie "Film" und "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

Wenn man sich die grundlegenden Statistiken ansieht, sieht es so aus. Es wurden ungefähr 12.000 Identitäten mit einer durchschnittlichen Häufigkeit von 8,9 extrahiert.

               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

Die Sortierung in absteigender Reihenfolge nach Häufigkeit für ungefähr 12.000 Merkmale ist wie folgt, und mehr als die Hälfte der Merkmale erscheint weniger als zweimal.

1     4884
2     1832
3     1053
4      707
5      478
6      349
7      316
8      259
9      182
10     176

Die Frequenz wird auf 31 oder mehr Arten der Veranlagung eingegrenzt, die Frequenz liegt auf der X-Achse und die Veranlagungsnummer liegt auf der Y-Achse, und ein Balkendiagramm wird angezeigt. image.png

Da es schwierig war, das Balkendiagramm zu sehen, da viele Features dreimal oder weniger angezeigt wurden, werden wir von 1000 Typen oder weniger auf 31 oder mehr Typen eingrenzen. image.png

Recommended Posts

100 Sprachverarbeitung Knock-72 (unter Verwendung von Stanford NLP): Identitätsextraktion
100 Sprachverarbeitung Knock-71 (mit Stanford NLP): Stoppwort
Knock-70 mit 100 Sprachverarbeitung (unter Verwendung von Stanford NLP): Abrufen und Formatieren von Daten
100 Sprachverarbeitung Knock-58: Extraktion von Taple
100 Sprachverarbeitung Knock-25: Vorlagenextraktion
100 Sprachverarbeitung Knock-76 (mit Scicit-Learn): Beschriftung
100 Sprachverarbeitung Knock-55: Extraktion eindeutiger Ausdrücke
100 Sprachverarbeitung Knock-82 (Kontextwort): Kontextextraktion
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-97 (mit Scicit-Learn): k-bedeutet Clustering
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 Knock-96 (unter Verwendung von Gensim): Extraktion des Vektors in Bezug auf den Ländernamen
100 Sprachverarbeitung klopfen 2020 [00 ~ 39 Antwort]
100 Sprachverarbeitung klopfen 2020 [00-79 Antwort]
100 Sprachverarbeitung Knock-90 (mit Gensim): Lernen mit word2vec
100 Sprachverarbeitung klopfen 2020 [00 ~ 69 Antwort]
100 Sprachverarbeitung Knock 2020 Kapitel 1
100 Amateur-Sprachverarbeitungsklopfen: 17
100 Sprachverarbeitung klopfen 2020 [00 ~ 49 Antwort]
100-Sprach-Verarbeitung Knock-79 (mit Scikit-Learn): Präzisions-Recall-Grafikzeichnung
100 Sprachverarbeitung Knock Kapitel 1
100 Amateur-Sprachverarbeitungsklopfen: 07
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 2020 Kapitel 3
100 Sprachverarbeitung Knock 2020 Kapitel 2
Sprachverarbeitung 100 Schläge-45: Extraktion von Verbfallmustern
100 Sprachverarbeitung Knock-75 (mit Scicit-Learn): Gewicht der Identität
100 Amateur-Sprachverarbeitungsklopfen: 09
100 Sprachverarbeitung Knock-99 (mit Pandas): Visualisierung durch t-SNE
100 Amateur-Sprachverarbeitungsklopfen: 47
100 Sprachverarbeitung Knock-53: Tokenisierung
100 Sprachverarbeitung Knock-95 (mit Pandas): Bewertung mit WordSimilarity-353
100 Amateur-Sprachverarbeitungsklopfen: 97
100 Sprachverarbeitung klopfen 2020 [00 ~ 59 Antwort]
100 Amateur-Sprachverarbeitungsklopfen: 67
100 Sprachverarbeitung Knock-92 (mit Gensim): Anwendung auf Analogiedaten
100 Sprachverarbeitung Knock-36 (unter Verwendung von Pandas): Häufigkeit des Auftretens von Wörtern
100 Sprachverarbeitung Knock: Kapitel 2 UNIX-Befehlsgrundlagen (mit Pandas)
100 Sprachverarbeitung Knock-30 (unter Verwendung von Pandas): Lesen der Ergebnisse der morphologischen Analyse
Sprachverarbeitung 100 Schläge-49: Extraktion von Abhängigkeitspfaden zwischen Nomenklatur
100 Sprachverarbeitung Knock-94 (mit Gensim): Ähnlichkeitsberechnung mit WordSimilarity-353
100 Sprachverarbeitungsklopfen mit Python 2015
100 Sprachverarbeitung Knock-57: Abhängigkeitsanalyse
100 Sprachverarbeitung Knock-50: Satzumbruch
100 Sprachverarbeitung Knock Kapitel 1 (Python)
100 Sprachverarbeitung Knock Kapitel 2 (Python)
Sprachverarbeitung 100 Knock-87: Wortähnlichkeit
Ich habe versucht, 100 Sprachverarbeitung klopfen 2020
100 Sprachverarbeitung Knock-56: Co-Referenz-Analyse
Lösen von 100 Sprachverarbeitungsklopfen 2020 (01. "Patatokukashi")