1 / app.py
mayf's picture
Update app.py
bd2216b verified
raw
history blame
2.7 kB
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()