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 ) # ─── (your existing cache decorators) ──────────────────────────────────────── @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") def main(): st.title("📊 Review Sentiment & Keyword Analyzer + GPT Insights") # ─── Inputs & Models ────────────────────────────────────────────────────── 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 # ─── Sentiment & Keywords ───────────────────────────────────────────────── sentiment_pipeline = load_sentiment_pipeline() kw_model = load_keybert_model() scores = sentiment_pipeline(review)[0] sentiment_results = {item['label']: float(item['score']) for item in scores} st.subheader("Sentiment Scores") st.json({k: round(v, 4) for k, v in sentiment_results.items()}) keywords = kw_model.extract_keywords( review, keyphrase_ngram_range=(1, 2), stop_words="english", top_n=3 ) st.subheader("Top 3 Keywords") for kw, score in keywords: st.write(f"- **{kw}** (Score: {score:.4f})") # ─── Determine Highest Sentiment ─────────────────────────────────────────── max_label, max_score = max(sentiment_results.items(), key=lambda x: x[1]) st.subheader("Highest Sentiment") st.write(f"{max_label} (Score: {max_score:.4f})") # ─── GPT-Driven Analysis & Suggestions ──────────────────────────────────── st.subheader("GPT Analysis & Seller Suggestions") # build a single text prompt for GPT prompt = f""" You are a helpful assistant for e-commerce sellers. Here is a product review, its sentiment breakdown, and the top keywords: Review: \"\"\"{review}\"\"\" Sentiment scores: {sentiment_results} Top keywords: {[kw for kw, _ in keywords]} First, provide a one-paragraph professional analysis of what the customer feels and why (combine sentiment + keywords). Then, give 3 detailed, actionable suggestions the seller can implement to improve future reviews or address the feedback. """ # call Azure OpenAI response = openai_client.chat.completions.create( model="gpt-35-turbo", # ← use your deployed model name here messages=[ {"role": "system", "content": "You are a product-feedback analyst."}, {"role": "user", "content": prompt} ], temperature=0.7, max_tokens=400 ) # display GPT’s reply gpt_reply = response.choices[0].message.content st.markdown(gpt_reply) if __name__ == "__main__": # make sure your env vars are set: AZURE_OPENAI_KEY, AZURE_OPENAI_ENDPOINT main()