Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -2,6 +2,9 @@ import streamlit as st
|
|
2 |
from transformers import pipeline
|
3 |
import pandas as pd
|
4 |
from datetime import datetime
|
|
|
|
|
|
|
5 |
|
6 |
# Constants
|
7 |
RATING_MAP = {
|
@@ -10,6 +13,13 @@ RATING_MAP = {
|
|
10 |
2: "Positive (⭐⭐⭐)"
|
11 |
}
|
12 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
13 |
@st.cache_resource
|
14 |
def load_models():
|
15 |
# Load sentiment analysis model
|
@@ -17,48 +27,47 @@ def load_models():
|
|
17 |
"text-classification",
|
18 |
model="AndrewLi403/CustomModel_tripadvisor_finetuned"
|
19 |
)
|
20 |
-
# Load
|
21 |
-
|
22 |
-
|
23 |
-
model="filippoferrari/finetuning-fake-reviews-detector-model"
|
24 |
-
)
|
25 |
-
return sentiment_model, fake_detector
|
26 |
|
27 |
-
def analyze_review(text, sentiment_model,
|
28 |
# Sentiment analysis
|
29 |
sentiment_result = sentiment_model(text)[0]
|
30 |
rating = int(sentiment_result['label'].split('_')[-1])
|
31 |
|
32 |
-
#
|
33 |
-
|
34 |
-
|
35 |
|
36 |
return {
|
37 |
'sentiment': RATING_MAP[rating],
|
38 |
'sentiment_score': sentiment_result['score'],
|
39 |
-
'
|
40 |
-
'
|
|
|
41 |
}
|
42 |
|
43 |
def main():
|
44 |
st.title("Hotel Review Analyzer")
|
45 |
-
st.markdown("Analyze sentiment and detect
|
46 |
|
47 |
# Load models
|
48 |
-
sentiment_model,
|
49 |
|
50 |
# Input
|
51 |
review_text = st.text_area("Paste your hotel review here:", height=150)
|
52 |
|
53 |
if st.button("Analyze"):
|
54 |
if review_text:
|
55 |
-
with st.spinner("Analyzing..."):
|
56 |
# Get analysis results
|
57 |
-
results = analyze_review(review_text, sentiment_model,
|
58 |
|
59 |
# Display results
|
60 |
st.subheader("Analysis Results")
|
61 |
|
|
|
62 |
col1, col2 = st.columns(2)
|
63 |
with col1:
|
64 |
st.metric("Sentiment Rating",
|
@@ -66,18 +75,28 @@ def main():
|
|
66 |
delta=f"{results['sentiment_score']:.2f}")
|
67 |
|
68 |
with col2:
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
|
74 |
-
#
|
75 |
-
|
76 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
77 |
else:
|
78 |
st.error("Please enter a review to analyze")
|
79 |
|
80 |
if __name__ == "__main__":
|
81 |
-
main()
|
82 |
-
|
83 |
-
|
|
|
2 |
from transformers import pipeline
|
3 |
import pandas as pd
|
4 |
from datetime import datetime
|
5 |
+
from PIL import Image
|
6 |
+
import requests
|
7 |
+
from io import BytesIO
|
8 |
|
9 |
# Constants
|
10 |
RATING_MAP = {
|
|
|
13 |
2: "Positive (⭐⭐⭐)"
|
14 |
}
|
15 |
|
16 |
+
# Emoji mapping based on ratings
|
17 |
+
EMOJI_MAP = {
|
18 |
+
0: "😠", # Angry face for negative
|
19 |
+
1: "😐", # Neutral face
|
20 |
+
2: "😊" # Happy face
|
21 |
+
}
|
22 |
+
|
23 |
@st.cache_resource
|
24 |
def load_models():
|
25 |
# Load sentiment analysis model
|
|
|
27 |
"text-classification",
|
28 |
model="AndrewLi403/CustomModel_tripadvisor_finetuned"
|
29 |
)
|
30 |
+
# Load text-to-emoji model
|
31 |
+
emoji_pipe = pipeline("text-classification", model="j-hartmann/emotion-english-roberta-large")
|
32 |
+
return sentiment_model, emoji_pipe
|
|
|
|
|
|
|
33 |
|
34 |
+
def analyze_review(text, sentiment_model, emoji_pipe):
|
35 |
# Sentiment analysis
|
36 |
sentiment_result = sentiment_model(text)[0]
|
37 |
rating = int(sentiment_result['label'].split('_')[-1])
|
38 |
|
39 |
+
# Emoji analysis
|
40 |
+
emoji_result = emoji_pipe(text)[0]
|
41 |
+
dominant_emoji = emoji_result['label']
|
42 |
|
43 |
return {
|
44 |
'sentiment': RATING_MAP[rating],
|
45 |
'sentiment_score': sentiment_result['score'],
|
46 |
+
'rating': rating,
|
47 |
+
'dominant_emoji': dominant_emoji,
|
48 |
+
'emoji_confidence': emoji_result['score']
|
49 |
}
|
50 |
|
51 |
def main():
|
52 |
st.title("Hotel Review Analyzer")
|
53 |
+
st.markdown("Analyze sentiment and detect emotional tone")
|
54 |
|
55 |
# Load models
|
56 |
+
sentiment_model, emoji_pipe = load_models()
|
57 |
|
58 |
# Input
|
59 |
review_text = st.text_area("Paste your hotel review here:", height=150)
|
60 |
|
61 |
if st.button("Analyze"):
|
62 |
if review_text:
|
63 |
+
with st.spinner("Analyzing emotions..."):
|
64 |
# Get analysis results
|
65 |
+
results = analyze_review(review_text, sentiment_model, emoji_pipe)
|
66 |
|
67 |
# Display results
|
68 |
st.subheader("Analysis Results")
|
69 |
|
70 |
+
# First row: Rating and Emoji
|
71 |
col1, col2 = st.columns(2)
|
72 |
with col1:
|
73 |
st.metric("Sentiment Rating",
|
|
|
75 |
delta=f"{results['sentiment_score']:.2f}")
|
76 |
|
77 |
with col2:
|
78 |
+
# Display both system emoji and detected emoji
|
79 |
+
st.metric("Emotional Tone",
|
80 |
+
f"{EMOJI_MAP[results['rating']]} (System) / {results['dominant_emoji']} (Detected)",
|
81 |
+
delta=f"Confidence: {results['emoji_confidence']:.2f}")
|
82 |
|
83 |
+
# Visual emoji display
|
84 |
+
st.subheader("Emotional Response")
|
85 |
+
cols = st.columns(3)
|
86 |
+
with cols[1]:
|
87 |
+
st.header(EMOJI_MAP[results['rating']] * 5) # Repeat emoji for visual impact
|
88 |
+
st.caption("Based on your star rating")
|
89 |
+
|
90 |
+
# Emotion breakdown
|
91 |
+
with st.expander("Detailed Emotion Analysis"):
|
92 |
+
full_emoji_results = emoji_pipe(review_text, top_k=5)
|
93 |
+
for emotion in full_emoji_results:
|
94 |
+
st.progress(
|
95 |
+
int(emotion['score'] * 100),
|
96 |
+
text=f"{emotion['label']}: {emotion['score']:.2f}"
|
97 |
+
)
|
98 |
else:
|
99 |
st.error("Please enter a review to analyze")
|
100 |
|
101 |
if __name__ == "__main__":
|
102 |
+
main()
|
|
|
|