NLP_Processing / app.py
Pro-Coder's picture
Create app.py
d4ac33d verified
Raw
History Blame Contribute Delete
3.35 kB
import gradio as gr
import tweepy
import pandas as pd
import matplotlib.pyplot as plt
from wordcloud import WordCloud
from transformers import pipeline
# Hugging Face Models
sentiment_analyzer = pipeline("sentiment-analysis")
summarizer = pipeline("summarization", model="facebook/bart-large-cnn")
# Twitter API Setup (replace with your Bearer Token)
BEARER_TOKEN = "AAAAAAAAAAAAAAAAAAAAAN3g3wEAAAAA33Fzyb2P1rQzFwmXPIh4OHIw7e8%3DJY5zPrXhmzlht200jSaA8dgQixPX6idTvk2HWX0LgKwruozAsC"
client = tweepy.Client(bearer_token=BEARER_TOKEN)
# Function: Fetch Tweets
def fetch_tweets(username, count=50):
tweets = client.get_users_tweets(
id=client.get_user(username=username).data.id,
max_results=min(count, 100)
)
texts = [t.text for t in tweets.data] if tweets.data else []
df = pd.DataFrame(texts, columns=["text"])
return df
# Function: Load file (CSV/XLSX)
def load_file(file):
if file.name.endswith(".csv"):
return pd.read_csv(file.name)
elif file.name.endswith(".xlsx"):
return pd.read_excel(file.name)
else:
return pd.DataFrame(columns=["text"])
# Function: Clean text
def clean_text(df):
df["cleaned_text"] = (
df["text"].astype(str)
.str.replace(r"http\S+", "", regex=True)
.str.replace(r"@\w+", "", regex=True)
.str.replace(r"[^A-Za-z0-9\s]", "", regex=True)
.str.strip()
)
return df
# Function: Sentiment, Summary & WordCloud
def analyze_data(df):
if df.empty:
return "No data found", None, None
df = clean_text(df)
# Sentiment
df["sentiment"] = df["cleaned_text"].apply(
lambda x: sentiment_analyzer(x[:512])[0]["label"] if len(x) > 0 else "neutral"
)
# Summary (combine text for summarization)
full_text = " ".join(df["cleaned_text"].tolist())[:3000]
summary = summarizer(full_text, max_length=100, min_length=30, do_sample=False)[0]["summary_text"]
# WordCloud
text_for_wc = " ".join(df["cleaned_text"].tolist())
wordcloud = WordCloud(width=800, height=400, background_color="white").generate(text_for_wc)
plt.figure(figsize=(8, 4))
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.tight_layout()
plt.savefig("wordcloud.png")
return summary, df, "wordcloud.png"
# Gradio UI
with gr.Blocks() as demo:
gr.Markdown("# 📊 Twitter & File Sentiment Analysis Prototype")
with gr.Tab("Fetch Tweets"):
username = gr.Textbox(label="Twitter Username (without @)")
count = gr.Slider(10, 100, value=50, step=10, label="Number of Tweets")
btn_fetch = gr.Button("Fetch & Analyze")
summary_out = gr.Textbox(label="Summary")
df_out = gr.Dataframe()
img_out = gr.Image()
with gr.Tab("Upload File"):
file_in = gr.File(label="Upload CSV/XLSX")
btn_file = gr.Button("Analyze File")
summary_out2 = gr.Textbox(label="Summary")
df_out2 = gr.Dataframe()
img_out2 = gr.Image()
# Actions
btn_fetch.click(
lambda u, c: analyze_data(fetch_tweets(u, c)),
inputs=[username, count],
outputs=[summary_out, df_out, img_out],
)
btn_file.click(
lambda f: analyze_data(load_file(f)),
inputs=[file_in],
outputs=[summary_out2, df_out2, img_out2],
)
demo.launch()