File size: 3,450 Bytes
49fc581
db24cbc
49fc581
 
8d5c0ef
 
 
49fc581
 
 
 
 
 
 
 
8d5c0ef
 
 
 
 
 
 
49fc581
 
5073adc
49fc581
 
f130149
49fc581
8d5c0ef
 
 
49fc581
8d5c0ef
5073adc
 
 
49fc581
8d5c0ef
 
 
db24cbc
5073adc
 
 
8d5c0ef
 
 
5073adc
db24cbc
49fc581
5073adc
8d5c0ef
db24cbc
5073adc
8d5c0ef
db24cbc
5073adc
 
db24cbc
5073adc
 
8d5c0ef
5073adc
8d5c0ef
db24cbc
 
 
5073adc
8d5c0ef
db24cbc
 
5073adc
 
 
db24cbc
5073adc
8d5c0ef
 
efed25e
8d5c0ef
db24cbc
8d5c0ef
 
 
 
 
 
 
 
 
 
 
 
 
 
 
49fc581
5073adc
49fc581
 
8d5c0ef
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
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()