import joblib import html import re from fastapi import FastAPI from pydantic import BaseModel from fastapi.middleware.cors import CORSMiddleware from bs4 import BeautifulSoup app = FastAPI() app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # Load the models model = joblib.load('model.joblib') tfidf = joblib.load('tfidf.joblib') def clean_text(text): if not isinstance(text, str): return "" text = html.unescape(text) text = BeautifulSoup(text, "html.parser").get_text() text = re.sub(r'http\S+|www\S+|https\S+', '', text, flags=re.MULTILINE) text = re.sub(r'\S*@\S*\s?', '', text) text = re.sub(r'[^a-zA-Z\s]', '', text) text = re.sub(r'\s+', ' ', text).strip() return text.lower() class ReviewRequest(BaseModel): text: str @app.post("/predict") def predict(request: ReviewRequest): cleaned = clean_text(request.text) # Very short edge cases check if len(cleaned.split()) < 2: return {"sentiment": "Neutral", "confidence": 0.5, "cleaned": cleaned} vector = tfidf.transform([cleaned]) prediction = model.predict(vector)[0] probabilities = model.predict_proba(vector)[0] confidence = float(max(probabilities)) sentiment = "Positive" if prediction == 1 else "Negative" return {"sentiment": sentiment, "confidence": confidence, "cleaned": cleaned} from fastapi.responses import HTMLResponse import markdown2 @app.get("/", response_class=HTMLResponse) def read_root(): try: with open("README.md", "r") as f: content = f.read() metadata = {} if content.startswith("---"): parts = content.split("---", 2) if len(parts) >= 3: import yaml metadata = yaml.safe_load(parts[1]) content = parts[2] html_content = markdown2.markdown(content.strip()) tags = [ ("Sentiment Analysis", "#3b82f6"), ("Logistic Regression", "#6366f1"), ("TF-IDF", "#8b5cf6"), ("Docker", "#10b981"), ("FastAPI", "#f59e0b") ] tags_html = "".join([f'{name}' for name, color in tags]) return f"""