import os import streamlit as st from huggingface_hub import login from transformers import pipeline, AutoTokenizer, AutoModelForSequenceClassification from keybert import KeyBERT # ─── 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.set_page_config(page_title="Review Analyzer", layout="wide") 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']: round(item['score'], 4) for item in scores} st.subheader("Sentiment Scores") st.json(sentiment_results) # Keyword Extraction keywords = kw_model.extract_keywords( review, keyphrase_ngram_range=(1, 2), stop_words="english", top_n=5 ) st.subheader("Top Keywords") for kw, score in keywords: st.write(f"- **{kw}** (Score: {score:.4f})") # Composite Score avg_sentiment = sum(sentiment_results.values()) / len(sentiment_results) st.subheader("Composite Score with Keywords") st.write(f"Average Sentiment Score: {avg_sentiment:.4f}") st.write("Keywords used for this score:") st.write(', '.join([kw for kw, _ in keywords])) if __name__ == "__main__": main()