El modelo de bolsa de palabras (BoW) es un modelo de texto que utiliza una representación de texto basada en una colección desordenada (una " bolsa ") de palabras. Se utiliza en el procesamiento del lenguaje natural y la recuperación de información (IR). No tiene en cuenta el orden de las palabras (y, por lo tanto, la mayor parte de la sintaxis o la gramática), pero captura la multiplicidad .
El modelo de bolsa de palabras se utiliza comúnmente en métodos de clasificación de documentos donde, por ejemplo, la (frecuencia de) aparición de cada palabra se utiliza como una característica para entrenar un clasificador . [1] También se ha utilizado para visión artificial . [2]
Una referencia temprana a "bolsa de palabras" en un contexto lingüístico se puede encontrar en el artículo de Zellig Harris de 1954 sobre Estructura distributiva . [3]
A continuación se muestran modelos de documentos de texto que utilizan el método bag-of-words. A continuación se muestran dos documentos de texto simples:
(1) A Juan le gusta ver películas. A María también le gustan las películas.
(2) A María también le gusta ver partidos de fútbol.
A partir de estos dos documentos de texto se construye una lista como la siguiente para cada documento:
"Juan" , "le gusta " , " ver" , "películas" , "María" , "le gusta" , "películas" , "también""María" , " también" , "le gusta " , "ver" , "fútbol" , "juegos"
Representar cada bolsa de palabras como un objeto JSON y atribuirlo a la variable JavaScript respectiva:
BoW1 = { "Juan" : 1 , "le gusta" : 2 , "a" : 1 , "mirar" : 1 , "películas" : 2 , "María" : 1 , "también" : 1 }; BoW2 = { "María" : 1 , "también" : 1 , "le gusta" : 1 , "a" : 1 , "mirar" : 1 , "fútbol" : 1 , "juegos" : 1 };
Cada clave es la palabra y cada valor es el número de ocurrencias de esa palabra en el documento de texto dado.
El orden de los elementos es libre, por lo que, por ejemplo, {"too":1,"Mary":1,"movies":2,"John":1,"watch":1,"likes":2,"to":1}
también es equivalente a BoW1 . También es lo que esperamos de una representación estricta de un objeto JSON .
Nota: si otro documento es como una unión de estos dos,
(3) A John le gusta ver películas. A Mary también le gustan las películas. A Mary también le gusta ver partidos de fútbol.
Su representación en JavaScript será:
BoW3 = { "Juan" : 1 , "le gusta" : 3 , "a" : 2 , "ver" : 2 , "películas" : 2 , "María" : 2 , "también" : 1 , "también" : 1 , "fútbol" : 1 , "juegos" : 1 };
Así, como vemos en el álgebra de bolsas , la "unión" de dos documentos en la representación de bolsas de palabras es, formalmente, la unión disjunta , sumando las multiplicidades de cada elemento.
La representación BoW de un texto elimina todo orden de palabras. Por ejemplo, la representación BoW de " hombre muerde a perro " y "perro muerde a hombre" son iguales, por lo que cualquier algoritmo que opere con una representación BoW de texto debe tratarlas de la misma manera. A pesar de esta falta de sintaxis o gramática, la representación BoW es rápida y puede ser suficiente para tareas simples que no requieren orden de palabras. Por ejemplo, para la clasificación de documentos , si las palabras "acciones", "comercio", "inversores" aparecen varias veces, entonces es probable que el texto sea un informe financiero, aunque sería insuficiente para distinguir entre
Ayer los inversores subían, pero hoy retroceden.
y
Ayer los inversores retrocedían, pero hoy están subiendo.
y por lo tanto la representación de BoW sería insuficiente para determinar el significado detallado del documento.
Las implementaciones del modelo de bolsa de palabras pueden implicar el uso de frecuencias de palabras en un documento para representar su contenido. Las frecuencias se pueden "normalizar" por la inversa de la frecuencia del documento, o tf–idf . Además, para el propósito específico de la clasificación, se han desarrollado alternativas supervisadas para tener en cuenta la etiqueta de clase de un documento. [4] Por último, se utiliza la ponderación binaria (presencia/ausencia o 1/0) en lugar de frecuencias para algunos problemas (por ejemplo, esta opción se implementa en el sistema de software de aprendizaje automático WEKA ).
# Asegúrese de instalar primero los paquetes necesarios # pip install --upgrade pip # pip install tensorflow from tensorflow import keras from writing import List from keras.preprocessing.text import Tokenizeroración = [ "A John le gusta ver películas. A Mary también le gustan las películas." ]def print_bow ( oración : Lista [ str ]) -> Ninguno : tokenizer = Tokenizer () tokenizer . fit_on_texts ( oración ) secuencias = tokenizer . texts_to_sequences ( oración ) índice_palabra = tokenizer . índice_palabra bow = {} para clave en índice_palabra : bow [ clave ] = secuencias [ 0 ] . count ( índice_palabra [ clave ]) print ( f "Bolsa de palabras de la oración 1: \n { bow } " ) print ( f "Encontramos { len ( word_index ) } tokens únicos." )print_bow ( oración )
Una alternativa común al uso de diccionarios es el truco del hash , donde las palabras se asignan directamente a índices con una función hash. [5] Por lo tanto, no se requiere memoria para almacenar un diccionario. Las colisiones de hash generalmente se manejan a través de memoria liberada para aumentar la cantidad de contenedores de hash [ aclaración necesaria ] . En la práctica, el hash simplifica la implementación de modelos de bolsa de palabras y mejora la escalabilidad.
Y este conjunto de combinaciones de elementos se convierte en un factor en la forma en que se toman decisiones posteriores... porque el lenguaje no es simplemente un saco de palabras sino una herramienta con propiedades particulares que se han ido formando en el curso de su uso.