Fundación Universitaria Konrad Lorenz
Docente: Viviana Márquez vivianam.penama@konradlorenz.edu.co
Clase #6: Marzo 25, 2021 (Sí, hoy sí hay clase 😜)
Medidas de similitud
Word2Vec es frecuentemente llamado una representación distribuida, mientras que TF-IDF, BoW, etc. son llamados representaciones locales.
1 | 2 | 3 | 4 | ... | |
---|---|---|---|---|---|
bardiwac | 1 | 1 | 1 | 1 | |
fuerte | 0 | 0 | 1 | 0 | |
aceite de motor | 1 | 0 | 1 | 0 | |
tortillas | 0 | 1 | 0 | 0 | |
vino | 1 | 1 | 1 | 1 |
Entrenar tu propio embedding es un proceso muy costoso (en terminos computacionales y de tiempo)
Afortunadamente, existen embeddings pre-entrenados
🇬🇧 Inglés: Standford GloVe. Descarga aquí
🇪🇸 Español: DCC UChile. Descarga aquí
🌎 Más idiomas: FastText
(Viviana, cambia de Jupyter notebook)
import re
import pandas as pd
from nltk.corpus import stopwords
stopwords_sp = stopwords.words('spanish')
def pre_procesado(texto):
texto = texto.lower()
texto = re.sub(r"[\W\d_]+", " ", texto)
texto = " ".join([palabra for palabra in texto.split() if palabra not in stopwords_sp])
return texto.split()
rap = pd.read_csv("../archivos/rap_espanol.csv")
rap['pp'] = rap['letra'].apply(lambda texto: pre_procesado(texto))
rap
id | artista | cancion | album | letra | anyo | visitas | pp | |
---|---|---|---|---|---|---|---|---|
0 | 0 | Denom | Machete (con Jarfaiter y Gente jodida) | Medicina | Para su nuevo disco "Medicina", Denom ha vuelt... | 2019 | 126 | [nuevo, disco, medicina, denom, vuelto, contar... |
1 | 1 | Denom | Vacío (con Ivo Incuerdo) | Medicina | [Denom]\nYo que quería, yo que pedía vida,\nSe... | 2019 | 361 | [denom, quería, pedía, vida, partió, mitad, ah... |
2 | 2 | Denom | El orgullo es fiel (con Juancho Marqués y Elio... | Medicina | "El orgullo es fiel" es uno de los cortes incl... | 2019 | 262 | [orgullo, fiel, cortes, incluidos, nuevo, disc... |
3 | 3 | Denom | Mueve mueve (con Fernandocosta) | Medicina | [Estribillo: Denom] (x2)\nMueve, mueve, mueve,... | 2019 | 578 | [estribillo, denom, x, mueve, mueve, mueve, ti... |
4 | 4 | Jaro Desperdizio | Insomnia | Sin álbum, es un vídeo suelto | [Estribillo]\nY en esta noche, ¿Quién me arrop... | 2019 | 219 | [estribillo, noche, quién, arropará, si, invie... |
... | ... | ... | ... | ... | ... | ... | ... | ... |
9320 | 50 | Pol y Polanko | Mas o menos | Suena | Cuestiones de fianzas, tras de más desconfianz... | 2009 | 1056 | [cuestiones, fianzas, tras, desconfianzas, abr... |
9321 | 51 | Porta | Palabras mudas (con Gema) | Reset | Quiero decirte tantas cosas que no pude,\nasum... | 2012 | 20184 | [quiero, decirte, tantas, cosas, pude, asume, ... |
9322 | 52 | Porta | Causa y efecto (con H0lynaight) | Reset | [Porta]\nTenemos que hablar, esto tiene que ca... | 2012 | 16159 | [porta, hablar, cambiar, sé, si, error, igual,... |
9323 | 53 | Doble r ce | Que sepas que te amo | Sin álbum, es un tema suelto | [Estribillo]\n(En inglés)\n\n\nNunca llegarás ... | 2012 | 4015 | [estribillo, inglés, nunca, llegarás, entender... |
9324 | 54 | Arbel López | Im ready | Luces y sombras | Soy yo, hello, soy el Arbel López,\nnegrata es... | 2011 | 878 | [hello, arbel, lópez, negrata, lado, encargado... |
9325 rows × 8 columns
Dado las recientes actualizaciones de Gensim por favor utilizar el siguiente comando en la consola:
conda install -c conda-forge gensim
Dependiendo de su instalación, puede que el comando de arriba no le funcione. Por favor intente los siguientes:
pip install --upgrade gensim
conda install -c anaconda gensim
conda update all
# Por favor verifique que su version de Python sea igual o mayor a 3.6 y Gensim igual o mayor a 4.0
import gensim
import platform
print(f"Versión de Python {platform.python_version()}")
print(f"Versión de Gensim {gensim.__version__}")
Versión de Python 3.7.4 Versión de Gensim 4.0.0
import gensim.models.word2vec as w2v
%%time
mi_modelo = w2v.Word2Vec(rap['pp'].values,
sg=1, # 1 para usar skip-gram, 0 para usar CBOW
seed=1, # 1 para tener resultados reproducibles y debuggear
vector_size=256, # tamaño de los vectores
min_count=50, # mínimo de veces que ha de aparecer una palabra para ser considerada
window=12, # ventana contextual de cada palabra
)
CPU times: user 2min 7s, sys: 551 ms, total: 2min 7s Wall time: 43.5 s
mi_modelo.wv.most_similar("familia")
[('biblia', 0.508780300617218), ('cla', 0.4786092936992645), ('madre', 0.39785200357437134), ('amigos', 0.39018967747688293), ('hermanos', 0.3811120390892029), ('familiares', 0.37665125727653503), ('misa', 0.3663142919540405), ('lealtad', 0.3648858964443207), ('pregúntale', 0.3623541593551636), ('daría', 0.36156165599823)]
mi_modelo.wv.most_similar("arte")
[('aparte', 0.5302219986915588), ('marte', 0.5211095213890076), ('parte', 0.4991408884525299), ('tocarte', 0.4383562505245209), ('contarte', 0.4300921857357025), ('paisaje', 0.41199666261672974), ('amarte', 0.4081098735332489), ('matarte', 0.40696316957473755), ('formar', 0.39395761489868164), ('comparte', 0.3872564733028412)]
def similitud(inicio1, fin1, inicio2):
fin2 = mi_modelo.wv.most_similar_cosmul(
positive=[inicio2, inicio1],
negative=[fin1])[0][0]
return f"{inicio1} es a {fin1} como {inicio2} es a {fin2}"
similitud("amar", "amor", "odio")
'amar es a amor como odio es a odiar'
matrix = pd.DataFrame(mi_modelo.wv.get_normed_vectors(), index = mi_modelo.wv.key_to_index)
matrix
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ... | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
si | 0.006854 | 0.009238 | 0.132820 | 0.046032 | -0.004742 | -0.011036 | 0.101056 | 0.022447 | -0.089494 | -0.025893 | ... | 0.078575 | -0.081256 | -0.051896 | -0.083986 | 0.049583 | -0.024879 | -0.042265 | -0.058138 | -0.069282 | -0.018877 |
estribillo | -0.010373 | 0.005624 | -0.066704 | 0.006260 | 0.020833 | -0.039294 | 0.012473 | 0.056948 | -0.048660 | -0.092531 | ... | 0.024259 | 0.046653 | -0.101796 | -0.118024 | 0.058141 | -0.031343 | 0.036516 | -0.052801 | -0.095098 | 0.081295 |
solo | 0.003100 | 0.042456 | -0.000454 | -0.070493 | 0.016638 | -0.025740 | 0.128754 | 0.166545 | -0.064061 | -0.030062 | ... | 0.059331 | 0.042959 | -0.071245 | -0.049693 | -0.066746 | -0.006969 | 0.092938 | -0.112837 | -0.058877 | -0.052490 |
vida | 0.044707 | 0.005285 | 0.019016 | 0.018359 | -0.058691 | 0.054064 | -0.064846 | 0.025788 | -0.057404 | -0.105006 | ... | 0.113799 | -0.049045 | 0.012604 | 0.003571 | -0.061896 | -0.145983 | -0.058714 | 0.004952 | 0.040056 | -0.078447 |
ser | -0.025990 | 0.076181 | -0.030578 | -0.008085 | -0.026698 | 0.042986 | 0.080875 | 0.010481 | -0.033725 | -0.027058 | ... | 0.027132 | 0.033577 | -0.030955 | -0.066222 | 0.003171 | -0.099744 | 0.007878 | -0.039666 | -0.132293 | 0.030251 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
torres | 0.050053 | 0.018884 | 0.064209 | 0.038466 | 0.026945 | -0.049905 | 0.047887 | -0.029916 | -0.162463 | -0.080132 | ... | 0.077067 | 0.027943 | -0.102279 | -0.078279 | 0.011324 | -0.089518 | 0.103707 | 0.094977 | -0.009761 | -0.016863 |
rusa | 0.024294 | 0.039957 | 0.037184 | 0.039678 | 0.045077 | 0.004307 | -0.060320 | -0.057734 | 0.001522 | -0.029176 | ... | -0.015137 | -0.025113 | -0.020000 | -0.095727 | 0.054813 | -0.064962 | -0.046460 | -0.029151 | -0.049218 | 0.004284 |
tenerla | -0.109231 | 0.036724 | -0.057992 | 0.004128 | -0.048720 | -0.051757 | 0.022757 | 0.142200 | -0.129676 | -0.067751 | ... | 0.029300 | -0.056713 | -0.087483 | -0.082106 | 0.065083 | 0.026065 | -0.033345 | -0.048452 | -0.004089 | 0.033747 |
callando | 0.066576 | 0.029640 | 0.053095 | -0.017340 | -0.017067 | 0.020186 | 0.031095 | 0.012957 | -0.120709 | -0.042674 | ... | 0.151619 | 0.014955 | -0.074244 | -0.002204 | -0.068435 | -0.011286 | -0.098995 | -0.106896 | -0.021081 | -0.039137 |
presenta | 0.029073 | -0.035080 | -0.031253 | -0.025556 | 0.067798 | -0.022587 | -0.016373 | -0.052080 | -0.005112 | -0.014675 | ... | 0.020140 | -0.099176 | -0.136427 | -0.035867 | 0.062922 | 0.010328 | 0.095292 | 0.023916 | 0.054429 | -0.033861 |
6268 rows × 256 columns
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
# pip install plotly
import plotly.graph_objs as go
from plotly.offline import iplot, init_notebook_mode
%matplotlib inline
init_notebook_mode(connected=True)
pca = PCA(n_components=2)
result = pca.fit_transform(matrix)
result = pd.DataFrame(result)
result.columns = ['X', 'Y']
result['Palabra'] = matrix.index.values
trace = go.Scatter(x=result['X'].values,
y=result['Y'].values,
text=result['Palabra'].values,
mode='markers',
name="vocabulario")
layout = go.Layout(title="PCA")
fig = go.Figure(data=[trace], layout=layout)
iplot(fig)
Taller # 6: Representación vectorial de textos (Parte 3)
Fecha de entrega: Abril 8, 2021. (Antes del inicio de la próxima clase)