Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -88,16 +88,30 @@ def extract_tone_fallback(text):
|
|
| 88 |
def extract_hashtags(text):
|
| 89 |
return re.findall(r"#\w+", text)
|
| 90 |
|
| 91 |
-
# Extract frames using Groq API (
|
| 92 |
def extract_frames(text):
|
| 93 |
try:
|
| 94 |
-
|
|
|
|
| 95 |
{"role": "user", "content": text}])
|
| 96 |
-
return response["choices"][0]["message"]["content"]
|
| 97 |
except Exception as e:
|
| 98 |
logging.error(f"Groq API error: {e}")
|
| 99 |
return extract_frames_fallback(text)
|
| 100 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 101 |
# Fallback method for frame extraction (with categorization of Major, Significant, Minor)
|
| 102 |
def extract_frames_fallback(text):
|
| 103 |
detected_frames = set()
|
|
@@ -239,27 +253,21 @@ if uploaded_excel:
|
|
| 239 |
tone_filter = st.multiselect("Filter by Tone", options=["Emotional", "Harsh", "Somber", "Motivational", "Informative", "Positive", "Angry", "Fearful", "Sarcastic", "Hopeful"])
|
| 240 |
frame_filter = st.multiselect("Filter by Frame", options=["Human Rights & Justice", "Political & State Accountability", "Gender & Patriarchy", "Religious Freedom & Persecution", "Grassroots Mobilization", "Environmental Crisis & Activism", "Anti-Extremism & Anti-Violence", "Social Inequality & Economic Disparities", "Activism & Advocacy", "Systemic Oppression", "Intersectionality", "Call to Action", "Empowerment & Resistance", "Climate Justice", "Human Rights Advocacy"])
|
| 241 |
|
| 242 |
-
|
| 243 |
-
|
| 244 |
-
|
| 245 |
-
# Apply filters
|
| 246 |
-
if tone_filter:
|
| 247 |
-
filtered_data = {key: value for key, value in filtered_data.items() if any(tone in tone_filter for tone in value["Tone"])}
|
| 248 |
-
if frame_filter:
|
| 249 |
-
filtered_data = {key: value for key, value in filtered_data.items() if any(frame in frame_filter for frame in value["Frames"])}
|
| 250 |
|
| 251 |
-
#
|
| 252 |
-
|
| 253 |
-
|
| 254 |
-
|
| 255 |
-
|
| 256 |
-
st.write(f"**{key}:** {value}")
|
| 257 |
|
| 258 |
-
#
|
| 259 |
if filtered_data:
|
| 260 |
-
|
| 261 |
docx_io = io.BytesIO()
|
| 262 |
-
|
| 263 |
docx_io.seek(0)
|
| 264 |
st.download_button(label="Download Analysis as DOCX", data=docx_io, file_name="analysis.docx")
|
| 265 |
else:
|
|
|
|
| 88 |
def extract_hashtags(text):
|
| 89 |
return re.findall(r"#\w+", text)
|
| 90 |
|
| 91 |
+
# Extract frames using Groq API (with categorization: Major Focus, Significant Focus, Minor Mention)
|
| 92 |
def extract_frames(text):
|
| 93 |
try:
|
| 94 |
+
# Prompt Groq to categorize frames and their focus
|
| 95 |
+
response = llm.chat([{"role": "system", "content": "Classify the following text into relevant activism frames and categorize each frame as Major Focus, Significant Focus, or Minor Mention."},
|
| 96 |
{"role": "user", "content": text}])
|
| 97 |
+
return parse_frames(response["choices"][0]["message"]["content"])
|
| 98 |
except Exception as e:
|
| 99 |
logging.error(f"Groq API error: {e}")
|
| 100 |
return extract_frames_fallback(text)
|
| 101 |
|
| 102 |
+
# Function to parse Groq response and categorize frames
|
| 103 |
+
def parse_frames(response_text):
|
| 104 |
+
frame_data = {}
|
| 105 |
+
lines = response_text.splitlines()
|
| 106 |
+
for line in lines:
|
| 107 |
+
if "Major Focus" in line or "Significant Focus" in line or "Minor Mention" in line:
|
| 108 |
+
category = line.split(":")[0].strip()
|
| 109 |
+
frame = line.split(":")[1].strip()
|
| 110 |
+
if category not in frame_data:
|
| 111 |
+
frame_data[category] = []
|
| 112 |
+
frame_data[category].append(frame)
|
| 113 |
+
return frame_data
|
| 114 |
+
|
| 115 |
# Fallback method for frame extraction (with categorization of Major, Significant, Minor)
|
| 116 |
def extract_frames_fallback(text):
|
| 117 |
detected_frames = set()
|
|
|
|
| 253 |
tone_filter = st.multiselect("Filter by Tone", options=["Emotional", "Harsh", "Somber", "Motivational", "Informative", "Positive", "Angry", "Fearful", "Sarcastic", "Hopeful"])
|
| 254 |
frame_filter = st.multiselect("Filter by Frame", options=["Human Rights & Justice", "Political & State Accountability", "Gender & Patriarchy", "Religious Freedom & Persecution", "Grassroots Mobilization", "Environmental Crisis & Activism", "Anti-Extremism & Anti-Violence", "Social Inequality & Economic Disparities", "Activism & Advocacy", "Systemic Oppression", "Intersectionality", "Call to Action", "Empowerment & Resistance", "Climate Justice", "Human Rights Advocacy"])
|
| 255 |
|
| 256 |
+
filtered_data = {post_number: data for post_number, data in output_data.items() if
|
| 257 |
+
(not tone_filter or any(tone in data["Tone"] for tone in tone_filter)) and
|
| 258 |
+
(not frame_filter or any(frame in data["Frames"] for frame in frame_filter))}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 259 |
|
| 260 |
+
# Displaying the posts in collapsible sections
|
| 261 |
+
for post_number, data in filtered_data.items():
|
| 262 |
+
with st.expander(post_number):
|
| 263 |
+
for key, value in data.items():
|
| 264 |
+
st.write(f"**{key}:** {value}")
|
|
|
|
| 265 |
|
| 266 |
+
# Allow downloading the DOCX file
|
| 267 |
if filtered_data:
|
| 268 |
+
docx_output = create_docx_from_data(filtered_data)
|
| 269 |
docx_io = io.BytesIO()
|
| 270 |
+
docx_output.save(docx_io)
|
| 271 |
docx_io.seek(0)
|
| 272 |
st.download_button(label="Download Analysis as DOCX", data=docx_io, file_name="analysis.docx")
|
| 273 |
else:
|