Ceci est un mémo pour moi pendant que je lis Introduction aux applications de traitement du langage naturel en 15 étapes. Cette fois, au chapitre 2, étape 05, j'écrirai mes propres points.
À l'étape 04, vous apprendrez la méthode d'extraction de caractéristiques, et à l'étape suivante 06, vous apprendrez à partir du vecteur de caractéristiques extrait pour créer un classificateur. À l'étape 05, vous découvrirez la méthode de compression de dimension qui traite le vecteur de caractéristiques dans la forme souhaitée pour le discriminateur pendant le processus.
--Analyse sémantique latente (LSA)
BoW est une version vectorisée de la fréquence d'occurrence des mots, et «la distribution des valeurs des vecteurs caractéristiques a tendance à être très biaisée».
Il était difficile de comprendre l'exemple du livre de référence, je vais donc le vérifier moi-même.
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 = [
'Voitures Voitures Les voitures courent vite',
'Le vélo tourne vite',
'Le vélo tourne lentement',
'Le véhicule à trois roues tourne lentement',
'La programmation est amusante',
'Python est Python Python est Python Python est amusant',
]
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())
Exemple d'exécution
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]])
Contenu | LAS | PCA |
---|---|---|
Aperçu | Une méthode pour obtenir un vecteur qui exprime un document au niveau de «signification» derrière un «mot» basé sur un groupe de vecteurs de caractéristiques qui représentent la relation entre un document et un mot tel que BoW. | Méthode pour trouver "la direction dans laquelle les points de données sont largement dispersés" |
Manipulation mathématique | SVD (décomposition en valeurs singulières) | EVD (décomposition de valeur unique) |
la mise en oeuvre | svd = sklearn.decomposition.TruncatedSVD() svd.fit_transform( |
evd = sklearn.decomposition.PCA() evd.fit_transform( |
Importance de chaque dimension | singular_values_Vous pouvez voir l'importance de chaque dimension après compression en vous référant à. | explained_variance_ratio_Le taux de cotisation cumulatif peut être trouvé en se référant à. |
Réduction de dimension | À l'instanciation, n_Spécifier les composants | À l'instanciation, n_Spécifier les composants |
Le modèle de sujet, qui consiste à savoir "si une phrase et une autre phrase ont la même signification" au lieu de donner explicitement l'ID de classe aux données d'apprentissage, ne donne pas explicitement la bonne réponse (ID de classe). C'est une sorte d '"apprentissage sans professeur".
En décorrélant chaque composante du vecteur (en multipliant le vecteur cible par le vecteur propre obtenu par PCA) pour obtenir la dispersion moyenne 0 1, «l'extension dans chaque direction axiale» que les données avaient à l'origine a été effacée. On peut s'attendre à ce que les performances d'identification soient améliorées.
Puisqu'un vecteur de grande dimension peut être converti en un vecteur de faible dimension, il peut également être utilisé comme méthode de visualisation.
Je ne pouvais pas le faire simplement en réécrivant le SVD tronqué en PCA. (Vous ne pouvez pas entrer clairsemé dans PCA)
Exemple d'exécution
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)
Il peut être exécuté en arrêtant la notation du pipeline, toarray () le résultat (clairsemé) du vectorizer, puis en le saisissant dans PCA.
Recommended Posts