Métodos de representación de texto
La representación de texto es una tarea fundamental en el procesamiento del lenguaje natural (NLP); convierte los datos de texto no estructurados en una forma numérica que las computadoras pueden procesar.
Este artículo presentará sistemáticamente los métodos de representación de texto utilizados comúnmente en NLP, desde los métodos tradicionales hasta las técnicas modernas de aprendizaje profundo, para ayudar a los lectores a comprender plenamente este concepto central.
Representación tradicional de texto
Modelo de bolsa de palabras (Bag of Words)
El modelo de bolsa de palabras es uno de los métodos más simples de representación de texto; trata el texto como una colección desordenada de palabras.
Conceptos básicos
- Ignora el orden de las palabras y la gramática, solo se centra en si la palabra aparece.
- Construye un vocabulario y cuenta el número de veces que aparece cada palabra en el documento.
- Finalmente se representa como un vector disperso de alta dimensión.
Ejemplo de código
Ejemplo
corpus = [
'This is the first document.',
'This document is the second document.',
'And this is the third one.',
'Is this the first document?'
]
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus)
print(vectorizer.get_feature_names_out())
print(X.toarray())
Análisis de ventajas y desventajas
✅ Ventajas:
- Implementación simple y alta eficiencia computacional.
- Adecuado para conjuntos de datos a pequeña escala y tareas simples.
❌ Desventajas:
- Ignora el orden de las palabras y la información semántica.
- Problema de dispersión de alta dimensión.
- No puede manejar sinónimos ni palabras polisémicas.
TF-IDF
TF-IDF (Term Frequency-Inverse Document Frequency) es una mejora del modelo de bolsa de palabras que considera la importancia de las palabras en todo el corpus.
Fórmula de cálculo
- TF (Frecuencia de término):
número de veces que una palabra aparece en el documento / número total de palabras en el documento - IDF (Frecuencia inversa de documento):
log(文档总数 / 包含该词的文档数) - TF-IDF = TF × IDF
Implementación de código
Ejemplo
tfidf_vectorizer = TfidfVectorizer()
X_tfidf = tfidf_vectorizer.fit_transform(corpus)
print(tfidf_vectorizer.get_feature_names_out())
print(X_tfidf.toarray())
Ventajas y desventajas
✅ Ventajas:
- Reduce la influencia de las palabras comunes y resalta las palabras importantes.
- Mejor efecto que el modelo simple de bolsa de palabras.
❌ Desventajas:
- Todavía no puede capturar relaciones semánticas.
- El problema de la alta dimensionalidad sigue existiendo.
Modelo N-gram
El modelo N-gram considera la información de orden de las palabras y representa el texto mediante combinaciones de n palabras consecutivas.
Tipos comunes
- Unigram (1-gram): una sola palabra.
- Bigram (2-gram): combinación de dos palabras consecutivas.
- Trigram (3-gram): combinación de tres palabras consecutivas.
Ejemplo de código
Ejemplo
X_bigram = bigram_vectorizer.fit_transform(corpus)
print(bigram_vectorizer.get_feature_names_out())
Ventajas y desventajas
✅ Ventajas:
- Captura información local del orden de las palabras.
- Puede representar frases y colocaciones fijas.
❌ Desventajas:
- El problema de explosión dimensional es más grave.
- Todavía no puede manejar dependencias de largo alcance.
Representación de vectores de palabras
Principios e implementación de Word2Vec
Word2Vec es un método de representación de vectores de palabras basado en redes neuronales, propuesto por Google en 2013.
Dos arquitecturas de modelo
- CBOW(Continuous Bag of Words): predecir la palabra actual mediante el contexto.
- Skip-gram: predecir el contexto mediante la palabra actual.
Implementación de código
Ejemplo
sentences = [["cat", "say", "meow"], ["dog", "say", "woof"]]
model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, workers=4)
# Obtener el vector de palabras
vector = model.wv['cat']
# Buscar palabras similares
similar_words = model.wv.most_similar('cat')
Características
- Vectores densos de baja dimensión (generalmente de 50 a 300 dimensiones).
- Puede capturar relaciones semánticas y gramaticales entre palabras.
- Admite operaciones vectoriales (por ejemplo: king - man + woman ≈ queen).
Vectores de palabras GloVe
GloVe (Global Vectors for Word Representation) combina las ventajas de la información estadística global y las ventanas de contexto local.
Idea central
- Basado en una matriz de coocurrencia de palabras.
- El objetivo de optimización es hacer que el producto punto de los vectores de dos palabras sea igual al logaritmo de su número de coocurrencias.
Comparación con Word2Vec
| Característica | Word2Vec | GloVe |
|---|---|---|
| Método de entrenamiento | Ventana local | Estadística global |
| Eficiencia computacional | Alta | Baja |
| Rendimiento en conjuntos de datos pequeños | Bueno | Regular |
| Rendimiento en conjuntos de datos grandes | Bien | Mejor |
FastText
FastText es un modelo de vectores de palabras desarrollado por Facebook, caracterizado por considerar la información de subpalabras (subword).
Características principales
- Representa una palabra como un conjunto de n-gramas de caracteres.
- Puede manejar palabras fuera de vocabulario (OOV).
- Es especialmente adecuado para lenguas con morfología rica.
Ejemplo de código
Ejemplo
model = FastText(sentences, vector_size=100, window=5, min_count=1, workers=4)
# Se puede obtener un vector incluso si la palabra no está en el diccionario
vector = model.wv['unseenword']
Representación sensible al contexto
Modelo ELMo
ELMo (Embeddings from Language Models) es uno de los primeros métodos de representación de palabras dependientes del contexto.
Características principales
- Basado en un modelo de lenguaje LSTM bidireccional.
- La representación de una palabra depende de toda la oración de entrada.
- Genera representaciones multicapa (se pueden combinar diferentes niveles de semántica).
Diagrama de arquitectura

BERT y sus variantes
BERT (Bidirectional Encoder Representations from Transformers) es un modelo de lenguaje preentrenado propuesto por Google.
Innovaciones clave
- Arquitectura Transformer
- Objetivo de entrenamiento del modelo de lenguaje enmascarado (MLM).
- Tarea de predicción de la siguiente oración (NSP).
Variantes comunes
- RoBERTa: optimizar la estrategia de entrenamiento.
- DistilBERT: versión ligera de BERT.
- ALBERT: compartir parámetros para reducir el tamaño del modelo.
Ejemplo de código
Ejemplo
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')
inputs = tokenizer("Hello, my dog is cute", return_tensors="pt")
outputs = model(**inputs)
last_hidden_states = outputs.last_hidden_state
Resumen de modelos de lenguaje preentrenados
El NLP moderno utiliza principalmente el paradigma de preentrenamiento + ajuste fino:
- Fase de preentrenamiento: entrenar representaciones generales del lenguaje en un corpus a gran escala.
- Fase de ajuste fino: ajustar los parámetros del modelo en datos de tareas específicas.
Comparación de modelos
| Modelo | Fecha de publicación | Características principales |
|---|---|---|
| Word2Vec | 2013 | Vectores de palabras estáticos |
| GloVe | 2014 | Estadística global + ventana local |
| ELMo | 2018 | LSTM bidireccional, dependiente del contexto |
| BERT | 2018 | Transformer, contexto bidireccional |
| GPT-3 | 2020 | Transformer unidireccional, fuerte capacidad de generación |
Representación a nivel de documento
Doc2Vec
Doc2Vec es una extensión de Word2Vec que puede aprender directamente la representación vectorial de un documento.
Dos modelos
- PV-DM(Distributed Memory): similar a CBOW, añadiendo el ID del documento.
- PV-DBOW(Distributed Bag of Words): similar a Skip-gram.
Ejemplo de código
Ejemplo
from gensim.models.doc2vec import TaggedDocument
documents = [TaggedDocument(doc, [i]) for i, doc in enumerate(corpus)]
model = Doc2Vec(documents, vector_size=100, window=5, min_count=1, workers=4)
vector = model.infer_vector(["new", "document", "text"])
Vectores de oraciones y vectores de documentos
Métodos comunes
- Método de promedio: promediar los vectores de palabras.
- SIF: promedio ponderado por frecuencia inversa suavizada.
- Vector de oración BERT: usar el token [CLS] o promediar todos los vectores de palabras.
Ejemplo de código (usando Sentence-BERT)
Ejemplo
model = SentenceTransformer('all-MiniLM-L6-v2')
sentences = ["This is an example sentence", "Each sentence is converted"]
embeddings = model.encode(sentences)
Modelo de temas (LDA)
La asignación latente de Dirichlet (LDA) es un método no supervisado de modelado de temas.
Principios básicos
- Representa un documento como una mezcla de múltiples temas.
- Cada tema es una distribución de probabilidad sobre las palabras.
- Se aprende mediante inferencia variacional o muestreo de Gibbs.
Ejemplo de código
Ejemplo
from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus)
lda = LatentDirichletAllocation(n_components=2)
lda.fit(X)
Escenarios de aplicación
- Agrupamiento de documentos
- Recomendación de contenido
- Resumen de texto
Resumen
El desarrollo de los métodos de representación de texto ha pasado por una evolución desde la estadística simple hasta el aprendizaje profundo:
- Métodos tradicionales:simple y eficiente, adecuado para datos a pequeña escala
- Vectores de palabras:captura relaciones semánticas, baja dimensionalidad
- Modelos conscientes del contexto:representación dinámica, mejor rendimiento pero alto costo computacional
- Representación de documentos:se extiende desde el nivel de palabra hasta el nivel de documento
Al elegir un método de representación de texto, se debe considerar:
- Requisitos de la tarea (si se necesita comprensión semántica)
- Escala de datos
- Recursos computacionales
- Características del idioma
Con el desarrollo de los grandes modelos de lenguaje, las técnicas de representación de texto siguen evolucionando rápidamente, pero comprender estos métodos básicos sigue siendo crucial para dominar el NLP.
Otras extensiones