En esta lección construiremos una aplicación práctica de análisis de sentimientos usando un dataset de reseñas. El objetivo es implementar un flujo completo: preprocesamiento, modelado, predicción y despliegue.
import pandas as pd
from sklearn.model_selection import train_test_split
# Dataset de ejemplo
reviews = pd.DataFrame({
"texto": ["me encanta este producto", "es horrible", "muy bueno", "terrible experiencia"],
"sentimiento": [1, 0, 1, 0]
})
X_train, X_test, y_train, y_test = train_test_split(
reviews["texto"], reviews["sentimiento"], test_size=0.2, random_state=42
)
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
pipe = Pipeline([
("tfidf", TfidfVectorizer()),
("clf", LogisticRegression(max_iter=1000))
])
pipe.fit(X_train, y_train)
print("Accuracy en test:", pipe.score(X_test, y_test))
def predict_sentiment(text: str) -> dict:
proba = pipe.predict_proba([text])[0, 1]
return {
"label": "positivo" if proba > 0.5 else "negativo",
"score": float(proba)
}
print(predict_sentiment("no me gustó"))
# {'label': 'negativo', 'score': 0.32}
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
text: str
@app.post("/predict")
async def predict(item: Item):
return predict_sentiment(item.text)
Ejecutar con: uvicorn app:app --reload
Podemos añadir gráficos con matplotlib o seaborn para mostrar la distribución de polaridad en un conjunto de textos.
import matplotlib.pyplot as plt
preds = [predict_sentiment(t)["label"] for t in X_test]
plt.bar(["positivo", "negativo"], [preds.count("positivo"), preds.count("negativo")])
plt.show()
Una aplicación de análisis de sentimientos permite transformar datos de texto en información accionable. Esto genera valor en sectores como marketing, atención al cliente y desarrollo de productos.