Algoritmo de Espacio Vectorial
Una guía práctica y profunda que cubre la teoría, la implementación en Python y las mejores prácticas para trabajar con el modelo de espacio vectorial (VSM) en proyectos de procesamiento de lenguaje natural (NLP) y recuperación de información.
1. Introducción al Modelo de Espacio Vectorial
El modelo de espacio vectorial (VSM) representa documentos y consultas como vectores en un espacio de alta dimensión, donde cada dimensión corresponde a un término del vocabulario. La similitud entre documentos se evalúa mediante métricas como la similitud coseno, la distancia euclídea o la distancia de Manhattan.
- Ventajas: simple, interpretable y eficaz para grandes colecciones.
- Limitaciones: ignora el orden de palabras y la semántica profunda.
2. Fundamento Matemático
Sea V = {t₁, t₂, …, tₙ} el vocabulario de n términos. Cada documento d se representa como un vector d = (w₁, w₂, …, wₙ), donde wᵢ es el peso del término tᵢ en el documento. El peso suele calcularse con TF‑IDF:
tf(t,d) = frecuencia del término t en d
idf(t) = log(N / df(t))
weight(t,d) = tf(t,d) * idf(t)
La similitud coseno entre dos vectores a y b se define como:
cosine(a,b) = (a·b) / (||a|| * ||b||)
3. Implementación Paso a Paso en Python
Utilizaremos scikit‑learn, numpy y pandas para construir un pipeline completo.
3.1. Preparación del entorno
pip install numpy pandas scikit-learn tqdm
3.2. Carga y pre‑procesamiento de datos
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
# Ejemplo de dataset de noticias
df = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/newsgroups.csv')
texts = df['text'].astype(str).tolist()
labels = df['target'].tolist()
X_train, X_test, y_train, y_test = train_test_split(texts, labels, test_size=0.2, random_state=42)
3.3. Vectorización TF‑IDF
vectorizer = TfidfVectorizer(
lowercase=True,
stop_words='english',
ngram_range=(1,2), # incluye unigramas y bigramas
max_features=20000 # limita la dimensionalidad
)
X_train_vec = vectorizer.fit_transform(X_train)
X_test_vec = vectorizer.transform(X_test)
3.4. Cálculo de similitud coseno
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
# Similitud entre la primera muestra de test y todo el entrenamiento
cosine_sim = cosine_similarity(X_test_vec[0], X_train_vec).flatten()
# Índice del documento más similar
most_similar_idx = np.argmax(cosine_sim)
print('Documento más similar:', X_train[most_similar_idx][:200])
3.5. Clasificación con un modelo lineal (opcional)
from sklearn.linear_model import LogisticRegression
clf = LogisticRegression(max_iter=1000, n_jobs=-1)
clf.fit(X_train_vec, y_train)
print('Exactitud en test:', clf.score(X_test_vec, y_test))
Este bloque muestra cómo combinar VSM con un clasificador tradicional para tareas de clasificación de texto.
4. Comparativa: VSM vs. Embeddings y Modelos Generativos
Modelo de Espacio Vectorial (TF‑IDF)
- Interpretabilidad alta.
- Requiere poco poder de cómputo.
- Escala bien a millones de documentos con
Sparse Matrices. - No captura sinónimos ni contexto.
Word Embeddings (Word2Vec, GloVe) y Transformers
- Capturan relaciones semánticas y sintácticas.
- Mayor consumo de memoria y GPU.
- Requieren entrenamiento o uso de modelos pre‑entrenados.
- Mejor desempeño en tareas de inferencia profunda.
5. Buenas Prácticas, Optimización y Escalabilidad
- Dimensionalidad: Limitar
max_featureso aplicar feature hashing para colecciones gigantes. - Normalización: Utilizar
norm='l2'enTfidfVectorizerpara evitar que documentos largos dominen la similitud. - Persistencia: Serializar el vectorizador con
joblib.dump()y cargarlo en producción para evitar re‑entrenamiento. - Paralelismo:
n_jobs=-1en clasificadores lineales y encosine_similaritymediantesklearn.metrics.pairwisecon matrices dispersas. - Indexado rápido: Implementar FAISS o FLANN para búsquedas de vecinos más cercanos en tiempo sub‑lineal.
6. Solución de Problemas Comunes
| Problema | Causa Probable | Solución |
|---|---|---|
| Memoria agotada al vectorizar | Vocabulario demasiado grande (> 1M términos) | Reducir max_features, usar HashingVectorizer o aplicar svd (TruncatedSVD) para reducción de dimensionalidad. |
| Similitud casi siempre 0 | Vectorizador con min_df alto o stop‑words excesivo | Ajustar min_df, revisar lista de stop‑words o incluir n‑gramas. |
| Rendimiento lento en consultas en tiempo real | Cálculo de similitud sobre toda la colección | Pre‑indexar con FAISS, usar Approximate Nearest Neighbour (ANN) o limitar la búsqueda a top‑k candidatos. |
7. Consideraciones de Seguridad y Privacidad
Cuando los documentos contienen datos sensibles, es recomendable:
- Aplicar anonymization (eliminación de PII) antes del proceso de tokenización.
- En entornos regulados, almacenar los vectores en bases de datos cifradas (p.ej.,
SQLCipher). - Utilizar Differential Privacy en la generación de TF‑IDF si los pesos pueden revelar información de usuarios.
8. Conclusiones
El algoritmo de espacio vectorial sigue siendo una herramienta fundamental para la recuperación de información y el análisis de texto, especialmente cuando se combina con técnicas modernas de indexado y buenas prácticas de ingeniería. Su simplicidad permite una rápida iteración, mientras que su arquitectura basada en matrices dispersas garantiza escalabilidad a nivel de producción.
Algoritmo de Espacio Vectorial: Conceptos, Implementación en Python y Mejores Prácticas