Ejercicio de similitud entre dos frases

Autor: | Última modificación: 13 de enero de 2023 | Tiempo de Lectura: 2 minutos

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!

👉 Descubre más del Big Data, Inteligencia Artificial & Machine Learning Full Stack Bootcamp ¡Descarga el temario!

👉 Prueba el Bootcamp Gratis por una Semana ¡Empieza ahora mismo!

👉 Conoce nuestros otros Bootcamps en Programación y Tecnología

[email protected]

Días

Big data, inteligencia artificial & machine learning full stack bootcamp

Fórmate en Big Data y Consigue el Empleo que sueñas

becas | opciones de financiación