import streamlit as st from transformers import BertTokenizer, BertForSequenceClassification import torch # Config class class Config: TOKENIZER_PATH = "ahmedrachid/FinancialBERT" # Use tokenizer from the original model MODEL_PATH = "Sandy0909/finance_sentiment" MAX_LEN = 512 TOKENIZER = BertTokenizer.from_pretrained(TOKENIZER_PATH) class FinancialBERT(torch.nn.Module): def __init__(self): super(FinancialBERT, self).__init__() self.bert = BertForSequenceClassification.from_pretrained(Config.MODEL_PATH, num_labels=3, hidden_dropout_prob=0.5) def forward(self, input_ids, attention_mask, token_type_ids, labels=None): output = self.bert(input_ids, attention_mask=attention_mask, token_type_ids=token_type_ids, labels=labels) return output.loss, output.logits # Load model model = FinancialBERT() model.eval() # Streamlit App # Set title and an image/banner if you have one st.title("Financial Sentiment Analysis") # st.image("path_to_your_image.jpg", use_column_width=True) # Description st.write(""" This application predicts the sentiment of financial sentences using a state-of-the-art model. Enter a financial sentence below and click 'Predict' to get its sentiment. """) sentence = st.text_area("Enter a financial sentence:", "") if st.button("Predict"): tokenizer = Config.TOKENIZER inputs = tokenizer([sentence], return_tensors="pt", truncation=True, padding=True, max_length=Config.MAX_LEN) with torch.no_grad(): logits = model(input_ids=inputs['input_ids'], attention_mask=inputs['attention_mask'], token_type_ids=inputs.get('token_type_ids'))[1] probs = torch.nn.functional.softmax(logits, dim=-1) predictions = torch.argmax(probs, dim=-1) sentiment = ['negative', 'neutral', 'positive'][predictions[0].item()] # Output visualization st.subheader('Predicted Sentiment:') st.write(f"The sentiment is: **{sentiment.capitalize()}**") # Show Confidence levels as a bar chart st.subheader('Model Confidence Levels:') st.bar_chart(probs[0].numpy(), use_container_width=True) # Sidebar: Documentation/Help st.sidebar.header('About') st.sidebar.text(""" This application uses a BERT-based model trained specifically for financial sentences. The model can predict if the sentiment of a sentence is positive, negative, or neutral. """)