Spaces:
Running
Running
# streamlit app | |
import streamlit as st | |
import pandas as pd | |
from transformers import BertTokenizer, BertForSequenceClassification | |
from transformers import pipeline | |
from scraper import get_latest_news | |
# Load FinBERT model and tokenizer | |
finbert = BertForSequenceClassification.from_pretrained("yiyanghkust/finbert-tone", num_labels=3) | |
tokenizer = BertTokenizer.from_pretrained("yiyanghkust/finbert-tone") | |
# Create sentiment analysis pipeline | |
nlp = pipeline("sentiment-analysis", model=finbert, tokenizer=tokenizer) | |
# Function to perform sentiment analysis | |
def analyze_sentiment(text): | |
results = nlp(text) | |
sentiment_label = results[0]["label"] | |
return sentiment_label | |
# Function to get sentiment labels for a list of headlines | |
def get_sentiment_labels(headlines_list): | |
sentiment_labels = [] | |
for headline in headlines_list: | |
label = analyze_sentiment(headline) | |
sentiment_labels.append(label) | |
return sentiment_labels | |
# Function to print a Streamlit table with news headlines and sentiment labels | |
def display_news_sentiment_table(headlines_list, sentiment_labels): | |
df = pd.DataFrame({ | |
"Headlines": headlines_list, | |
"Sentiment": sentiment_labels | |
}) | |
# Function to apply background colors based on sentiment labels | |
def style_func(val): | |
color_dict = { | |
"negative": 'red', | |
"positive": 'green', | |
"neutral": 'gray' | |
} | |
return f"background-color: {color_dict[val.lower()]}" | |
# Display the table | |
st.dataframe(df.set_index("Headlines").style.applymap(style_func, subset=["Sentiment"])) | |
# Streamlit app | |
st.title("Financial News Sentiment Analysis") | |
# Get the latest news headlines and sentiment labels using the scraper | |
latest_news_headlines = get_latest_news() | |
sentiment_labels = get_sentiment_labels(latest_news_headlines) | |
# Display the table in the Streamlit app | |
display_news_sentiment_table(latest_news_headlines, sentiment_labels) | |
# Refresh button | |
if st.button("Refresh"): | |
st.experimental_rerun() | |
# App Description | |
st.markdown("---") | |
st.subheader("Description") | |
st.info("This app uses the [FinBERT](https://huggingface.co/yiyanghkust/finbert-tone) model from Hugging Face to perform sentiment analysis on financial news headlines. The headlines are scraped in real-time from [Finviz](https://finviz.com/). The news headlines displayed on the web app are the latest, and you can click the 'Refresh' button to update the headlines and sentiment analysis.") | |
st.markdown("---") |