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.
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. ..
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.
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-Problem: Wörter, die einen Satz charakterisieren, und Wörter, die einen Satz nicht charakterisieren, werden gleich behandelt.
Verwenden Sie TfidfVectorizer anstelle von CountVectorizer (BoW).
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.
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
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.
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.)
Die Idee ist, BoW mit N Zeichen als eine Gruppe von Vokabeln für Buchstaben und nicht für Wörter zu komponieren.
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 **.
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)
――Die Dimension wird größer
Die folgenden Merkmalsmengen können ebenfalls hinzugefügt werden.
Ü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'>
Stellen Sie sich einen zweidimensionalen / dreidimensionalen Vektorraum der linearen Algebra vor.
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.
Ergänzungen / Änderungen gegenüber dem vorherigen Kapitel
~~
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