1 / app.py
mayf's picture
Update app.py
dd57377 verified
raw
history blame
4.08 kB
import os
import numpy as np
import pandas as pd
import streamlit as st
from huggingface_hub import login
from transformers import pipeline, AutoTokenizer, AutoModelForSequenceClassification
from keybert import KeyBERT
from openai import AzureOpenAI # new
# ─── Azure OpenAI Client ─────────────────────────────────────────────────────
openai_client = AzureOpenAI(
api_key = "fbca46bfd8814334be46a2e5c323904c", # use your key here
api_version = "2023-05-15", # apparently HKUST uses a deprecated version
azure_endpoint = "https://hkust.azure-api.net" # per HKUST instructions
)
@st.cache_resource
def load_sentiment_pipeline():
model_name = "mayf/amazon_reviews_bert_ft"
tok = AutoTokenizer.from_pretrained(model_name, use_auth_token=True)
mdl = AutoModelForSequenceClassification.from_pretrained(model_name, use_auth_token=True)
return pipeline(
"sentiment-analysis",
model=mdl,
tokenizer=tok,
return_all_scores=True
)
@st.cache_resource
def load_keybert_model():
return KeyBERT(model="all-MiniLM-L6-v2")
LABEL_MAP = {
"LABEL_0": "Very Negative",
"LABEL_1": "Negative",
"LABEL_2": "Neutral",
"LABEL_3": "Positive",
"LABEL_4": "Very Positive"
}
def main():
st.title("📊 Amazon Review Analyzer")
review = st.text_area("Enter your review:")
if not st.button("Analyze Review"):
return
if not review:
st.warning("Please enter a review to analyze.")
return
# Initialize progress bar
progress = st.progress(0)
# Load models
progress.text("Loading models...")
sentiment_pipeline = load_sentiment_pipeline()
kw_model = load_keybert_model()
progress.progress(20)
# Run sentiment analysis
progress.text("Analyzing sentiment...")
raw_scores = sentiment_pipeline(review)[0]
# Map labels
sentiment_results = {LABEL_MAP[item['label']]: float(item['score']) for item in raw_scores}
progress.progress(40)
# Extract keywords
progress.text("Extracting keywords...")
keywords = kw_model.extract_keywords(
review,
keyphrase_ngram_range=(1, 2),
stop_words="english",
top_n=3
)
progress.progress(60)
# Display scores and keywords side by side
col1, col2 = st.columns(2)
with col1:
st.subheader("Sentiment Scores")
st.json({k: round(v, 4) for k, v in sentiment_results.items()})
with col2:
st.subheader("Top 3 Keywords")
for kw, score in keywords:
st.write(f"• {kw} ({score:.4f})")
# Bar chart
progress.text("Rendering chart...")
df_scores = pd.DataFrame.from_dict(sentiment_results, orient='index', columns=['score'])
df_scores.index.name = 'Sentiment'
st.bar_chart(df_scores)
progress.progress(80)
# Highlight highest sentiment
max_label, max_score = max(sentiment_results.items(), key=lambda x: x[1])
st.markdown(f"**Highest Sentiment:** **{max_label}** ({max_score:.4f})")
# GPT-Driven Analysis & Suggestions
progress.text("Generating insights...")
prompt = f"""
You are an analytical amazon feedback expert.
Review: \"{review}\"
Sentiment Scores: {sentiment_results}
Top Keywords: {[kw for kw, _ in keywords]}
Tasks:
1. Analysis: Write a concise paragraph (3 sentences) interpreting customer sentiment by combining the scores and keywords.
2. Recommendations: Three separate paragraphs with actionable suggestions (max 30 words each).
"""
response = openai_client.chat.completions.create(
model="gpt-35-turbo",
messages=[
{"role": "system", "content": "You are a product-feedback analyst."},
{"role": "user", "content": prompt}
],
temperature=0.7,
max_tokens=200
)
gpt_reply = response.choices[0].message.content.strip()
st.markdown(gpt_reply)
# Complete
progress.progress(100)
progress.text("Done!")
if __name__ == "__main__":
main()