import os import streamlit as st from huggingface_hub import login from transformers import pipeline, AutoTokenizer, AutoModelForSequenceClassification from keybert import KeyBERT # ─── Streamlit Page Config ───────────────────────────────────────────────── st.set_page_config(page_title="Review Analyzer", layout="wide") # ─── Authenticate to Hugging Face Hub ─────────────────────────────────────── # ensure HF_TOKEN is set in your environment token = os.environ.get("HF_TOKEN", "") login(token=token, add_to_git_credential=False) # ─── Cached resource: Sentiment Analysis Pipeline ──────────────────────────── @st.cache_resource def load_sentiment_pipeline(): model_name = "mayf/amazon_reviews_bert_ft" tokenizer = AutoTokenizer.from_pretrained(model_name, use_auth_token=True) model = AutoModelForSequenceClassification.from_pretrained(model_name, use_auth_token=True) return pipeline( "sentiment-analysis", model=model, tokenizer=tokenizer, return_all_scores=True ) # ─── Cached resource: KeyBERT Model ───────────────────────────────────────── @st.cache_resource def load_keybert_model(): return KeyBERT(model="all-MiniLM-L6-v2") # ─── Main Application ─────────────────────────────────────────────────────── def main(): sentiment_pipeline = load_sentiment_pipeline() kw_model = load_keybert_model() st.title("📊 Review Sentiment & Keyword Analyzer") review = st.text_area("Enter your review:") if st.button("Analyze Review"): if not review: st.warning("Please enter a review to analyze.") return # Sentiment Analysis 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()}) # Keyword Extraction (top 3) 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})") # Highest Sentiment Label 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})") st.write("Keywords used for this analysis:") st.write(', '.join([kw for kw, _ in keywords])) if __name__ == "__main__": main()