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 3, étape 11, notez vos propres points. Personnellement, c'est une technologie qui m'intéresse particulièrement dans le traitement du langage naturel.
Jusqu'à présent, la méthode d'extraction de caractéristiques était BoW (ou une variante de BoW), qui était exprimée par le nombre de dimensions égal au nombre de vocabulaire. Dans les embeddings de mots, il peut être représenté par un vecteur d'un nombre spécifique de dimensions (** représentation distribuée des mots **). Ce vecteur contient des informations comme s'il représentait la signification d'un mot.
Comparaison avec des expressions One-hot telles que BoW
article | One-expression chaude | Word embeddings |
---|---|---|
Nombre de dimensions du vecteur | ・ Nombre de vocabulaire ・ Cela peut être des dizaines de milliers à des millions |
・ Valeur fixe décidée par le concepteur ・ Des centaines |
Valeur vectorielle | 1 pour certaines dimensions, 0 pour d'autres | Toutes les dimensions prennent de vraies valeurs |
Analogy task
analogy_sample.Essayez d'exécuter py
$ docker run -it -v $(pwd):/usr/src/app/ 15step:latest python analogy_sample.py
tokyo - japan + france = ('paris', 0.9174968004226685)
gensim.downloader.load ('<word embeddings model>')
contient le vecteur de fonction correspondant au mot. Cependant, selon le modèle, seuls des mots anglais peuvent être utilisés.
Cet exemple traite des mots «tokyo», «japan» et «france», et si vous essayez un pseudo calcul basé sur la signification des mots, On peut voir qu'elle peut être exprimée par «(tokyo --japan) + france = (capital) + france ≒ paris».
Essayons quelques exemples que nous lisons dans d'autres livres.
king - man + woman = [('king', 0.8859834671020508), ('queen', 0.8609581589698792), ('daughter', 0.7684512138366699), ('prince', 0.7640699148178101), ('throne', 0.7634970545768738), ('princess', 0.7512727975845337), ('elizabeth', 0.7506488561630249), ('father', 0.7314497232437134), ('kingdom', 0.7296158075332642), ('mother', 0.7280011177062988)]
gone - go + see = [('see', 0.8548812866210938), ('seen', 0.8507398366928101), ('still', 0.8384071588516235), ('indeed', 0.8378400206565857), ('fact', 0.835073709487915), ('probably', 0.8323071002960205), ('perhaps', 0.8315557837486267), ('even', 0.8241520524024963), ('thought', 0.8223952054977417), ('much', 0.8205327987670898)]
Il peut être obtenu par model.wv.similar_by_vector (..)
comme traité dans la tâche Analogy.
La représentation distribuée obtenue par les incorporations Word a les propriétés suivantes.
article | Contenu |
---|---|
Word2Vec | Obtenir une expression distribuée en se concentrant sur plusieurs mots consécutifs dans une phrase |
Glove | Obtenez une expression distribuée en utilisant les informations de fréquence de cooccurrence de mot dans l'ensemble des données d'apprentissage |
fastText | Caractère n-Obtenez la représentation distribuée de gramme et ajoutez-les ensemble pour créer la représentation distribuée des mots |
Comme mentionné ci-dessus, les incorporations Word peuvent utiliser des modèles déjà entraînés (lors de l'incorporation dans une application, lors de l'utilisation de modèles entraînés, il est préférable d'effectuer un apprentissage par transfert et de l'adapter dans une certaine mesure aux données avant de l'utiliser. alors)
Lorsque vous utilisez le modèle entraîné qui est distribué ultérieurement, faites attention à la licence et aux conditions d'utilisation de ce modèle.
simple_we_classification.py
est sous sec130_140_cnn_rnn / classification /
. Puisque tokenize.py n'existe pas dans ce répertoire, j'ai utilisé sec40_preprocessing / tokenizer.py
.
Ajouts / modifications par rapport au chapitre précédent (étape 09)
def calc_text_feature(text):
"""
Trouvez la fonctionnalité du texte basée sur l'expression distribuée des mots.
Après avoir marqué le texte et trouvé la représentation distribuée de chaque jeton,
Soit la somme de toutes les représentations distribuées la quantité de caractéristiques du texte.
"""
tokens = tokenize(text)
word_vectors = np.empty((0, model.wv.vector_size))
for token in tokens:
try:
word_vector = model[token]
word_vectors = np.vstack((word_vectors, word_vector))
except KeyError:
pass
if word_vectors.shape[0] == 0:
return np.zeros(model.wv.vector_size)
return np.sum(word_vectors, axis=0)
Résultat d'exécution
$ docker run -it -v $(pwd):/usr/src/app/ 15step:latest python simple_we_classification.py
0.40425531914893614
Mise en œuvre normale (étape 01): 37,2% Pré-traitement ajouté (étape 02): 43,6% Pré-traitement + changement d'extraction de caractéristiques (étape 04): 58,5% Pré-traitement + changement d'extraction de caractéristiques (étape 11): 40,4%
Les performances sont faibles avec les fonctionnalités au niveau de la phrase obtenues en ajoutant simplement des incorporations de mots.
Pré-traitement + changement d'extraction de caractéristiques + changement de classificateur (étape 06): 61,7% Pré-traitement + changement d'extraction de caractéristiques + changement de classificateur (étape 09): 66,0%
Il est souhaitable que le modèle d'insertion de mots à utiliser soit ** reproduit en utilisant la même méthode d'écriture et de prétraitement que celle utilisée lors de son apprentissage **.
Recommended Posts