Ejemplo de Word Embeddings con Gensim

En posts anteriores vimos como las representaciones distribuidas permiten extraer mucha información de las palabras y mejorar el rendimiento de las aplicaciones de procesamiento de lenguaje natural.

Uno de los modelos más usados es Word2vec, creado en 2013 por Tomas Mikolov en Google, que se basa en redes neuronales de varias capas y tiene dos posibles arquitecturas: Skip-gram y CBOW.

Cuando queremos trabajar con representaciones distribuidas una opción es entrenar nuestro propio modelo de vectores o partir de un modelo ya pre-entrenado.

Google publica vectores pre-entrenados a partir de una base de datos de Google News con más de 100 mil millones de palabras. El modelo utiliza un espacio vectorial de 300 dimensiones para las 3 millones de frases o palabras.

Utilizando la liberia Gensim, creada y mantenida por Radim Řehůřek, se pueden realizar operaciones sobre los datos pre-entrenados.

En un ejemplo en Python cargamos las 10000 primeros tokens del modelo de Google. Vamos a ver cuáles son las palabras más próximas a la palabra “man” con su similitud (basada en la similitud coseno):

[(u’woman’, 0.7664013504981995),

(u’boy’, 0.6824871301651001),

(u’teenager’, 0.6586931347846985),

(u’girl’, 0.5921710729598999),

(u’men’, 0.5489761233329773),

(u’guy’, 0.5420036911964417),

(u’person’, 0.5342025756835938),

(u’Man’, 0.5316051840782166),

(u’suspect’, 0.5247485041618347),

(u’victim’, 0.5230302214622498)]

También se pueden realizar operaciones básicas de algebra lineal sobre los vectores. Como comentamos en un post pasado, desde el punto de vista sintáctico la diferencia entre gato y gatos es la misma que entre perro y perros: Xgato – Xgatos ≈ Xperro – Xperros.  Si en el modelo buscamos las palabras más similares a Xgatos + Xperro – Xperros con “model.most_similar(positive=[‘cats’, ‘dog’], negative=[‘dogs’])” tenemos:

[(u’cat’, 0.9005791544914246),

(u’pet’, 0.742516815662384),

(u’pets’, 0.6811208128929138),

(u’animal’, 0.6398640275001526),

(u’animals’, 0.5968189239501953),

(u’Dog’, 0.530439555644989),

(u’bird’, 0.526349663734436),

(u’birds’, 0.45574504137039185),

(u’zoo’, 0.4232518970966339),

(u’deer’, 0.41468214988708496)]

Un ejemplo de relación semántica es la relación entre una capital y el país al que pertenece.  Por ejemplo, tenemos la siguiente relación de equivalencia semántica Xroma – Xitalia ≈ Xparis – Xfrancia. Si en el modelo buscamos las palabras más similares a  Xitalia + Xparis – Xfrancia con “model.most_similar(positive=[‘Italy’, ‘Paris’], negative=[‘France’])” tenemos:

[(u’Milan’, 0.7222144603729248),

(u’Rome’, 0.7028311491012573),

(u’Italian’, 0.5911275148391724),

(u’Madrid’, 0.4780360758304596),

(u’Vienna’, 0.4576296806335449),

(u’Cairo’, 0.44126904010772705),

(u’London’, 0.44041353464126587),

(u’Berlin’, 0.43628376722335815),

(u’New_York’, 0.4358903169631958),

(u’Athens’, 0.4311559498310089)]

En este caso vemos que para el modelo Milán aparcería antes que Roma.

Por último vamos a crear un modelo PCA (análisis de componentes principales) en dos dimensiones de los vectores usando scikit-learn para poder visualizar los vectores. Por claridad, vamos a representar sólo 50 palabras y sus vectores reducidos. En la imagen vemos el resultado:

Visualización PCA de Word Embeddings
Visualización PCA de Word Embeddings

Como hemos podido observar en este sencillo ejemplo, las representaciones distribuidas permiten trabajar con espacios vectoriales más eficientes y extraer mucha información semántica y sintáctica de las palabras.

Un comentario sobre “Ejemplo de Word Embeddings con Gensim

Agrega el tuyo

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Orgullosamente ofrecido por WordPress | Tema: Baskerville 2 por Anders Noren.

Subir ↑

A %d blogueros les gusta esto: