Sumedhzz commited on
Commit
ffbd3ab
Β·
0 Parent(s):

Final Deployment: Lightweight UI engine

Browse files
Files changed (5) hide show
  1. .gitattributes +35 -0
  2. Dockerfile +20 -0
  3. README.md +19 -0
  4. requirements.txt +6 -0
  5. src/streamlit_app.py +146 -0
.gitattributes ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
Dockerfile ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM python:3.13.5-slim
2
+
3
+ WORKDIR /app
4
+
5
+ RUN apt-get update && apt-get install -y \
6
+ build-essential \
7
+ curl \
8
+ git \
9
+ && rm -rf /var/lib/apt/lists/*
10
+
11
+ COPY requirements.txt ./
12
+ COPY src/ ./src/
13
+
14
+ RUN pip3 install -r requirements.txt
15
+
16
+ EXPOSE 8501
17
+
18
+ HEALTHCHECK CMD curl --fail http://localhost:8501/_stcore/health
19
+
20
+ ENTRYPOINT ["streamlit", "run", "src/streamlit_app.py", "--server.port=8501", "--server.address=0.0.0.0"]
README.md ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: Sentiment Analyzer
3
+ emoji: πŸš€
4
+ colorFrom: red
5
+ colorTo: red
6
+ sdk: docker
7
+ app_port: 8501
8
+ tags:
9
+ - streamlit
10
+ pinned: false
11
+ short_description: Streamlit template space
12
+ ---
13
+
14
+ # Welcome to Streamlit!
15
+
16
+ Edit `/src/streamlit_app.py` to customize this app to your heart's desire. :heart:
17
+
18
+ If you have any questions, checkout our [documentation](https://docs.streamlit.io) and [community
19
+ forums](https://discuss.streamlit.io).
requirements.txt ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ streamlit
2
+ transformers
3
+ torch
4
+ safetensors
5
+ pandas
6
+ plotly
src/streamlit_app.py ADDED
@@ -0,0 +1,146 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ from transformers import pipeline
3
+ import os
4
+ import pandas as pd
5
+ from datetime import datetime
6
+ import time
7
+ import plotly.graph_objects as go
8
+
9
+ # --- PAGE CONFIG ---
10
+ st.set_page_config(page_title="Sentiment Analyzer AI | Bilingual Engine", page_icon="🌐", layout="wide")
11
+
12
+ # --- PROFESSIONAL NEUMORPHIC / GLASS CSS ---
13
+ st.markdown("""
14
+ <style>
15
+ .stApp {
16
+ background: linear-gradient(135deg, #12141d 0%, #1a1c2c 100%);
17
+ color: #ffffff;
18
+ }
19
+ div[data-baseweb="input"] {
20
+ background: rgba(255, 255, 255, 0.05) !important;
21
+ backdrop-filter: blur(10px) !important;
22
+ border-radius: 15px !important;
23
+ border: 1px solid rgba(255, 255, 255, 0.1) !important;
24
+ padding: 5px !important;
25
+ }
26
+ .glass-card {
27
+ background: rgba(255, 255, 255, 0.05);
28
+ backdrop-filter: blur(10px);
29
+ border-radius: 20px;
30
+ border: 1px solid rgba(255, 255, 255, 0.1);
31
+ padding: 30px;
32
+ margin-top: 20px;
33
+ margin-bottom: 25px;
34
+ }
35
+ .stButton>button {
36
+ background: linear-gradient(90deg, #4facfe 0%, #00f2fe 100%);
37
+ color: white;
38
+ border-radius: 12px;
39
+ font-weight: 600;
40
+ height: 3rem;
41
+ }
42
+ [data-testid="stMetricValue"] { color: #00f2fe; font-weight: 800; }
43
+ </style>
44
+ """, unsafe_allow_html=True)
45
+
46
+ # --- DATA LOGGING ---
47
+ FEEDBACK_FILE = "sentiment_feedback.csv"
48
+
49
+ def save_smart_data(text, ai_label, ai_score, corrected_label=None):
50
+ needs_review = "YES" if 0.33 <= ai_score <= 0.65 else "NO"
51
+ new_data = {
52
+ "Timestamp": [datetime.now().strftime("%Y-%m-%d %H:%M:%S")],
53
+ "Text": [text],
54
+ "AI_Label": [ai_label],
55
+ "Confidence": [round(ai_score, 4)],
56
+ "Needs_Review": [needs_review],
57
+ "Corrected_Label": [corrected_label if corrected_label else ai_label]
58
+ }
59
+ df = pd.DataFrame(new_data)
60
+ if not os.path.isfile(FEEDBACK_FILE):
61
+ df.to_csv(FEEDBACK_FILE, index=False)
62
+ else:
63
+ df.to_csv(FEEDBACK_FILE, mode='a', header=False, index=False)
64
+
65
+ # --- MODEL ENGINE PATH FIX ---
66
+ # Change this line:
67
+ MODEL_PATH = "SumedhGajbhiye/Sentiment-Analyzer"
68
+
69
+ @st.cache_resource
70
+ def load_engine(path):
71
+ # This will now download the model from your Model Repo automatically
72
+ return pipeline("sentiment-analysis", model=path, tokenizer=path, device=-1)
73
+
74
+ # --- HEADER SECTION ---
75
+ st.title("Sentiment Analyzer")
76
+ st.caption("Advanced Bilingual Sentiment Analysis for English, Hindi & Hinglish")
77
+
78
+ # --- SIDEBAR HUD ---
79
+ with st.sidebar:
80
+ st.markdown("### πŸ› οΈ ENGINE STATUS")
81
+ if os.path.exists(FEEDBACK_FILE):
82
+ df_log = pd.read_csv(FEEDBACK_FILE)
83
+ st.metric("Total Ingested", len(df_log))
84
+ st.metric("Anomalies Flagged", len(df_log[df_log['Needs_Review'] == 'YES']))
85
+ st.download_button("πŸ“€ Export Dataset", df_log.to_csv(index=False), "engine_feedback.csv", "text/csv")
86
+ else:
87
+ st.info("Waiting for input...")
88
+
89
+ # --- ANALYSIS INTERFACE ---
90
+ # Check if model file exists locally
91
+ if not os.path.exists("model.safetensors"):
92
+ st.error("System Core (model.safetensors) not found in directory!")
93
+ else:
94
+ classifier = load_engine(MODEL_PATH)
95
+
96
+ user_input = st.text_input(
97
+ "QUERY INPUT:",
98
+ placeholder="Enter sentence (English/Hindi/Hinglish)...",
99
+ key="main_input"
100
+ )
101
+
102
+ if user_input:
103
+ with st.status("Neural Scan in Progress...", expanded=False) as status:
104
+ result = classifier(user_input)[0]
105
+ status.update(label="Analysis Complete", state="complete")
106
+
107
+ label = result['label']
108
+ score = result['score']
109
+
110
+ # Adjust these keys to match your specific model's output labels (e.g., LABEL_0, LABEL_1)
111
+ emoji_map = {"POSITIVE": "🟒", "NEUTRAL": "🟑", "NEGATIVE": "πŸ”΄"}
112
+ color = "#00ff88" if "POSITIVE" in label.upper() else "#ff4b4b" if "NEGATIVE" in label.upper() else "#ffaa00"
113
+
114
+ st.markdown(f'''
115
+ <div class="glass-card">
116
+ <h4 style="color: #888; margin:0;">RESULT</h4>
117
+ <h1 style="color: {color}; margin:0; font-size: 3rem;">{label} {emoji_map.get(label.upper(), "")}</h1>
118
+ <p style="color: #aaa;">Confidence: {score:.1%}</p>
119
+ </div>
120
+ ''', unsafe_allow_html=True)
121
+
122
+ # Gauge Chart
123
+ fig = go.Figure(go.Indicator(
124
+ mode = "gauge+number",
125
+ value = score * 100,
126
+ gauge = {'axis': {'range': [None, 100]}, 'bar': {'color': color}}
127
+ ))
128
+ fig.update_layout(height=250, paper_bgcolor='rgba(0,0,0,0)', font={'color': "#fff"})
129
+ st.plotly_chart(fig, use_container_width=True)
130
+
131
+ # Human Verification
132
+ c1, c2 = st.columns(2)
133
+ with c1:
134
+ if st.button("CONFIRM ACCURACY"):
135
+ save_smart_data(user_input, label, score)
136
+ st.toast("Saved!")
137
+ with c2:
138
+ correction = st.selectbox("CORRECT LABEL:", ["Positive", "Neutral", "Negative"])
139
+ if st.button("SAVE CORRECTION"):
140
+ save_smart_data(user_input, label, score, corrected_label=correction)
141
+ st.toast("Correction logged!")
142
+
143
+ # --- LOGS ---
144
+ if os.path.exists(FEEDBACK_FILE):
145
+ with st.expander("πŸ“‚ VIEW RECENT LOGS"):
146
+ st.dataframe(pd.read_csv(FEEDBACK_FILE).tail(5), use_container_width=True)