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