G10_TripAdvisor / app.py
mxiean's picture
Update app.py
efed25e verified
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
}
@st.cache_resource
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()