[PYTHON] Probieren Sie das Buch "Einführung in die Entwicklung natürlicher Anwendungen in 15 Schritten" aus - Kapitel 2 Schritt 04 Memo "Feature Extraction"

Inhalt

Dies ist ein Memo für mich, während ich Einführung in Anwendungen zur Verarbeitung natürlicher Sprache in 15 Schritten lese. Dieses Mal werde ich in Kapitel 2, Schritt 04 meine eigenen Punkte aufschreiben.

Vorbereitung

Kapitelübersicht

In dem bisher erstellten Dialogagenten wurden Features mit BoW extrahiert. Wir möchten jedoch verschiedene Methoden zum Extrahieren von Features wie TF-IDF, BM25, N-Gramm erlernen und Zeichenfolgen in geeignete Feature-Vektoren konvertieren. ..

04.1 Bag of Words überarbeitet

Die Natur der Wortsack

BoW ist eine Vektorisierung der Häufigkeit des Auftretens von Wörtern und erfasst eine gewisse Ähnlichkeit in der Bedeutung von "Repräsentieren meines Geschmacks", die Wörter wie "Ich" und "Gefällt mir" enthält.

Auf der anderen Seite hat jedes seinen eigenen Wert, da es keine Wortordnungsinformationen enthält. In den folgenden Abschnitten 04.2 und 04.3 werden Verbesserungen unter Berücksichtigung der Worthäufigkeit und Satzlänge des gesamten Satzes eingeführt, und in 04.4 und 04.5 werden Verbesserungen durch Ändern der Wortteilungsmethode eingeführt.

Der Name Bag of Words scheint von dem Bild abgeleitet zu sein, einen Satz in Wörter zu zerlegen, sie in Taschen zu werfen, ihre Anzahl zu zählen und die Reihenfolge zu ignorieren.

Unbekanntes Wort

Wenn Sie beim Erstellen eines Wörterbuchs mit .fit von CountVectorizer und beim Vektorisieren von .transform Wörter finden, die Sie beim Vektorisieren treffen und ignorieren möchten, können Sie den Zielsatzsatz trennen.

04.2 TF-IDF

BoW-Probleme und TF-IDF-Lösungen

--BOW-Problem: Wörter, die einen Satz charakterisieren, und Wörter, die einen Satz nicht charakterisieren, werden gleich behandelt.

Berechnung von TF-IDF durch Scikit-Learn

Verwenden Sie TfidfVectorizer anstelle von CountVectorizer (BoW).

Wie berechnet man TF-IDF?

Letztendlich wird der Wert erhalten, indem die Wortfrequenz TF (TermFrequency) mit der inversen Nummer der Dokumentfrequenz, der logarithmischen IDF (InverseDocumentFrequency), multipliziert wird. "TF-IDF (t, d) = TF (t, d)" IDF (t) "

--TF: Der Wert erhöht sich, wenn er häufig im Text erscheint --IDF: Der Wert wird kleiner, wenn er in vielen Sätzen erscheint

04.3 BM25 Dies ist eine Modifikation von TF-IDF, um die Satzlänge zu berücksichtigen.

04.4 Wort N-Gramm

Bisher wurde ein Wort aufgrund des Schreibens in getrennten Wörtern als eine Dimension behandelt, so dass gesagt werden kann, dass es sich um eine Methode des ** Wort-Uni-Gramms ** handelt. Andererseits wird das Verfahren zum Behandeln von zwei Wörtern als eine Dimension ** Wort-Bi-Gramm ** genannt. Wenn Sie 3 Wörter zusammensetzen möchten, verwenden Sie ** Wort Trigramm ** und setzen Sie sie als ** Wort N-Gramm ** zusammen.

#Schriftliches Ergebnis
Tokio/Von/Osaka/Zu/gehen

# uni-Gramm ist 5 Dimensionen
1.Tokio
2.Von
3.Osaka
4.Zu
5.gehen

# bi-Gramm ist 4 Dimensionen
1.aus Tokio
2.Aus Osaka
3.In Osaka
4.gehe zu

Dinge, die man beachten muss

Durch die Verwendung des Wortes N-Gramm wird es möglich, Merkmale zu extrahieren, die die Wortordnungsinformationen berücksichtigen, die von BoW teilweise ignoriert wurden. Wenn Sie dagegen ** N erhöhen, nimmt die Anzahl der Dimensionen zu, und da die Funktion spärlich ist, sinkt die Generalisierungsleistung **, sodass der obige Kompromiss bei Verwendung von N-Gramm besteht Müssen berücksichtigt werden.

Verwendung mit BoW und TF-IDF von Scikit-learn

Geben Sie dem Konstruktor von CountVectorizer und TfidVectorizer das Argument ngram_range = (Minimalwert, Maximalwert). Durch Angabe des Minimal- und Maximalwerts können alle N-Gramm innerhalb des angegebenen Bereichs zu Merkmalsvektoren gemacht werden. (Beispiel: Es ist auch möglich, ein Wörterbuch sowohl mit Uni-Gramm als auch mit Bi-Gramm zu erstellen.)

04,5 Zeichen N-Gramm

Die Idee ist, BoW mit N Zeichen als eine Gruppe von Vokabeln für Buchstaben und nicht für Wörter zu komponieren.

Eigenschaften des Zeichens N-Gramm (Punkte zu beachten)

Es ist stark gegen Schwankungen der Wortnotation und auch gegen zusammengesetzte Wörter und unbekannte Wörter, da es überhaupt keine morphologische Analyse (Schreiben) durchführt. Andererseits kann ** die Fähigkeit, Wörter / Sätze zu unterscheiden, die Zeichenfolgen ähneln, aber unterschiedliche Bedeutungen haben, verringert werden, und die Anzahl der Dimensionen kann zunehmen, da es auf Japanisch viele Arten von Zeichen gibt **.

04.6 Kombinieren mehrerer Feature-Mengen

Verschiedene Merkmalsgrößen können kombiniert werden, ebenso wie mehrere N-Gramm kombiniert und als Merkmalsvektor mit dem Wort N-Gramm behandelt werden können.

#Beim Kombinieren nach Berechnung jedes Merkmalsvektors
bow1 = bow1_vectorizer.fit_transform(texts)
bow2 = bow2_vectorizer.fit_transform(texts)

feature = spicy.sparse.hstack((bow1, bow2))

# scikit-learn.pipeline.Bei Verwendung von Feature Union
combined = FeatureUnion(
  [
    ('bow', word_bow_vectorizer),
    ('char_bigram', char_bigram_vectorizer),
  ])

feature = combined.fit_transform(texts)

Dinge, die beim Verbinden mehrerer Feature-Mengen zu beachten sind

――Die Dimension wird größer

04.7 Weitere Ad-hoc-Funktionen

Die folgenden Merkmalsmengen können ebenfalls hinzugefügt werden.

Kombination von Ad-hoc-Funktionen mit Scikit-learn

Überprüfen Sie den Fortschritt auf dem Weg.

test_sklearn_adhoc_union.py


###Hauptquelle weggelassen

import print

print('# num_sentences - \'Hallo. Guten Abend.\':')
print([sent for sent in rx_periods.split(texts[0]) if len(sent) > 0])

print('\n# [{} for .. in ..]')
print([{text} for text in texts])

textStats = TextStats()
print('\n# TextStats.fit():' + str(type(textStats.fit(texts))))
fitTransformTextStats = textStats.fit_transform(texts)
print('\n# TextStats.fit_transform():'+ str(type(fitTransformTextStats)))
pprint.pprint(fitTransformTextStats)

dictVectorizer = DictVectorizer()
print('\n# DictVectorizer.fit():' + str(type(dictVectorizer.fit(fitTransformTextStats))))
fitTransformDictVectorizer = dictVectorizer.fit_transform(textStats.transform(texts))
print('\n# DictVectorizer.fit_transform():' + str(type(fitTransformDictVectorizer)))
pprint.pprint(fitTransformDictVectorizer.toarray())

countVectorizer = CountVectorizer(analyzer = 'char', ngram_range = (2, 2))
print('\n# CountVectorizer.fit():' + str(type(countVectorizer.fit(texts))))

Ausführungsergebnis


$ docker run -it -v $(pwd):/usr/src/app/ 15step:latest python test_sklearn_adhoc_union.py
# num_sentences - 'Hallo. Guten Abend.':
['Hallo', 'Guten Abend']

# [{} for .. in ..]
[{'Hallo. Guten Abend.'}, {'Ich möchte gegrilltes Fleisch essen'}]

# TextStats.fit():<class '__main__.TextStats'>

# TextStats.fit_transform():<class 'list'>
[{'length': 12, 'num_sentences': 2}, {'length': 7, 'num_sentences': 1}]

# DictVectorizer.fit():<class 'sklearn.feature_extraction.dict_vectorizer.DictVectorizer'>

# DictVectorizer.fit_transform():<class 'scipy.sparse.csr.csr_matrix'>
array([[12.,  2.],
       [ 7.,  1.]])

# CountVectorizer.fit():<class 'sklearn.feature_extraction.text.CountVectorizer'>

04.8 Vektorraummodell

Stellen Sie sich einen zweidimensionalen / dreidimensionalen Vektorraum der linearen Algebra vor.

Die Rolle des Klassifikators

Im Fall eines dreidimensionalen Vektorraums und einer binären Klassifikation (zu welcher Klasse er gehört) wird die Grenze zum Zeitpunkt der Beurteilung als Unterscheidungsfläche / Entscheidungsgrenze bezeichnet.

04.9 Anwendung auf Dialogagenten

Ergänzungen / Änderungen gegenüber dem vorherigen Kapitel

  1. Merkmale: BoW → TF-IDF
  2. Fügen Sie das Wort N-Gramm hinzu (Uni-Gramm, Bi-Gramm, Tri-Gramm).
~~

pipeline = Pipeline([
  # ('vectorizer', CountVectorizer(tokenizer = tokenizer),↓
  ('vectorizer', TfidVectorizer(
      tokenizer = tokenizer,
      ngram_range=(1,3))),
~~

Ausführungsergebnis


# evaluate_dialogue_agent.Der Name des Lademoduls von py wurde korrigiert
from dialogue_agent import DialogueAgent
↓
from dialogue_agent_with_preprocessing_and_tfidf import DialogueAgent

$ docker run -it -v $(pwd):/usr/src/app/ 15step:latest python evaluate_dialogue_agent.py
0.58510638

Recommended Posts

Probieren Sie das Buch "Einführung in die Entwicklung natürlicher Anwendungen in 15 Schritten" aus - Kapitel 2 Schritt 04 Memo "Feature Extraction"
Probieren Sie das Buch "Einführung in die Verarbeitung natürlicher Sprachanwendungen in 15 Schritten" aus - Kapitel 2 Schritt 06 Memo "Identifier"
Probieren Sie das Buch "Einführung in die Verarbeitung natürlicher Sprachanwendungen in 15 Schritten" aus - Kapitel 2 Schritt 02 Memo "Vorverarbeitung"
Probieren Sie das Buch "Einführung in die Verarbeitung natürlicher Sprachanwendungen in 15 Schritten" aus - Kapitel 2 Schritt 07 Memo "Evaluation"
Probieren Sie das Buch "Einführung in die Verarbeitung natürlicher Sprachanwendungen in 15 Schritten" - Kapitel 4 Schritt 14 Memo "Hyperparametersuche"
Probieren Sie das Buch "Einführung in die Verarbeitung natürlicher Sprachanwendungen in 15 Schritten" aus - Kapitel 4 Schritt 15 Memo "Datenerfassung"
Probieren Sie das Buch "Einführung in die Verarbeitung natürlicher Sprachanwendungen in 15 Schritten" - Kapitel 3 Schritt 08 Memo "Einführung in neuronale Netze".
Probieren Sie das Buch "Einführung in die Entwicklung natürlicher Anwendungen in 15 Schritten" aus - Kapitel 2 Schritt 05 Memo "Feature Quantity Conversion"
Probieren Sie das Buch "Einführung in die Verarbeitung natürlicher Sprachanwendungen in 15 Schritten" aus - Kapitel 3 Schritt 11 Memo "Worteinbettungen"
Probieren Sie das Buch "Einführung in die Entwicklung natürlicher Anwendungen in 15 Schritten" - Kapitel 3 Schritt 12 Memo "Convolutional Neural Networks".
Probieren Sie das Buch "Einführung in die Entwicklung natürlicher Anwendungen in 15 Schritten" aus - Kapitel 3 Schritt 13 Memo "Wiederkehrende neuronale Netze"
Probieren Sie das Buch "Einführung in die Entwicklung natürlicher Anwendungen in 15 Schritten" aus - Kapitel 3 Schritt 09 Memo "Identifier by Neural Network"
Probieren Sie das Buch "Einführung in die Entwicklung natürlicher Anwendungen in 15 Schritten" aus - Kapitel 2 Schritt 01 Memo "Erstellen eines Dialogagenten"
Versuchen Sie das Buch "Einführung in die Verarbeitung natürlicher Sprachanwendungen in 15 Schritten" - Kapitel 2 Schritt 03 Memo "Morphologische Analyse und schriftliches Schreiben"
Versuchen wir das Buch "Einführung in die Entwicklung natürlicher Anwendungen in 15 Schritten" - Kapitel 3 Schritt 10 Memo "Details und Verbesserung des neuronalen Netzes"
Probieren Sie das Buch "Einführung in die Verarbeitung natürlicher Sprachanwendungen in 15 Schritten" - Kapitel 1 Memo "Vorkenntnisse vor Beginn der Übungen".
[WIP] Vorverarbeiten von Notizen in der Verarbeitung natürlicher Sprache
Zusammenfassung von Anfang bis Kapitel 1 der Einführung in Entwurfsmuster, die in der Java-Sprache gelernt wurden
[Kapitel 5] Einführung in Python mit 100 Klopfen Sprachverarbeitung
[Kapitel 6] Einführung in Scicit-Learn mit 100 Klopfen Sprachverarbeitung
[Kapitel 3] Einführung in Python mit 100 Klopfen Sprachverarbeitung
[Kapitel 2] Einführung in Python mit 100 Klopfen Sprachverarbeitung
[Kapitel 4] Einführung in Python mit 100 Klopfen Sprachverarbeitung
[Jobwechsel-Meeting] Versuchen Sie, Unternehmen zu klassifizieren, indem Sie Mundpropaganda in natürlicher Sprache mit word2vec verarbeiten
[Verarbeitung natürlicher Sprache] Ich habe diese Woche versucht, die aktuellen Themen in der Slack-Community zu visualisieren
[Verarbeitung natürlicher Sprache] Ich habe versucht, die Bemerkungen jedes Mitglieds in der Slack-Community zu visualisieren
[Python] Versuchen Sie, Ramen-Shops durch Verarbeitung natürlicher Sprache zu klassifizieren
Zusammenfassung von Kapitel 2 der Einführung in Entwurfsmuster, die in Java gelernt wurden
Kapitel 4 Zusammenfassung der Einführung in Entwurfsmuster, die in Java gelernt wurden
Zusammenfassung von Kapitel 3 der Einführung in Entwurfsmuster, die in Java gelernt wurden
[Einführung in RasPi4] Umgebungskonstruktion, Mecab des Verarbeitungssystems für natürliche Sprache usw. .. .. ♪
Dockerfile mit den notwendigen Bibliotheken für die Verarbeitung natürlicher Sprache mit Python
100 Klicks in der Verarbeitung natürlicher Sprache Kapitel 4 Kommentar
100 Sprachverarbeitung Knock Kapitel 1 in Python
Probieren Sie Cython in kürzester Zeit aus
Vorbereitung zum Starten der Verarbeitung natürlicher Sprache
Von der Einführung der GoogleCloudPlatform Natural Language API bis zur Verwendung
Ich habe versucht, die Version 2020 mit 100 Sprachverarbeitung zu lösen [Kapitel 3: Reguläre Ausdrücke 25-29]