Durganihantri's picture
Update app.py
17a665e verified
import streamlit as st
import pandas as pd
import nltk
import matplotlib.pyplot as plt
import seaborn as sns
from textblob import TextBlob
from transformers import pipeline
from wordcloud import WordCloud
import os
# Ensure necessary NLTK datasets are downloaded
nltk.download('punkt')
# Load pre-trained NLP model for classification
classifier = pipeline("text-classification", model="distilbert-base-uncased-finetuned-sst-2-english")
# Function to analyze sentiment
def analyze_sentiment(text):
analysis = TextBlob(text)
return analysis.sentiment.polarity # Returns sentiment score (-1 to 1)
# Function to categorize microaggressions using AI
def classify_microaggression(text):
result = classifier(text)[0]
return result["label"], result["score"]
# Streamlit UI
st.title("MicroAggression Insight Tool πŸš€")
st.write("Analyze, categorize, and visualize reported microaggressions using AI and psychological research methods.")
# **Ethical Research Consent Notice**
st.markdown("### Ethical Considerations")
st.write("By submitting your responses, you agree to participate in this study anonymously. Your data will be stored securely for research purposes.")
# **Experimental Study: Perception & Acceptability Ratings**
st.subheader("Microaggression Perception Experiment")
st.write("How acceptable do you find the following statement?")
# User Input for Microaggression Statement
user_input = st.text_area("Enter a microaggression example:")
rating = st.slider("Rate on a scale of 1 (Not Acceptable) to 5 (Completely Acceptable)", 1, 5)
emotional_impact = st.slider("How emotionally impactful is this? (1 = Not at all, 5 = Very Strong)", 1, 5)
if st.button("Analyze"):
if user_input:
sentiment_score = analyze_sentiment(user_input)
category, confidence = classify_microaggression(user_input)
# Display results
st.write(f"**Predicted Category:** {category} (Confidence: {confidence:.2f})")
st.write(f"**Sentiment Score:** {sentiment_score:.2f} (Negative: -1, Neutral: 0, Positive: 1)")
st.write(f"**Perceived Acceptability:** {rating}/5")
st.write(f"**Emotional Impact:** {emotional_impact}/5")
# Store input in a dataframe
df = pd.DataFrame([[user_input, category, sentiment_score, rating, emotional_impact]],
columns=["Text", "Category", "Sentiment", "Acceptability", "Impact"])
# Save data to CSV
file_path = "data.csv"
if not os.path.exists(file_path):
df.to_csv(file_path, index=False)
else:
df.to_csv(file_path, mode='a', header=False, index=False)
# **Focus Group & Open-ended Research Input**
st.subheader("πŸ“’ Focus Group: Share Your Perspective")
response = st.text_area("Describe how this statement made you feel:")
if st.button("Submit Response"):
if response:
with open("qualitative_responses.csv", "a") as f:
f.write(response + "\n")
st.success("Response recorded! βœ…")
# **Data Analysis & Visualization**
st.subheader("πŸ“Š Data Insights & Visualizations")
try:
data = pd.read_csv("data.csv")
if not data.empty:
# Show category distribution
st.write("### Microaggression Category Distribution")
category_counts = data["Category"].value_counts()
fig, ax = plt.subplots()
category_counts.plot(kind='bar', ax=ax)
st.pyplot(fig)
# Generate a word cloud
st.write("### Common Words in Microaggressions")
wordcloud = WordCloud(width=800, height=400, background_color="white").generate(" ".join(data["Text"]))
fig, ax = plt.subplots()
ax.imshow(wordcloud, interpolation="bilinear")
ax.axis("off")
st.pyplot(fig)
# **Correlation Heatmap**
st.write("### Correlation Between Sentiment, Acceptability, and Impact")
plt.figure(figsize=(6, 4))
sns.heatmap(data[["Sentiment", "Acceptability", "Impact"]].corr(), annot=True, cmap="coolwarm", fmt=".2f")
st.pyplot(plt)
# **Show Data Table**
if st.checkbox("Show Data Table"):
st.dataframe(data)
except FileNotFoundError:
st.write("No data available yet. Submit responses to populate insights.")
# **Download Data Option for Researchers**
st.subheader("πŸ“₯ Download Data for Research")
if os.path.exists("data.csv"):
with open("data.csv", "rb") as file:
st.download_button(label="Download CSV Data", data=file, file_name="microaggression_data.csv", mime="text/csv")
st.write("πŸ”¬ Developed as a research tool for understanding microaggressions in social psychology.")