Ejercicio de similitud: calcular similitud entre frases

Autor: | Última modificación: 13 de enero de 2023 | Tiempo de Lectura: 3 minutos
Temas en este post: ,

En este artículo realizaremos un ejercicio de similitud en donde calcularemos lo parecidas que son dos frases:

  • Tengo miedo.
  • No tengo miedo.

Ejercicio de similitud

En este ejercicio de similitud calcularemos el parecido entre estas dos frases en Python. Veamos:

TOKENIZAR

«No tengo miedo»

[«No», «tengo», «miedo»]

Lo que vamos a hacer es tokenizar las dos oraciones. Tokenizar es el proceso mediante el cual dividimos una oración en conjuntos más pequeños, es decir, en palabras.

En el proceso de tokenización, las palabras, por defecto, se separan con espacios, que es la tokenización más simple que existe. No obstante, podemos separar de otros modos las palabras e, incluso, introducir algún tipo de patrón para que nos divida, por ejemplo, por comas. Veamos cómo hacerlo con una frase simple. Lo haremos con la función split, que le dice al algoritmo que nos separe la frase donde haya una coma:

#Ejercicio de similitud
a = "No tengo, miedo"
print  (a.split (' , '))

[‘No tengo’, ‘miedo’]

En este caso, se estaría separando la frase en dos: «no tengo» y «miedo».

Vamos a ver, por tanto, la similitud entre estas dos frases que significan todo lo contrario, pero que sintácticamente son tan similares.

#Ejercicio de similitud
ex1 = "Tengo miedo"
ex2 = "No tengo miedo"
#Ejercicio de similitud
from nltk.tokenize import word_tokenize

ex1_lost = word_tokenize (ex1.lower)
ex2_lost = word_tokenize (ex2.lower)

print (ex1_list)
print (ex2_list)

[‘tengo’, ‘miedo’]

[‘no’, ‘tengo’, ‘miedo’]

Creamos los conjuntos de ambas frases y los unimos.

Vamos a realizar el conjunto de palabras de cada frase, es decir, vamos a coger las palabras únicas de cada frase y vamos a crear un conjunto único. Ese conjunto único, el cual es como nuestra bolsa de palabras, es en donde tenemos las palabras que existen en nuestro dataset.

#Ejercicio de similitud
ex1_set = set (ex1_list)
ex2_set = set (ex2_list)

join_set = ex1_set.union (ex2_set)
print (join_set)

{‘no’, ‘miedo’, ‘tengo’}

En este caso tenemos únicamente 3 palabras. Serían 4, pero al agregarle el .lower al proceso de tokenización se eliminan las mayúsculas iniciales que pueda haber y se estandarizan todos los datos con minúscula.

Construimos los vectores para ambas frases, para lo que usamos un bucle en el que iteramos sobre el conjunto de palabras, y vamos a chequear si la palabra existe en la lista número 1. Si existe, vamos a añadir un 1 al array de resultados; si no existe, vamos a añadir un 0.

Haremos exactamente lo mismo con la frase número 2.

Si imprimimos esto, nos aparecen unas listas en los que se muestran los resultados de aparición:

#Ejercicio de similitud
sent1_array = [ ]
sent2_array = [ ]

for word in join_set:
if word is ex1_list:
sent1_array.append (1)
else:
sent1_array.append (0)
if word is ex2_list:
sent2_array.append (1)
else:
sent2_array.append (0)

print (sent1_array)
print (sent2_array)

[0, 1, 1]

[1, 1, 1]

Por último, calculamos la similitud. ¿Cómo lo hacemos? Primero tenemos que convertir lo que hemos hecho en un array. Debemos ejecutar este paso, porque ya sabemos que, si trabajamos con listas, no es posible realizar ningún tipo de operación matemática.

Acto seguido, escribiremos la ecuación de similitud que ya hemos visto en otros artículos, donde hacíamos el producto escalar empleando el símbolo @ y dividíamos por el módulo de cada vector. Para calcular el módulo utilizábamos linalg, que es el módulo de álgebra lineal de numpy.

Así, si imprimimos la similitud, vamos a poder ver cuál es el resultado:

#Ejercicio de similitud
import numpy as np

X_array = np.array (sent1_array)
Y_array = np.array (sent2_array)

similarity = (X_array @ Y_array)  / (np.linalgt.norm (X_array) * np.linalg.norm (Y_array))

print (f"Similarity: {similarity}")

Similarity: 0.8164965809277259

Pese a su gran diferencia semántica, ya que sus significados son completamente opuestos, estas frases tienen una similitud muy alta, ya que llega a más del 80%.

Como vemos, son frases muy parecidas, pero realmente significan totalmente lo contrario. Normalmente, se suele denominar cosine similarity a calcular la similitud entre dos vectores o frases usando este método. Hay formas para tener en cuenta el contexto que engloba a la palabra y así determinar una similitud más precisa.

¿Quieres seguir aprendiendo?

Ahora que hemos visto cómo funciona este ejercicio de similitud, podemos seguir aprendiendo sobre Big Data, una de las disciplinas más demandadas hoy en día. Para ello tenemos el Big Data, Inteligencia Artificial & Machine Learning Full Stack Bootcamp, la formación intensiva e íntegra de alta calidad en la que podrás adquirir los conocimientos teóricos y prácticos que necesitas para entrar en el mercado laboral tecnológico de forma eficiente y rápida. ¡Anímate a seguir cambiando tu futuro; solicita más 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]

¿Trabajo? Aprende a programar y consíguelo.

¡No te pierdas la próxima edición del Aprende a Programar desde Cero Full Stack Jr. Bootcamp!

 

Prepárate en 4 meses, aprende las últimas tecnologías y consigue trabajo desde ya. 

 

Solo en España hay más de 120.400 puestos tech sin cubrir, y con un sueldo 11.000€ por encima de la media nacional. ¡Es tu momento!

 

🗓️ Próxima edición: 13 de febrero

 

Reserva tu plaza descubre las becas disponibles.