Japanische Verarbeitung natürlicher Sprache mit Python3 (4) Emotionsanalyse durch logistische Regression

Wie bewertet TF-IDF die Wortrelevanz?

Bis zum letzten Mal habe ich Sätze analysiert und Wörter in Merkmalsvektoren umgewandelt. Selbst wenn ein Wort in einem Satz häufig vorkommt und in einem Satz einer Kategorie häufig vorkommt, ist das Wort für die Beurteilung der Kategorie nicht sehr wichtig. Wenn Sie eine Filmkritik als "positiv" oder "negativ" klassifizieren möchten, kann das Wort "wow" häufig im Zusammenhang mit "wow" oder "wow" verwendet werden. Das ist also alles. Dann ist das Negative und Positive der Bewertung schwer zu beurteilen. Mit dieser Art von Gefühl ist, wenn ein Wort kategorisiert wird, die Methode, das Gewicht des Wortes zu erhöhen, wenn es wichtig ist, und es zu verringern, wenn es nicht wichtig ist, "TF-IDF". TF wird als Häufigkeit des Auftretens von Wörtern bezeichnet, IDF wird als Häufigkeit des umgekehrten Dokuments bezeichnet und die Definition lautet wie folgt. Angenommen, $ n_d $ repräsentiert die Gesamtzahl der Dokumente und $ df (t, d) $ repräsentiert die Anzahl der Dokumente, die das Wort t enthalten idf(t, d) = log \frac{n_d}{1 + df(t,d)}, tf-idf = tf(t,d) \times idf(t, d)

Übrigens ist es relativ einfach, dies mit der TfidfTransformer-Klasse in Pythons Scikit-Learn zu implementieren, die die Häufigkeit von Wortvorkommen vom zuletzt verwendeten CountVectorizer empfängt und konvertiert.

tf_idf.py


import numpy as np
from sklearn.feature_extraction.text import CountVectorizer 
from sklearn.feature_extraction.text import TfidfTransformer

count = CountVectorizer()
texts = np.array(["He likes to play the guitar", \
"She likes to play the piano", \
"He likes to play the guitar, and she likes to play the piano"])
bag = count.fit_transform(docs)

tfidf = TfidfTransformer(use_idf=True, norm='l2', smooth_idf=True)
np.set_printoptions(precision=2)
print(tfidf.fit_transform(count.fit_transform(docs)).toarray())

Ausgabeergebnis:
[[ 0.    0.48  0.48  0.37  0.    0.37  0.    0.37  0.37]
 [ 0.    0.    0.    0.37  0.48  0.37  0.48  0.37  0.37]
 [ 0.34  0.26  0.26  0.4   0.26  0.4   0.26  0.4   0.4 ]]

Punkte, die bei der tatsächlichen Analyse von Textdaten zu beachten sind

Textdaten bereinigen

In einem Satz wie dem obigen Beispiel enthält die Eingabe keine zusätzlichen Symbole usw. und kann so wie sie ist an countVectorizer usw. übergeben werden. Einige Textdaten enthalten jedoch HTML-Markups und Trennlinien. Diese zusätzlichen Daten müssen vor Beginn der Analyse entfernt werden (Bereinigung der Textdaten). Dies kann mit regulären Python-Ausdrücken usw. erfolgen. Operation für reguläre Ausdrücke in Python

Entfernen von Stoppwörtern

Unabhängig von der Satzkategorie sind Wörter, die häufig in einem Satz in einer bestimmten Sprache vorkommen, für die Klassifizierung von Sätzen nicht sehr wichtig. Daher ist es besser, sie zu untersuchen, bevor Sie tatsächlich maschinelles Lernen durchführen. .) Auf Englisch können Sie Stoppwörter aus der NLTK-Bibliothek von Python mitbringen, auf Japanisch gibt es jedoch keine offizielle Bibliothek slothlib. Es scheint, dass es oft die Seite liest (/Filter/StopWord/word/Japanese.txt), die Quelle analysiert und das Wort abruft. Öffnen Sie zuerst die URL mit dem folgenden Code und überprüfen Sie dann die Quelle mit einem mysteriösen Element namens Beautiful Soup.

ja_stopwords.py


import urllib.request
import bs4
from bs4 import BeautifulSoup

def get_stop_words():
    #stopwords(Häufige Wörter unabhängig von Satzattributen)Holen Sie sich die Stoppwortliste wie Japanisch in Slothlib auszuschließen.
    #Analysieren Sie die Quelle mit urllib und BeautifulSoup.
    url = 'http://svn.sourceforge.jp/svnroot/slothlib/CSharp/Version1/SlothLib/NLP/Filter/StopWord/word/Japanese.txt'
    soup = bs4.BeautifulSoup(urllib.request.urlopen(url).read(), "html.parser")
    ss = str(soup)
    return ss

print(get_stop_words())

Ausgabeergebnis:
da drüben
Pro
Dort
Da drüben
nach
Loch
Sie
Das
Wie viele
Wann
Jetzt
ich
...

Schulung logistischer Regressionsmodelle zur Klassifizierung von Dokumenten

Dann finden wir auf diese Weise die Merkmalsmenge usw. und führen tatsächlich eine logistische Regressionsanalyse für die vorverarbeiteten Sätze durch, um zu klassifizieren, ob die Sätze, die maschinelles Lernen sind, positiv oder negativ sind. Es gab keine erschwingliche Quelle auf Japanisch (es scheint, dass es viele Sammlungen von Twitter gibt, aber es ist mühsam, sich dafür mit AWS anzulegen) Versuchen Sie es mit Daten, die für englische Filmkritiken negativ oder positiv sind. Dieses Programm ist [Python Machine Learning](https://www.amazon.co.jp/Python%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%83 % 97% E3% 83% AD% E3% 82% B0% E3% 83% A9% E3% 83% 9F% E3% 83% B3% E3% 82% B0-% E9% 81% 94% E4% BA% BA% E3% 83% 87% E3% 83% BC% E3% 82% BF% E3% 82% B5% E3% 82% A4% E3% 82% A8% E3% 83% B3% E3% 83% 86% E3% 82% A3% E3% 82% B9% E3% 83% 88% E3% 81% AB% E3% 82% 88% E3% 82% 8B% E7% 90% 86% E8% AB% 96% E3% 81% A8% E5% AE% 9F% E8% B7% B5-Impress-Top-Gang / dp / 4844380605 / ref = sr_1_cc_2? S = aps & dh = UTF8 & qid = 1487516026 & sr = 1-2-catcorr & keywords = Python +% E6% A9% Ich habe auf das Kapitel über die Verarbeitung natürlicher Sprache im Buch 9F% E6% A2% B0% E5% AD% A6% E7% BF% 92) verwiesen.

reviews.py


from sklearn.pipeline import Pipeline 
from sklearn.linear_model import LogisticRegression
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import GridSearchCV

X_train = df.loc[:25000, 'review'].values
y_train = df.loc[:25000, 'sentiment'].values
X_test = df.loc[25000:, 'review'].values
y_test = df.loc[25000:, 'sentiment'].values

tfidf = TfidfVectorizer(strip_accents=None, lowercase=False, preprocessor=None)

param_grid = [{'vect__ngram_range': [(1, 1)],
               'vect__stop_words': [stop, None],
               'vect__tokenizer': [tokenizer, tokenizer_porter],
               'clf__penalty': ['l1', 'l2'],
               'clf__C': [1.0, 10.0, 100.0]},
              {'vect__ngram_range': [(1, 1)],
               'vect__stop_words': [stop, None],
               'vect__tokenizer': [tokenizer, tokenizer_porter],
               'vect__use_idf':[False],
               'vect__norm':[None],
               'clf__penalty': ['l1', 'l2'],
               'clf__C': [1.0, 10.0, 100.0]},
              ]

                     ('clf', LogisticRegression(random_state=0))])

gs_lr_tfidf = GridSearchCV(lr_tfidf, param_grid,
                           scoring='accuracy',
                           cv=5,
                           verbose=1,
                           n_jobs=-1)
gs_lr_tfidf.fit(X_train, y_train)
print('Accuracy: %.3f' % gs_lr_tfidf.best_score_)

Teilen Sie df zunächst in Trainingsdaten und Testdaten auf. Es ist möglicherweise einfacher zu verstehen, wenn Sie sich vorstellen, dass df wie eine Tabelle im Datenrahmen der Pandas-Bibliothek aussieht. image

['Bewertung'] ['Stimmung'] in diesem ist der Text der Bewertung (dies ist x) und das Etikett für die Bewertung (0,1 bedeutet positiv oder negativ), und dies ist y. (Ich werde weglassen, wie df tatsächlich die Originaldaten liest und die Daten bereinigt ...) Danach verwende ich GridSearchCV, eine Klasse von sklearn, um die optimalen Parameter für die logistische Rotation zu optimieren. Ich habe eine Instanz von GridSearchCV mit dem Namen gs_lr_tfidf erstellt und sie mit gs_lr_tfidf.fit () unter Verwendung von X_train und y_train trainiert.

(Hyperparameter-Tuning mit sklearn)

Es dauert jedoch enorm viel Zeit, um diese Methode tatsächlich durchzuführen ... Wenn die Daten groß sind, scheint es daher üblich zu sein, das zu tun, was als Out-of-Core-Lernen bezeichnet wird.

Recommended Posts

Japanische Verarbeitung natürlicher Sprache mit Python3 (4) Emotionsanalyse durch logistische Regression
Python: Verarbeitung natürlicher Sprache
Verarbeitung natürlicher Sprache 1 Morphologische Analyse
[Python] Versuchen Sie, Ramen-Shops durch Verarbeitung natürlicher Sprache zu klassifizieren
[Verarbeitung natürlicher Sprache] Vorverarbeitung mit Japanisch
Japanische Analyseverarbeitung mit Janome Teil1
100 Sprachverarbeitung Knock Kapitel 1 von Python
Logistische Regressionsanalyse Selbst erstellt mit Python
3. Verarbeitung natürlicher Sprache durch Python 2-1. Netzwerk für das gleichzeitige Auftreten
3. Verarbeitung natürlicher Sprache durch Python 1-1. Word N-Gramm
Japanische Sprachverarbeitung durch Python3 (5) Ensemble-Lernen verschiedener Modelle durch Voting Classifier
3. Verarbeitung natürlicher Sprache durch Python 2-2. Koexistenznetzwerk [mecab-ipadic-NEologd]
[Python] Ich habe mit der Verarbeitung natürlicher Sprache ~ Transformatoren ~ gespielt
Python: Tiefes Lernen in der Verarbeitung natürlicher Sprache: Grundlagen
100 Sprachverarbeitung Knock-99 (mit Pandas): Visualisierung durch t-SNE
[Python] [Verarbeitung natürlicher Sprache] Ich habe Deep Learning ausprobiert (auf Japanisch von Grund auf neu erstellt)
3. Verarbeitung natürlicher Sprache durch Python 3-1. Wichtiges Tool zur Wortextraktion TF-IDF-Analyse [Originaldefinition]
100 natürliche Sprachverarbeitung klopft Kapitel 4 Morphologische Analyse (erste Hälfte)
[Sprachverarbeitung 100 Schläge 2020] Zusammenfassung der Antwortbeispiele von Python
Erläuterung des Konzepts der Regressionsanalyse mit Python Teil 2
Kommunikationsverarbeitung durch Python
100 natürliche Sprachverarbeitung klopft Kapitel 4 Morphologische Analyse (zweite Hälfte)
Modell unter Verwendung eines Faltungsnetzwerks in der Verarbeitung natürlicher Sprache
[Für Anfänger] Sprachanalyse mit dem Verarbeitungswerkzeug "GiNZA" (von der morphologischen Analyse bis zur Vektorisierung)
Die erste künstliche Intelligenz. Ich wollte die Verarbeitung natürlicher Sprache ausprobieren, daher werde ich die morphologische Analyse mit MeCab mit Python3 versuchen.
RNN_LSTM2 Verarbeitung natürlicher Sprache
Erstellen einer Umgebung für die Verarbeitung natürlicher Sprache mit Python
Erläuterung des Konzepts der Regressionsanalyse mit Python Teil 1
100 Sprachverarbeitung Knock-30 (unter Verwendung von Pandas): Lesen der Ergebnisse der morphologischen Analyse
Erläuterung des Konzepts der Regressionsanalyse mit Python Extra 1
[Verarbeitung natürlicher Sprache / NLP] Einfache Rückübersetzung durch maschinelle Übersetzung mit Python
100 natürliche Sprachverarbeitung klopft Kapitel 5 Abhängigkeitsanalyse (zweite Hälfte)
100 natürliche Sprachverarbeitung klopft Kapitel 5 Abhängigkeitsanalyse (erste Hälfte)
Regressionsanalyse mit Python
Verwenden Sie die Swagger-Benutzeroberfläche. Wenn Sie einen Swagger-UI-ähnlichen Stil wünschen, kopieren Sie einfach die gesamte Datei unter / dist unter https://github.com/swagger-api/swagger-ui. Danach schreiben Sie einfach hier in index.html die URL der yml-Datei um. Wenn Sie der Meinung sind, dass Sie @ApiModel oder @ApiModelProperty nicht finden können, wurden übrigens anscheinend alle Anmerkungen zur Schemadefinition in @Schema integriert. Emotionsanalyse mit Java, Swagger, OpenAPI, Micronaut Natural Language Processing! Ich habe versucht, die Bewertung anhand des Überprüfungstextes vorherzusagen
Python-Lernnotiz für maschinelles Lernen von Chainer Kapitel 7 Regressionsanalyse
■ [Google Colaboratory] Vorverarbeitung der Verarbeitung natürlicher Sprache & Janome
2. Multivariate Analyse in Python 5-3. Logistische Regressionsanalyse (Statistikmodelle)
Japanische morphologische Analyse mit Janome
Python: Japanischer Text: Morphologische Analyse
Was ist eine logistische Regressionsanalyse?
100 Sprachverarbeitung Knock-57: Abhängigkeitsanalyse
Emotionsanalyse von Python (word2vec)
100 Sprachverarbeitung Knock Kapitel 1 (Python)
100 Sprachverarbeitung Knock Kapitel 2 (Python)
Verarbeitung natürlicher Sprache 3 Wortkontinuität
Japanische morphologische Analyse mit Python
Bildverarbeitung mit Python (Pillow)
Einfache Regressionsanalyse mit Python
100 Sprachverarbeitung Knock-56: Co-Referenz-Analyse
Python: Vektordarstellung in natürlicher Sprache
Datenanalyse mit Python-Pandas
Verwenden des Python-Modus in der Verarbeitung
Verarbeitung natürlicher Sprache 2 Wortähnlichkeit