1
File size: 2,702 Bytes
05ec195
4d1f328
05ec195
 
 
 
bd2216b
 
 
05ec195
 
 
 
 
 
 
 
 
 
 
6a2dbfc
05ec195
 
 
6a2dbfc
05ec195
6a2dbfc
eec20c9
05ec195
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6a2dbfc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import os
import streamlit as st
from huggingface_hub import login
from transformers import pipeline, AutoTokenizer, AutoModelForSequenceClassification
from keybert import KeyBERT

# ─── Streamlit Page Config must be first Streamlit command ────────────────
st.set_page_config(page_title="Review Analyzer", layout="wide")

# ─── 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']: 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()