En este artículo vamos a realizar un ejercicio de similitud entre dos frases utilizando cosine similarity. Vamos a intentar calcular la similitud entre dos frases usando el producto escalar. Primero, debemos convertir ambas frases en un vector y, para ello, vamos a hacer uso de la librería nltk.
Ejercicio de similitud entre dos frases
Veamos:
from nltk.tokenize import word_tokenize
#Ejercicio de similitud entre dos frases
sent_1 = "Me encantan los perros"
sent_2 = "Tengo 5 perros porque me encantan"
test = "Alex"
test.lower ()
‘alex’
test = "Alex"
test.upper ()
ALEX
#Ejercicio de similitud entre dos frases
sent1_list = word_tokenize (sent_1.lower ())
sent2_list = word_tokenize (sent_2.lower ())
print (sent1_list)
print (sent2_list)
[‘me’, ‘encantan’, ‘los’, ‘perros’]
[‘tengo’, ‘5’, ‘perros’, ‘porque’, ‘me’, ‘encantan’]
Vamos a crear un conjunto único de palabras, para lo que usamos set:
#Ejercicio de similitud entre dos frases
sent1_set = set (sent1_list)
sent2_set = set (sent2_list)
print (sent1_set)
print (sent2_set)
{‘encantan’, ‘me’, ‘perros’, ‘los’}
{‘encantan’, ‘me’, ‘5’, ‘tengo’, ‘perros’, ‘porque’}
#Ejercicio de similitud entre dos frases
join_set = sent1_set.union (sent2_set)
print (join_set)
{‘encantan’, ‘me’, ‘5’, ‘perros’, ‘tengo’, ‘porque’, ‘los’}
Ahora vamos a crear un vector en función de si la frase contiene una palabra del conjunto o no, por ejemplo:
sent = hola tengo miedo conjunto = {‘hola’, ‘miedo’}
Dado que tanto hola como miedo están en el conjunto, el vector quedará definido por:
res = [1, 0, 1]
print (sent1_list)
print (sent2_list)
[‘me’, ‘encantan’, ‘los’, ‘perros’]
[‘tengo’, ‘5’, ‘perros’, ‘porque’, ‘me’, ‘encantan’]
¿Cómo convertimos estos arrays en vectores? Lo hacemos con el join_set y si una palabra aparece en la frase # 1, vamos a añadir un 1; si no aparece, vamos a añadir un 0.
#Ejercicio de similitud entre dos frases
sent1_array = [ ]
sent2_array = [ ]
for word in join_set:
print (word)
if word in sent1_list:
sent1_array.append (1)
else:
sent1_array.append (0)
if word in sent2_list:
sent2_array.append (1)
else:
sent2_array.append (0)
print (sent1_array)
print (sent2_array)
encantan
me
5
perros
tengo
porque
los
Ahora simplemente convertimos ambas listas a np.array y calculamos la similitud con la ecuación anterior.
[1, 1, 0, 1, 0, 0, 1]
[1, 1, 1, 1, 1, 1, 0]
print (type (sent1_array))
<class ‘list’>
X_array = np.array (sent1_array)
Y_array = np.array (sent2_array)
#Ejercicio de similitud entre dos frases
similarity = (X_array @ Y_array) / (np.linalg.norm (X_array) * np.linalg.norm
print (similarity)
0.6123724356957946
Por tanto, ambas frases son muy parecidas entre ellas. Esto tiene un problema y es que no consideramos el significado de las frases, por ejemplo «Tengo miedo» y «No tengo miedo» son frases que resultarían muy parecidas, pero significan todo lo contrario.
Es decir, es importante tener en cuenta no solo la sintaxis, sino la semántica y el ámbito pragmático de la oración.
¿Qué sigue?
Para seguir aprendiendo sobre Big Data tenemos el Big Data, Inteligencia Artificial & Machine Learning Full Stack Bootcamp, una formación intensiva e íntegra en la que podrás adquirir todos los conocimientos necesarios para entrar de forma rápida en el mercado laboral. ¡Anímate a impulsar tu futuro y solicita información ahora!