# import word2vec model from gensim
from gensim.models.word2vec import Word2Vec
# load pre-trained model
model = Word2Vec.load_word2vec_format('eswikinews.bin', binary=True)

"""
Explanation: NLP and TM Módulo 4
Taller 1: word2vec
Nombres: Miguel Angel Asencio Hurtado
Obtenga el archivo del modelo word2vec entrenado con WikiNews en Español: eswikinews.bin
End of explanation
"""


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

"""
Explanation: 1. Comparando composicionalidad y analogía.
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:
```python



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']
 ```
End of explanation
"""


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

"""
Explanation: El siguiente paso es usar analogías para encontrar el presidente de un país dado.
End of explanation
"""


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)

"""
Explanation: ¿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.
2. Escriba una función que calcule el antónimo de una palabra
End of explanation
"""


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)

"""
Explanation: Busque más ejemplos en los que funcione y otros en los que no funcione. Explique.
End of explanation
"""


model.doesnt_match("azul rojo abajo verde".split())

"""
Explanation: 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.
3. Una de estas cosas no es como las otras...
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:
End of explanation
"""


print model.similarity('azul', 'rojo')
print model.similarity('azul', 'abajo')

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())

"""
Explanation: 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:
End of explanation
"""


