Spaces:
Sleeping
Sleeping
import streamlit as st | |
from transformers import pipeline | |
import pandas as pd | |
from datetime import datetime | |
from PIL import Image | |
import requests | |
from io import BytesIO | |
# Constants | |
RATING_MAP = { | |
0: "Negative (β)", | |
1: "Neutral (ββ)", | |
2: "Positive (βββ)" | |
} | |
# Emoji mapping based on ratings | |
EMOJI_MAP = { | |
0: "π ", # Angry face for negative | |
1: "π", # Neutral face | |
2: "π" # Happy face | |
} | |
def load_models(): | |
# Load sentiment analysis model | |
sentiment_model = pipeline( | |
"text-classification", | |
model="AndrewLi403/CustomModel_tripadvisor_finetuned" | |
) | |
# Load text-to-emoji model | |
emoji_pipe = pipeline("text-classification", model="j-hartmann/emotion-english-roberta-large") | |
return sentiment_model, emoji_pipe | |
def analyze_review(text, sentiment_model, emoji_pipe): | |
# Sentiment analysis | |
sentiment_result = sentiment_model(text)[0] | |
rating = int(sentiment_result['label'].split('_')[-1]) | |
# Emoji analysis | |
emoji_result = emoji_pipe(text)[0] | |
dominant_emoji = emoji_result['label'] | |
return { | |
'sentiment': RATING_MAP[rating], | |
'sentiment_score': sentiment_result['score'], | |
'rating': rating, | |
'dominant_emoji': dominant_emoji, | |
'emoji_confidence': emoji_result['score'] | |
} | |
def main(): | |
st.title("Hotel Review Analyzer") | |
st.markdown("Analyze sentiment and detect emotional tone") | |
# Load models | |
sentiment_model, emoji_pipe = load_models() | |
# Input | |
review_text = st.text_area("Paste your hotel review here:", height=150) | |
if st.button("Analyze"): | |
if review_text: | |
with st.spinner("Analyzing emotions..."): | |
# Get analysis results | |
results = analyze_review(review_text, sentiment_model, emoji_pipe) | |
# Display results | |
st.subheader("Analysis Results") | |
# First row: Rating and Emoji | |
col1, col2 = st.columns(2) | |
with col1: | |
st.metric("Sentiment Rating", | |
results['sentiment'], | |
delta=f"{results['sentiment_score']:.2f}") | |
with col2: | |
# Display both system emoji and detected emoji | |
st.metric("Emotional Tone", | |
f"{EMOJI_MAP[results['rating']]} ", | |
delta=f"Confidence: {results['emoji_confidence']:.2f}") | |
# Visual emoji display | |
st.subheader("Emotional Response") | |
cols = st.columns(3) | |
with cols[1]: | |
st.header(EMOJI_MAP[results['rating']] * 5) # Repeat emoji for visual impact | |
st.caption("Based on your star rating") | |
# Emotion breakdown | |
with st.expander("Detailed Emotion Analysis"): | |
full_emoji_results = emoji_pipe(review_text, top_k=5) | |
for emotion in full_emoji_results: | |
st.progress( | |
int(emotion['score'] * 100), | |
text=f"{emotion['label']}: {emotion['score']:.2f}" | |
) | |
else: | |
st.error("Please enter a review to analyze") | |
if __name__ == "__main__": | |
main() |