#!/usr/bin/env python # coding: utf-8 #

# # # **NOTEBOOK 5** # --- # # **Indexación y recuperación de información** # ## **Bag-of-Words (BoW)** # # El modelo **Bag-of-Words (BoW)** es una técnica comúnmente utilizada en el procesamiento del lenguaje natural (NLP) y la minería de texto para convertir texto en una forma que se pueda ser analizada y procesada por algoritmos de aprendizaje automático. # # El modelo BoW trata cada documento como una 'bolsa' de palabras, ignorando completamente el orden de las palabras y enfocándose únicamente en la frecuencia (o presencia) de palabras. Representa los documentos como vectores en los cuales cada dimensión corresponde a una palabra del vocabulario, y el valor puede representar la frecuencia de esa palabra en el documento. # # ### **Pasos para Implementar BoW** # # 1. **Tokenización**: Divide el texto en palabras o 'tokens'. # # 2. **Construcción de Vocabulario**: Crea un vocabulario de todas las palabras únicas presentes en el conjunto de datos. # # 3. **Vectorización**: Cada documento se convierte en un vector, donde cada dimensión representa una palabra del vocabulario, y el valor en esa dimensión representa la frecuencia de esa palabra en el documento (o simplemente la presencia/ausencia de la palabra). # # Por ejemplo: # # Tomemos un pequeño corpus de tres frases para ilustrar cómo funciona: # # 1. "El gato juega en el jardín." # 2. "El perro duerme en la casa." # 3. "El niño juega con el perro." # # Primero, realizamos la tokenización (en este caso, palabras) y construimos un vocabulario con todas las palabras únicas en nuestro corpus: # # Vocabulario: {el, gato, juega, en, jardín, perro, duerme, casa, niño, con} # # Tenemos 10 palabras únicas en nuestro vocabulario. Por tanto, cada frase puede ser representada como un vector de 10 dimensiones. Es decir, cada palabra del vocabulario es un vector de 10 dimensiones, donde todas las dimensiones son cero excepto la dimensión correspondiente a la palabra, que es 1. # # # # # # # # # # # # # # #
el1000000000
gato0100000000
juega0010000000
en0001000000
jardín0000100000
perro0000010000
duerme0000001000
casa0000000100
niño0000000010
con0000000001
# # # Ahora, representamos cada frase como un vector en este espacio de vocabulario donde el vector resultante se obtiene sumando los vectores de las palabras que aparecen en la frase, como se muestra a continuación: # # 1. "El gato juega en el jardín." # - [2, 1, 1, 1, 1, 0, 0, 0, 0, 0] # # 2. "El perro duerme en la casa." # - [1, 0, 0, 1, 0, 1, 1, 1, 0, 0] # # 3. "El niño juega con el perro." # - [2, 0, 1, 0, 0, 1, 0, 0, 1, 1] # # # En la primera frase el primer número representa la cantidad de veces que aparece la palabra "el", el segundo número representa "gato", el tercero "juega", y así sucesivamente según el orden del vocabulario que hemos establecido. Por ejemplo, en la tercera frase, "el" aparece dos veces, "juega" una vez, "perro" una vez, "niño" una vez y "con" una vez, lo que se refleja en el vector correspondiente. # # Este proceso convierte las frases en vectores numéricos que pueden ser utilizados en varias tareas de NLP, como la clasificación de texto, la recuperación de información, etc. Espero que esto te ayude a entender mejor cómo funciona el modelo Bag-of-Words! # # # ### **Ventajas de BoW** # # 1. **Simplicidad**: Es fácil de entender e implementar. # # 2. **Eficiencia**: Es computacionalmente menos intensivo en comparación con modelos más complejos. # # ### **Desventajas de BoW** # # 1. **Pérdida de Información**: Al ignorar el orden de las palabras, se puede perder información importante sobre el contexto y la semántica. # # 2. **Dimensionalidad Alta**: Puede resultar en vectores de dimensión muy alta si el vocabulario es grande, lo que puede aumentar los requerimientos computacionales. # # 3. **Problemas con Palabras Infrecuentes**: Palabras con baja frecuencia pueden no aportar mucho a la similitud entre documentos y pueden incluso introducir ruido. # # # ## **Similitud del Coseno** # # La **similitud del coseno** es una métrica utilizada para determinar el parecido entre dos vectores en un espacio multidimensional. Es calculada como el coseno del ángulo formado entre dos vectores, lo que permite medir la orientación, más que la magnitud, para determinar la similitud. Matemáticamente, se calcula utilizando la fórmula: # # $$ \text{Similitud del coseno} = \frac{A \cdot B}{||A|| \cdot ||B||} $$ # # donde: # - $ A $ y $ B $ son dos vectores. # - $ A \cdot B $ es el producto punto de $ A $ y $ B $. # - $ ||A|| $ y $ ||B|| $ son las magnitudes de los vectores $ A $ y $ B $, respectivamente. # # El valor resultante estará en el rango de -1 a 1, donde 1 indica que los vectores son idénticos, 0 indica que son ortogonales (sin similitud) y -1 indica que están opuestos. Esta métrica es ampliamente utilizada en análisis de texto, recuperación de información, y ciencia de datos para medir la similitud entre documentos o elementos en general. # # # ## **Aplicaciones** # ### **Similitud de documentos** # # Utilizando **BoW** y la **similitud del coseno** podemos calcular la similitud entre documentos. Supongamos que queremos medir el parecido entre diferentes frases (o documentos). Podemos utilizar el modelo BoW para convertir cada frase en un vector y luego medir la similitud entre los vectores utilizando una métrica de similitud como la distancia euclidiana o la similitud del coseno. Esto puede ser útil en tareas como la recuperación de información, la clasificación de texto, etc. # # Veamos un ejemplo sencillo. Supongamos que tenemos un corpus de cuatro frases: # # - A: "El gato juega en el jardín." # - B: "El perro duerme en la casa." # - C: "El niño juega con el perro." # - D: "El coche es azul." # # Ahora nuestro vocabulario será: # # Vocabulario: {el, gato, juega, en, jardín, perro, duerme, casa, niño, con, coche, es, azul} # # Por tanto, nuestros nuevos vectores de frases serán: # # - A = [2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0] # - B = [1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0] # - C = [2, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0] # - D = [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1] # # # **1. Similitud entre Frase (A) y Frase (B):** # - Producto punto (A·B): $ 1\cdot1 + 1\cdot0 + 1\cdot0 + 1\cdot1 + 1\cdot0 + 0\cdot1 + 0\cdot1 + 0\cdot1 + 0\cdot0 + 0\cdot0 + 0\cdot0 + 0\cdot0 + 0\cdot0 = 2 $ # - Magnitudes: $||A|| = \sqrt{5} $, $ ||B|| = \sqrt{5} $ # - Similitud del coseno: $ \frac{2}{\sqrt{5}\cdot\sqrt{5}} = \frac{2}{5} = 0.4$ # # **2. Similitud entre Frase (A) y Frase (C):** # - Producto punto (A·C): $ 1\cdot2 + 1\cdot0 + 1\cdot1 + 1\cdot0 + 1\cdot0 + 0\cdot1 + 0\cdot0 + 0\cdot0 + 0\cdot1 + 0\cdot1 + 0\cdot0 + 0\cdot0 + 0\cdot0 = 3 $ # - Magnitudes: $ ||A|| = \sqrt{5} $, $ ||C|| = \sqrt{7} $ # - Similitud del coseno: $ \frac{3}{\sqrt{5}\cdot\sqrt{7}} = 0.507 $ # # **3. Similitud entre Frase (A) y Frase (D):** # - Producto punto (A·D): $ 1\cdot1 + 1\cdot0 + 1\cdot0 + 1\cdot0 + 1\cdot0 + 0\cdot0 + 0\cdot0 + 0\cdot0 + 0\cdot0 + 0\cdot0 + 0\cdot1 + 0\cdot1 + 0\cdot1 = 1 $ # - Magnitudes: $ ||A|| = \sqrt{5} $, $ ||D|| = \sqrt{3} $ # - Similitud del coseno: $ \frac{1}{\sqrt{5}\cdot\sqrt{3}} = 0.258$ # --- # # ## **Ejercicio 1** # # Calcula la similitud entre las frases B y C usando la distancia del coseno. # # # --- # # ## **Práctica: similitud de documentos con bag-of-words y similitud del coseno** # # #### **Objetivo:** # Adquirir experiencia práctica en el cálculo de la similitud entre documentos utilizando el método de bag-of-words, la métrica de similitud del coseno y la utilización de funciones de PyTorch. # # #### **Contexto:** # Se proporciona un conjunto de 12 documentos relacionados con tecnología móvil y vehículos eléctricos. En el conjunto, algunos documentos tratan solo de tecnología móvil, otros solo de vehículos eléctricos, y hay documentos que abordan ambos temas simultáneamente. # #

# # #
Documentos #
#
# # #### **Instrucciones:** # 1. Preprocesamiento de datos: # - Convertir todos los textos a minúsculas. # - Eliminar signos de puntuación y otros caracteres no alfabéticos. # - (Opcional) realizar una eliminación de palabras comunes o "stop words". # 2. Construcción de bag-of-words: # - Crear un vocabulario global basado en todas las palabras únicas presentes en los documentos. # - Representar cada documento como un vector en el espacio del vocabulario. # 3. Cálculo de la similitud del coseno: # - Calcular la similitud del coseno entre todos los pares de documentos utilizando sus representaciones vectoriales. Utilizar para ello la función `cosine_similarity` de PyTorch. # # 4. Análisis: # - Identificar qué documentos son más similares entre sí y cuáles son menos similares. # - Observar la relación entre la similitud y los temas tratados en los documentos. Por ejemplo, determinar si los documentos que tratan sobre el mismo tema tienden a ser más similares entre sí que aquellos que tratan temas diferentes. # # 5. (Opcional) TF-IDF: # - Calcular los vectores TF-IDF de los documentos. # - Calcular la similitud del coseno entre los documentos utilizando los vectores TF-IDF y comparar los resultados con el modelo BoW. #   # # #### **Entregables:** # - Código fuente utilizado para el preprocesamiento, construcción del bag-of-words y cálculo de la similitud del coseno. # - Breve informe que detalle los hallazgos en cuanto a la similitud entre documentos. # # --- # # #