Cuándo dos textos se parecen
La similitud del coseno mide cuánto se parecen dos textos comparando los recuentos de sus palabras. Un buscador la usa para ordenar los resultados, y una biblioteca para encontrar apuntes parecidos al que tienes delante.
Dos frases pueden usar casi las mismas palabras y decir cosas distintas, o usar otras y decir lo mismo. La medida no entiende el significado, pero sí da un número que se puede comparar.
Al final de esta lección
Nota
Puedo medir cuánto se parecen dos textos con la similitud del coseno.
Palabras clave
| Palabra | Qué significa |
|---|---|
| Vector | una fila de números, uno por cada palabra del vocabulario |
| Producto escalar | la suma de multiplicar dos vectores posición a posición |
| Longitud | la raíz de la suma de los cuadrados de un vector |
| Similitud del coseno | el producto escalar entre las dos longitudes |
| Vocabulario común | las palabras que se usan para armar los dos vectores |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un texto se convierte en un vector
Para comparar textos con números, primero se elige un vocabulario común. Después se cuenta cuántas veces sale cada palabra del vocabulario en cada texto.
La fila de recuentos es un vector. Con cinco palabras en el vocabulario, cada texto es una fila de cinco números. Dos textos con el mismo vocabulario tienen vectores del mismo tamaño y se pueden comparar posición a posición.
Convierte una frase en un vector
# Un texto se convierte en una fila de recuentos.
vocab = ["tren", "bus", "llega", "tarde", "puntual"]
tokens = "el tren llega tarde".split()
vector = []
for word in vocab:
vector.append(tokens.count(word))
print(vector)
# Cambia el texto por "el bus llega tarde" y compara las dos filas.
Ejemplo resuelto: dos avisos de transporte
| Texto | tren | bus | llega | tarde | puntual |
|---|---|---|---|---|---|
| el tren llega tarde | 1 | 0 | 1 | 1 | 0 |
| el bus llega tarde | 0 | 1 | 1 | 1 | 0 |
| tren puntual puntual | 1 | 0 | 0 | 0 | 2 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
El producto escalar suma lo común
El producto escalar multiplica los dos vectores posición a posición y suma los resultados. Una palabra que está en los dos textos suma. Una que solo está en uno multiplica por cero y no suma nada.
Para los dos avisos de arriba: 1 por 0, más 0 por 1, más 1 por 1, más 1 por 1, más 0 por 0. Eso da 2, las dos palabras que comparten: «llega» y «tarde».
Calcula un producto escalar
# El producto escalar: multiplica posición a posición y suma.
a = [1, 0, 1, 1, 0]
b = [0, 1, 1, 1, 0]
total = 0
for n in range(len(a)):
total = total + a[n] * b[n]
print("producto escalar:", total)
# Cambia b por [1, 0, 1, 1, 0] y mira qué pasa.
El coseno corrige el efecto del tamaño
El producto escalar crece si el texto es más largo. Para evitarlo, se divide entre las longitudes de los dos vectores. La longitud es la raíz de la suma de los cuadrados.
El resultado es la similitud del coseno. Va de 0, que significa que no comparten ninguna palabra, a 1, que significa que tienen las mismas proporciones.
Calcula el coseno de dos vectores
docker exec jupyter python3 -c "print(round((1*2+2*1)/(5**0.5*5**0.5),2))"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Un error muy común
Advertencia
Mucha gente cree que un coseno alto significa que los dos textos dicen lo mismo. Solo significa que usan las mismas palabras en proporciones parecidas. «El examen es fácil» y «El examen no es fácil» tienen un coseno alto y dicen lo contrario.
Para ir más lejos: el aviso más parecido
Escribe cuatro avisos cortos de una facultad y una pregunta de un estudiante. Convierte los cinco textos en vectores con el mismo vocabulario.
Calcula el coseno de la pregunta con cada aviso. ¿Cuál sale más parecido? Cambia una palabra de la pregunta y vuelve a mirar.