ScikitLearn: NLP
El procesamiento del lenguaje natural (NLP) se centra en manipular y analizar texto de manera automática para extraer información valiosa, clasificar documentos o generar resúmenes. Aunque scikit learn no es una biblioteca especializada exclusivamente en NLP, ofrece herramientas que, combinadas con otras librerías, permiten cubrir casos comunes de clasificación y extracción de características textuales.
Las técnicas de vectorización transforman texto en representaciones numéricas. El submódulo sklearn.feature_extraction.text
proporciona clases como CountVectorizer
y TfidfVectorizer
. Con CountVectorizer
, se construye una matriz de recuentos de palabras (bag of words), mientras que TfidfVectorizer
ajusta la relevancia de cada término conforme a su frecuencia en el documento y en el corpus completo. Un ejemplo básico sería:
from sklearn.feature_extraction.text import TfidfVectorizer
corpus = [
"el perro corre en el parque",
"la gata duerme en el sofá",
"el ratón come queso en la casa"
]
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(corpus)
Este objeto X
resulta ser una matriz dispersa donde cada fila representa un documento y cada columna un término, con valores que reflejan la relevancia TF-IDF. Esta representación es fundamental para aplicar algoritmos de aprendizaje automático.
Para clasificar textos, se combinan estos transformadores con un estimador, por ejemplo una regresión logística, en un único Pipeline
. De este modo, el proceso de convertir texto a vectores y entrenar el modelo queda unificado. Esto simplifica la fase de predicción, pues al recibir un texto nuevo, el pipeline aplicará la misma vectorización y luego generará la predicción de clase.
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression
text_clf = Pipeline([
('tfidf', TfidfVectorizer()),
('clf', LogisticRegression())
])
text_clf.fit(corpus, [0, 1, 2]) # Etiquetas de ejemplo
prediction = text_clf.predict(["el perro come queso"])
Es habitual realizar preprocesamientos adicionales como eliminación de stop words o la transformación a minúsculas. Estas tareas se controlan mediante parámetros del vectorizador, por ejemplo, TfidfVectorizer(stop_words='spanish', lowercase=True)
, lo que facilita la limpieza básica del texto.
Para situaciones donde la frecuencia de n-gramas sea relevante, se pueden generar 2-grams o 3-grams en lugar de tokens individuales. Este método permite capturar secuencias de palabras. Configurar el parámetro ngram_range=(1,2)
en CountVectorizer
o TfidfVectorizer
es un modo sencillo de incluir dichos patrones en la matriz de características.
La clasificación y la regresión con texto siguen el mismo patrón de scikit learn:
- Se separan los datos en entrenamiento y prueba.
- Se crea un pipeline que contiene la vectorización y el modelo.
- Se ajusta con
fit
y se evalúa el rendimiento conpredict
.
El ajuste de hiperparámetros se beneficia del uso de GridSearchCV
o RandomizedSearchCV
, ya que se pueden variar aspectos como el número máximo de características (max_features
), la estrategia de regularización de la regresión logística o la configuración de los n-gramas, entre otros.
En muchos flujos de trabajo de NLP, puede resultar interesante combinar scikit learn con bibliotecas de preprocesamiento más avanzadas que permitan lematizar o etiquetar gramaticalmente las frases. Sin embargo, la naturaleza extensible de los pipelines en scikit learn hace posible integrar transformaciones personalizadas o de terceros antes de la etapa de vectorización.
Para problemas de clusterización de texto o detección de tópicos, también es viable usar TfidfVectorizer
en conjunto con algoritmos de agrupamiento. Por ejemplo, aplicando KMeans
a la matriz TF-IDF, se identifican grupos de documentos semejantes entre sí. Del mismo modo, se pueden emplear métodos de reducción de dimensionalidad como TruncatedSVD
para explorar las relaciones latentes en el espacio vectorial.
Los resultados de la clasificación de texto se evalúan con métricas como accuracy_score
, precision_score
, recall_score
y f1_score
. En problemas con clases muy desbalanceadas, se recomienda usar la métrica AUC-ROC o un reporte completo con classification_report
. La elección de la métrica dependerá de si se valora más la capacidad de detección de falsos negativos o la proporción de aciertos global.
En consecuencia, la combinación de transformadores de texto (como TfidfVectorizer
) con algoritmos de scikit learn (por ejemplo, LogisticRegression
, SVC
o RandomForestClassifier
) constituye un método flexible para abordar problemas típicos de NLP. La facilidad con la que se definen pipelines y se ponen a prueba distintos modelos convierte a scikit learn en una herramienta esencial en el procesamiento de texto cuando se requiere una solución rápida y modular.
Lecciones de este módulo de ScikitLearn
Lecciones de programación del módulo NLP del curso de ScikitLearn.
Ejercicios de programación en este módulo de ScikitLearn
Evalúa tus conocimientos en NLP con ejercicios de programación NLP de tipo Test, Puzzle, Código y Proyecto con VSCode.