Gensim: desarrollo de incrustaciones de palabras
El capítulo nos ayudará a comprender el desarrollo de la inserción de palabras en Gensim.
La incrustación de palabras, enfoque para representar palabras y documentos, es una representación de vector denso para texto donde las palabras que tienen el mismo significado tienen una representación similar. A continuación se presentan algunas características de la inserción de palabras:
Es una clase de técnica que representa las palabras individuales como vectores de valor real en un espacio vectorial predefinido.
Esta técnica a menudo se agrupa en el campo de DL (aprendizaje profundo) porque cada palabra se asigna a un vector y los valores del vector se aprenden de la misma manera que lo hace una NN (redes neuronales).
El enfoque clave de la técnica de inserción de palabras es una representación distribuida densa para cada palabra.
Diferentes métodos / algoritmos de incrustación de palabras
Como se discutió anteriormente, los métodos / algoritmos de incorporación de palabras aprenden una representación vectorial de valor real a partir de un corpus de texto. Este proceso de aprendizaje puede usarse con el modelo NN en tareas como clasificación de documentos o es un proceso no supervisado como estadísticas de documentos. Aquí vamos a discutir dos métodos / algoritmos que se pueden usar para aprender una palabra incrustada de texto:
Word2Vec de Google
Word2Vec, desarrollado por Tomas Mikolov, et. Alabama. en Google en 2013, es un método estadístico para aprender de manera eficiente una incrustación de palabras de un corpus de texto. En realidad, se desarrolló como una respuesta para hacer más eficiente el entrenamiento basado en NN de la inserción de palabras. Se ha convertido en el estándar de facto para la inserción de palabras.
La incrustación de palabras por Word2Vec implica el análisis de los vectores aprendidos, así como la exploración de matemáticas vectoriales en la representación de palabras. A continuación se muestran los dos métodos de aprendizaje diferentes que se pueden utilizar como parte del método Word2Vec:
- Modelo CBoW (bolsa continua de palabras)
- Modelo continuo de omisión de gramo
GloVe de Standford
GloVe (Vectores globales para representación de palabras), es una extensión del método Word2Vec. Fue desarrollado por Pennington et al. en Stanford. El algoritmo GloVe es una combinación de ambos:
- Estadísticas globales de técnicas de factorización matricial como LSA (Análisis semántico latente)
- Aprendizaje local basado en el contexto en Word2Vec.
Si hablamos de su funcionamiento, en lugar de utilizar una ventana para definir el contexto local, GloVe construye una matriz de co-ocurrencia de palabras explícita utilizando estadísticas en todo el corpus de texto.
Desarrollo de incrustaciones de Word2Vec
Aquí, desarrollaremos la incrustación de Word2Vec usando Gensim. Para trabajar con un modelo Word2Vec, Gensim nos proporcionaWord2Vec clase que se puede importar desde models.word2vec. Para su implementación, word2vec requiere mucho texto, por ejemplo, todo el corpus de revisión de Amazon. Pero aquí, aplicaremos este principio en un texto de memoria pequeña.
Ejemplo de implementación
Primero necesitamos importar la clase Word2Vec de gensim.models de la siguiente manera:
from gensim.models import Word2Vec
A continuación, necesitamos definir los datos de entrenamiento. En lugar de tomar un archivo de texto grande, estamos usando algunas oraciones para implementar este principio.
sentences = [
['this', 'is', 'gensim', 'tutorial', 'for', 'free'],
['this', 'is', 'the', 'tutorials' 'point', 'website'],
['you', 'can', 'read', 'technical','tutorials', 'for','free'],
['we', 'are', 'implementing','word2vec'],
['learn', 'full', 'gensim', 'tutorial']
]
Una vez que se proporcionan los datos de entrenamiento, necesitamos entrenar el modelo. se puede hacer de la siguiente manera:
model = Word2Vec(sentences, min_count=1)
Podemos resumir el modelo de la siguiente manera -;
print(model)
Podemos resumir el vocabulario de la siguiente manera:
words = list(model.wv.vocab)
print(words)
A continuación, accedamos al vector de una palabra. Lo estamos haciendo por la palabra 'tutorial'.
print(model['tutorial'])
A continuación, debemos guardar el modelo:
model.save('model.bin')
A continuación, necesitamos cargar el modelo:
new_model = Word2Vec.load('model.bin')
Finalmente, imprima el modelo guardado de la siguiente manera:
print(new_model)
Ejemplo de implementación completo
from gensim.models import Word2Vec
sentences = [
['this', 'is', 'gensim', 'tutorial', 'for', 'free'],
['this', 'is', 'the', 'tutorials' 'point', 'website'],
['you', 'can', 'read', 'technical','tutorials', 'for','free'],
['we', 'are', 'implementing','word2vec'],
['learn', 'full', 'gensim', 'tutorial']
]
model = Word2Vec(sentences, min_count=1)
print(model)
words = list(model.wv.vocab)
print(words)
print(model['tutorial'])
model.save('model.bin')
new_model = Word2Vec.load('model.bin')
print(new_model)
Salida
Word2Vec(vocab=20, size=100, alpha=0.025)
[
'this', 'is', 'gensim', 'tutorial', 'for', 'free', 'the', 'tutorialspoint',
'website', 'you', 'can', 'read', 'technical', 'tutorials', 'we', 'are',
'implementing', 'word2vec', 'learn', 'full'
]
[
-2.5256255e-03 -4.5352755e-03 3.9024993e-03 -4.9509313e-03
-1.4255195e-03 -4.0217536e-03 4.9407515e-03 -3.5925603e-03
-1.1933431e-03 -4.6682903e-03 1.5440651e-03 -1.4101702e-03
3.5070938e-03 1.0914479e-03 2.3334436e-03 2.4452661e-03
-2.5336299e-04 -3.9676363e-03 -8.5054158e-04 1.6443320e-03
-4.9968651e-03 1.0974540e-03 -1.1123562e-03 1.5393364e-03
9.8941079e-04 -1.2656028e-03 -4.4471184e-03 1.8309267e-03
4.9302122e-03 -1.0032534e-03 4.6892050e-03 2.9563988e-03
1.8730218e-03 1.5343715e-03 -1.2685956e-03 8.3664013e-04
4.1721235e-03 1.9445885e-03 2.4097660e-03 3.7517555e-03
4.9687522e-03 -1.3598346e-03 7.1032363e-04 -3.6595813e-03
6.0000515e-04 3.0872561e-03 -3.2115565e-03 3.2270295e-03
-2.6354722e-03 -3.4988276e-04 1.8574356e-04 -3.5757164e-03
7.5391348e-04 -3.5205986e-03 -1.9795434e-03 -2.8321696e-03
4.7155009e-03 -4.3349937e-04 -1.5320212e-03 2.7013756e-03
-3.7055744e-03 -4.1658725e-03 4.8034848e-03 4.8594419e-03
3.7129463e-03 4.2385766e-03 2.4612297e-03 5.4920948e-04
-3.8912550e-03 -4.8226118e-03 -2.2763973e-04 4.5571579e-03
-3.4609400e-03 2.7903817e-03 -3.2709218e-03 -1.1036445e-03
2.1492650e-03 -3.0384419e-04 1.7709908e-03 1.8429896e-03
-3.4038599e-03 -2.4872608e-03 2.7693063e-03 -1.6352943e-03
1.9182395e-03 3.7772327e-03 2.2769428e-03 -4.4629495e-03
3.3151123e-03 4.6509290e-03 -4.8521687e-03 6.7615538e-04
3.1034781e-03 2.6369948e-05 4.1454583e-03 -3.6932561e-03
-1.8769916e-03 -2.1958587e-04 6.3395966e-04 -2.4969708e-03
]
Word2Vec(vocab=20, size=100, alpha=0.025)
Visualización de la incrustación de palabras
También podemos explorar la palabra incrustación con visualización. Se puede hacer utilizando un método de proyección clásico (como PCA) para reducir los vectores de palabras de alta dimensión a gráficos 2-D. Una vez reducidos, podemos trazarlos en el gráfico.
Trazado de vectores de palabras con PCA
Primero, necesitamos recuperar todos los vectores de un modelo entrenado de la siguiente manera:
Z = model[model.wv.vocab]
A continuación, necesitamos crear un modelo PCA 2-D de vectores de palabras utilizando la clase PCA de la siguiente manera:
pca = PCA(n_components=2)
result = pca.fit_transform(Z)
Ahora, podemos trazar la proyección resultante usando matplotlib de la siguiente manera:
Pyplot.scatter(result[:,0],result[:,1])
También podemos anotar los puntos en el gráfico con las propias palabras. Trace la proyección resultante utilizando matplotlib de la siguiente manera:
words = list(model.wv.vocab)
for i, word in enumerate(words):
pyplot.annotate(word, xy=(result[i, 0], result[i, 1]))
Ejemplo de implementación completo
from gensim.models import Word2Vec
from sklearn.decomposition import PCA
from matplotlib import pyplot
sentences = [
['this', 'is', 'gensim', 'tutorial', 'for', 'free'],
['this', 'is', 'the', 'tutorials' 'point', 'website'],
['you', 'can', 'read', 'technical','tutorials', 'for','free'],
['we', 'are', 'implementing','word2vec'],
['learn', 'full', 'gensim', 'tutorial']
]
model = Word2Vec(sentences, min_count=1)
X = model[model.wv.vocab]
pca = PCA(n_components=2)
result = pca.fit_transform(X)
pyplot.scatter(result[:, 0], result[:, 1])
words = list(model.wv.vocab)
for i, word in enumerate(words):
pyplot.annotate(word, xy=(result[i, 0], result[i, 1]))
pyplot.show()