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()