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 05 meine eigenen Punkte aufschreiben.
In Schritt 04 lernen Sie die Feature-Extraktionsmethode und im nächsten Schritt 06 lernen Sie aus dem extrahierten Feature-Vektor, um einen Klassifikator zu erstellen. In Schritt 05 lernen Sie die Dimensionskomprimierungsmethode kennen, mit der der Merkmalsvektor während des Prozesses in die gewünschte Form für den Diskriminator verarbeitet wird.
BoW ist eine vektorisierte Version der Häufigkeit des Auftretens von Wörtern, und "die Verteilung von Merkmalsvektorwerten ist tendenziell sehr voreingenommen."
Es war schwierig, das Beispiel des Nachschlagewerks zu verstehen, deshalb werde ich es selbst überprüfen.
test_quantileTransformer.py
import numpy as np
import MeCab
import pprint
from sklearn.preprocessing import QuantileTransformer
from sklearn.feature_extraction.text import CountVectorizer
def _tokenize(text):
~~
texts = [
'Autos Autos Autos fahren schnell',
'Das Fahrrad läuft schnell',
'Das Fahrrad läuft langsam',
'Dreirad fährt langsam',
'Programmieren macht Spaß',
'Python ist Python Python ist Python Python macht Spaß',
]
vectorizer = CountVectorizer(tokenizer=_tokenize, max_features = 5)
bow = vectorizer.fit_transform(texts)
pprint.pprint(bow.toarray())
qt = QuantileTransformer()
qtd = qt.fit_transform(bow)
pprint.pprint(qtd.toarray())
Ausführungsbeispiel
array([[0, 3, 0, 1, 3],
[0, 1, 0, 1, 0],
[0, 2, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 1, 0, 0, 0],
[5, 5, 0, 0, 0]], dtype=int64)
array([[0.00000000e+00, 7.99911022e-01, 0.00000000e+00, 9.99999900e-01,
9.99999900e-01],
[0.00000000e+00, 9.99999998e-08, 0.00000000e+00, 9.99999900e-01,
0.00000000e+00],
[0.00000000e+00, 6.00000000e-01, 9.99999900e-01, 9.99999900e-01,
0.00000000e+00],
[0.00000000e+00, 9.99999998e-08, 9.99999900e-01, 9.99999900e-01,
0.00000000e+00],
[0.00000000e+00, 9.99999998e-08, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00],
[9.99999900e-01, 9.99999900e-01, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00]])
Inhalt | LAS | PCA |
---|---|---|
Überblick | Eine Methode zum Erhalten eines Vektors, der ein Dokument auf der Ebene "Bedeutung" hinter einem "Wort" ausdrückt, basierend auf einer Gruppe von Merkmalsvektoren, die die Beziehung zwischen einem Dokument und einem Wort wie BoW darstellen. | Methode zum Finden der "Richtung, in der Datenpunkte stark gestreut sind" |
Mathematische Manipulation | SVD (Singularwertzerlegung) | EVD (eindeutige Wertzerlegung) |
Implementierung | svd = sklearn.decomposition.TruncatedSVD() svd.fit_transform( |
evd = sklearn.decomposition.PCA() evd.fit_transform( |
Bedeutung jeder Dimension | singular_values_Sie können die Wichtigkeit jeder Dimension nach der Komprimierung unter Bezugnahme auf sehen. | explained_variance_ratio_Den kumulierten Beitragssatz finden Sie unter. |
Dimensionsreduzierung | Bei der Instanziierung_Geben Sie die Komponenten an | Bei der Instanziierung_Geben Sie die Komponenten an |
Das Themenmodell, bei dem es darum geht, "ob ein Satz und ein anderer Satz dieselbe Bedeutung haben", anstatt den Trainingsdaten explizit die Klassen-ID zuzuweisen, gibt nicht explizit die richtige Antwort (Klassen-ID). Es ist eine Art "Lernen ohne Lehrer".
Durch Aufkorrelieren jeder Komponente des Vektors (Multiplizieren des Zielvektors mit dem durch PCA erhaltenen Eigenvektor), um die durchschnittliche 0-Dispersion 1 zu erhalten, wurde die "Ausdehnung in jeder axialen Richtung", die die Daten ursprünglich hatten, gelöscht. Es ist zu erwarten, dass die Identifikationsleistung verbessert wird.
Da ein hochdimensionaler Vektor in einen niedrigdimensionalen Vektor umgewandelt werden kann, kann er auch als Visualisierungsmethode verwendet werden.
Ich konnte es nicht einfach tun, indem ich die abgeschnittene SVD in PCA umschrieb. (Sie können nicht spärlich in PCA eingeben)
Ausführungsbeispiel
def train(self, texts, labels):
vectorizer = TfidfVectorizer(tokenizer=self._tokenize, ngram_range=(1, 3))
bow = vectorizer.fit_transform(texts).toarray()
pca = PCA(n_components = 500)
pca_feat = pca.fit_transform(bow)
classifier = SVC()
classifier.fit(pca_feat, labels)
self.vectorizer = vectorizer
self.pca = pca
self.classifier = classifier
def predict(self, texts):
bow = self.vectorizer.transform(texts).toarray()
pca_feat = self.pca.transform(bow)
return self.classifier.predict(pca_feat)
Sie kann ausgeführt werden, indem Sie die Pipeline-Notation stoppen, das Ergebnis (spärlich) des Vektorisierers anzeigen () und es dann in PCA eingeben.
Recommended Posts