SreyaDvn's picture
Update app.py
d9c57c9 verified
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
@app.route("/")
def root():
return redirect("/sentiment-review/single")
# πŸ”˜ Single review input route
@app.route("/sentiment-review/single", methods=["GET", "POST"])
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
@app.route("/sentiment-review/batch", methods=["GET", "POST"])
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)