Spaces:
Sleeping
Sleeping
| import os | |
| from flask import send_file | |
| # π Set huggingface cache directory to a writable path in Spaces | |
| os.environ["HF_HOME"] = "/tmp" | |
| from flask import Flask, render_template, request, redirect | |
| import pandas as pd | |
| from predictor import predict_sentiment | |
| app = Flask(__name__) | |
| # π Label mapping | |
| LABEL_MAP = { | |
| "LABEL_0": "Negative", | |
| "LABEL_1": "Positive" | |
| } | |
| # π Root β redirect to single review page | |
| def root(): | |
| return redirect("/sentiment-review/single") | |
| # π Single review input route | |
| def single_review(): | |
| prediction = None | |
| confidence = None | |
| review = "" | |
| chosen_model = None | |
| if request.method == "POST": | |
| review = request.form.get("review", "").strip() | |
| if review: | |
| try: | |
| result = predict_sentiment(review) | |
| raw_label = result["prediction"].get("label") | |
| score = result["prediction"].get("score", 0.0) | |
| chosen_model = result.get("chosen_model", "N/A") | |
| prediction = LABEL_MAP.get(raw_label, raw_label) | |
| confidence = round(float(score) * 100, 2) | |
| except Exception as e: | |
| print("β Single Review Processing Error:", e) | |
| prediction = "Error" | |
| confidence = 0.0 | |
| chosen_model = "N/A" | |
| return render_template( | |
| "index.html", | |
| prediction=prediction, | |
| confidence=confidence, | |
| review=review, | |
| chosen_model=chosen_model | |
| ) | |
| # π Batch upload route | |
| def batch_review(): | |
| if request.method == "POST": | |
| if 'csvfile' not in request.files: | |
| return render_template("batch.html", error="No file part found.") | |
| file = request.files['csvfile'] | |
| if not file.filename: | |
| return render_template("batch.html", error="No selected file.") | |
| if file and file.filename.endswith(".csv"): | |
| try: | |
| df = pd.read_csv(file, encoding="utf-8") | |
| if "review" not in df.columns: | |
| return render_template("batch.html", error="CSV must have a 'review' column.") | |
| results = [] | |
| for i, text in enumerate(df["review"].fillna("").tolist()): | |
| try: | |
| result = predict_sentiment(text) | |
| raw_label = result["prediction"].get("label") | |
| score = result["prediction"].get("score", 0.0) | |
| chosen_model = result.get("chosen_model", "N/A") | |
| sentiment = LABEL_MAP.get(raw_label, raw_label) | |
| confidence = round(float(score) * 100, 2) | |
| print(f"π§ Review {i+1}: {text[:40]}... β {sentiment} ({confidence}%) [Model: {chosen_model}]") | |
| results.append({ | |
| "text": text, | |
| "sentiment": sentiment, | |
| "confidence": confidence, | |
| "chosen_model": chosen_model | |
| }) | |
| except Exception as inner_e: | |
| print(f"β οΈ Error processing review {i+1}: {inner_e}") | |
| results.append({ | |
| "text": text, | |
| "sentiment": "Error", | |
| "confidence": 0.0, | |
| "chosen_model": "N/A" | |
| }) | |
| return render_template("batch.html", results=results) | |
| except Exception as e: | |
| print("β CSV Processing error:", e) | |
| return render_template("batch.html", error=f"Processing error: {str(e)}") | |
| return render_template("batch.html", error="Invalid file format. Upload .csv only.") | |
| return render_template("batch.html") | |
| if __name__ == "__main__": | |
| app.run(host="0.0.0.0", port=7860, debug=True) | |