Spaces:
Sleeping
Sleeping
# app.py | |
import streamlit as st | |
import pandas as pd | |
import re | |
from transformers import BertTokenizer, BertForSequenceClassification | |
import torch | |
import matplotlib.pyplot as plt | |
import numpy as np | |
from PIL import Image | |
# Load and display the WEBP image | |
image = Image.open("imagefintech.webp") # Replace 'logo.webp' with your actual WEBP file path | |
st.image(image, caption="Sentiment Analysis App", use_column_width=True) | |
# Load the model and tokenizer | |
def load_model(): | |
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased") | |
model = BertForSequenceClassification.from_pretrained("bert-base-uncased", num_labels=8) | |
return tokenizer, model | |
tokenizer, model = load_model() | |
# Custom sentiments | |
sentiments = ["happy", "motivated", "growth", "optimistic", "jealousy", "frustrated", "decline", "angry"] | |
# Define the preprocessing function | |
def preprocess_text(text): | |
text = re.sub(r'[^\w\s]', '', text.lower()) # Remove punctuation and lowercase | |
text = re.sub(r'\d+', '', text) # Remove numbers | |
return text | |
# Title and instructions | |
st.title("Sentiment Analysis of Financial News") | |
st.write("Enter a sentence to analyze its sentiment across predefined categories.") | |
# Input text from user | |
text = st.text_input("Enter a sentence:", "") | |
if text: | |
# Preprocess and tokenize | |
cleaned_text = preprocess_text(text) | |
inputs = tokenizer(cleaned_text, return_tensors="pt", truncation=True, padding=True) | |
# Get model predictions | |
with torch.no_grad(): | |
outputs = model(**inputs) | |
sentiment_score = outputs.logits.softmax(dim=1) | |
# Convert tensor to list for plotting | |
score_list = sentiment_score.tolist()[0] | |
# Display sentiment scores as a table | |
st.subheader("Sentiment Scores") | |
score_df = pd.DataFrame({"Sentiment": sentiments, "Score": score_list}) | |
st.dataframe(score_df) | |
# Plot the sentiment scores | |
st.subheader("Sentiment Score Chart") | |
fig, ax = plt.subplots(figsize=(10, 6)) | |
mustard_yellow = "#FFDB58" | |
# Plot bars with spacing and color | |
ax.bar(np.arange(len(sentiments)) * 1.5, score_list, color=mustard_yellow, edgecolor="black", width=0.8) | |
# Customize the plot | |
ax.set_xlabel("Sentiments", color="black", fontsize=12) | |
ax.set_ylabel("Scores", color="black", fontsize=12) | |
ax.set_title("Sentiment Analysis of Financial News", color="black", fontsize=14) | |
ax.set_xticks(np.arange(len(sentiments)) * 1.5) | |
ax.set_xticklabels(sentiments, color="black", fontsize=10, rotation=45) | |
ax.tick_params(axis="y", colors="black") | |
# Display the plot in Streamlit | |
st.pyplot(fig) | |