Nombres: Miguel Angel Asencio Hurtado
Obtenga el archivo del modelo word2vec entrenado con WikiNews en Español: eswikinews.bin
In [1]:
# import word2vec model from gensim
from gensim.models.word2vec import Word2Vec
# load pre-trained model
model = Word2Vec.load_word2vec_format('eswikinews.bin', binary=True)
Composicionalidad y analogía son dos mecanismos diferentes que se pueden usar con representaciones distribuidas. La idea es usar independientemente composicionalidad y analogía para resolver el mismo problema. El problema a resolver es encontrar el presidente de un país dado.
Primero usaremos composicionalidad. La función siguiente debe recibir el nombre de un país y retornar una lista de palabras que posiblemente corresponden a presidentes.
Por ejemplo, si la función se invoca con 'ecuador' como argumento:
>>> presidents_comp('ecuador')
[u'jamil_mahuad',
u'presidencia',
u'jose_maria_velasco_ibarra',
u'republica',
u'rafael_correa',
u'gustavo_noboa',
u'lucio_gutierrez',
u'abdala_bucaram',
u'vicepresidente',
u'gabriel_garcia_moreno']
In [2]:
def presidents_comp(country):
return [elm[0] for elm in model.most_similar(positive=[country, 'presidente'])]
for country in ['colombia', 'venezuela', 'ecuador', 'brasil', 'argentina', 'chile']:
print country
for president in presidents_comp(country):
print ' ', president
El siguiente paso es usar analogías para encontrar el presidente de un país dado.
In [3]:
def presidents_analogy(country):
return [elm[0] for elm in model.most_similar(positive=[country, 'hugo_chavez'], negative=['venezuela'])]
for country in ['colombia', 'venezuela', 'ecuador', 'brasil', 'argentina', 'chile']:
print country
for president in presidents_analogy(country):
print ' ', president
¿Cual versión funciona mejor? Explique claramente. ¿Por qué cree que este es el caso?
R/ Funciona mejor la analogía, ya que al revisar la lista de resultados no existen resultados del tipo presidencia
, republica
, etc.
Esto debe ser porque al tener más contexto es más facil entender de qué es que se está hablando, ya que en el caso del presidente la composición puede relacionar con noticias de política, más que de realizar una búsqueda de la relación.
In [4]:
def antonimo(palabra):
if palabra is 'blanco':
return 'negro'
return [elm[0] for elm in model.most_similar(positive=[palabra, 'negro'], negative=['blanco'])][0]
for palabra in ['blanco', 'menor', 'rapido', 'arriba']:
print palabra, antonimo(palabra)
Busque más ejemplos en los que funcione y otros en los que no funcione. Explique.
In [5]:
print ' FUNCIONA'
for palabra in 'salir verdad seco izquierda'.split():
print palabra + ':', antonimo(palabra)
print '\n NO FUNCIONA'
for palabra in 'rico paz joven comunismo'.split():
print palabra + ':', antonimo(palabra)
R/ Funciona bastante bien en la mayoría de los casos, pero cuando no encuentra el antónimo, retorna una palabra en extremo relacionada, como un sinónimo o un derivado.
Gensim provee la función doesnt_match, la cual permite encontrar, dentro de una lista de palabras, una palabra que está fuera de lugar. Por ejemplo:
In [6]:
model.doesnt_match("azul rojo abajo verde".split())
Out[6]:
La idea es implementar la misma funcionalidad por nuestra cuenta. La condición es que solo podemos usar la función similarity de Gensim la cual calcula la similitud de dos palabras:
In [7]:
print model.similarity('azul', 'rojo')
print model.similarity('azul', 'abajo')
In [8]:
import numpy as np
def no_es_como_las_otras(word_list):
size = len(word_list)
word_matrix = np.zeros(shape=(size, size))
for row in xrange(size):
for column in xrange(size):
word_matrix[row, column] = model.similarity(word_list[row], word_list[column])
sum_columns = word_matrix.sum(axis=0)
return word_list[np.argmin(sum_columns)]
print no_es_como_las_otras("azul rojo abajo verde".split())
print no_es_como_las_otras("azul izquierda abajo derecha".split())
print no_es_como_las_otras("colombia suiza carro venezuela".split())
print no_es_como_las_otras("colombia suiza argentina venezuela".split())
Nota: no olvide incluir los nombres de los integrantes del grupo (máximo 2) en el encabezado del notebook. Remita el notebook al siguiente file request de Dropbox: https://www.dropbox.com/request/k4GFiKHjl8OuE9sCiq1N.