|
import os |
|
import streamlit as st |
|
from huggingface_hub import login |
|
from transformers import pipeline, AutoTokenizer, AutoModelForSequenceClassification |
|
from keybert import KeyBERT |
|
|
|
|
|
st.set_page_config(page_title="Review Analyzer", layout="wide") |
|
|
|
|
|
@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 |
|
) |
|
|
|
|
|
@st.cache_resource |
|
def load_keybert_model(): |
|
return KeyBERT(model="all-MiniLM-L6-v2") |
|
|
|
|
|
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 |
|
|
|
|
|
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) |
|
|
|
|
|
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})") |
|
|
|
|
|
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() |
|
|
|
|