|
import streamlit as st
|
|
import pandas as pd
|
|
from transformers import AutoModelForSequenceClassification, AutoTokenizer
|
|
import torch
|
|
import random
|
|
import matplotlib.pyplot as plt
|
|
|
|
|
|
st.set_page_config(layout="wide")
|
|
|
|
|
|
model_name = 'dejanseo/BERTic-sentiment'
|
|
model = AutoModelForSequenceClassification.from_pretrained(model_name)
|
|
tokenizer = AutoTokenizer.from_pretrained(model_name)
|
|
|
|
|
|
predefined_sentences = [
|
|
"Veseli me što mogu podijeliti vijest da smo danas otvorili novu poslovnicu u centru grada, što će sigurno olakšati dostupnost našim klijentima.",
|
|
"Danas je objavljen izvještaj o prometnoj situaciji u gradu, koji pokazuje blagi pad broja nesreća u odnosu na prošli mjesec.",
|
|
"S velikom tugom moram objaviti da je naša tvrtka pretrpjela značajne gubitke u posljednjem tromjesečju, što će rezultirati otpuštanjima.",
|
|
"Uživao sam čitajući novi članak o inovacijama u tehnologiji, koji pokazuje koliko brzo napredujemo u ovom području.",
|
|
"Jutros je objavljena nova vremenska prognoza koja predviđa stabilne temperature tijekom tjedna.",
|
|
"Nažalost, moram podijeliti da je moja recenzija najnovijeg filma izrazito negativna zbog loše izvedbe glavnih glumaca i slabe radnje.",
|
|
"S velikim zadovoljstvom najavljujemo lansiranje našeg novog proizvoda, koji je rezultat višegodišnjeg istraživanja i razvoja.",
|
|
"Na stranici je objavljena nova studija koja analizira utjecaj društvenih mreža na mlade.",
|
|
"Razočaran sam što moram reći da je kvaliteta usluge u našem lokalnom restoranu značajno opala u posljednje vrijeme.",
|
|
"Presretan sam što mogu podijeliti da smo osvojili prestižnu nagradu za inovativnost u poslovanju, što je velika čast za naš tim.",
|
|
"U današnjem broju novina možete pronaći intervju s poznatim autorom koji govori o svojoj najnovijoj knjizi.",
|
|
"Uz veliko nezadovoljstvo moram reći da su nedavne promjene u zakonodavstvu dovele do mnogih poteškoća za male poduzetnike.",
|
|
"Jako me veseli što smo uspjeli završiti naš projekt prije roka i s izvanrednim rezultatima.",
|
|
"Danas je na blogu objavljen članak o važnosti zdrave prehrane u svakodnevnom životu.",
|
|
"Sa žaljenjem moram objaviti da su najnovije vijesti o ekonomskoj situaciji izrazito nepovoljne za naš sektor.",
|
|
"S velikom radošću najavljujem da će se održati besplatni online seminar o najnovijim trendovima u digitalnom marketingu.",
|
|
"Današnje vijesti donose pregled najvažnijih događaja iz svijeta sporta.",
|
|
"Nažalost, moram podijeliti da su naši napori za prikupljanje sredstava za dobrotvorne svrhe naišli na neočekivane prepreke.",
|
|
"Uzbuđen sam što mogu podijeliti da smo postigli novi rekord u prodaji naših proizvoda ovog kvartala.",
|
|
"Na web stranici je objavljena nova analiza tržišta koja pokazuje stabilan rast u sektoru nekretnina.",
|
|
"S velikim razočaranjem moram reći da su korisničke recenzije našeg najnovijeg proizvoda izrazito negativne.",
|
|
"S velikim ponosom objavljujemo da je naš tim osvojio prvu nagradu na međunarodnom natjecanju inovacija.",
|
|
"Danas je na portalu objavljen članak o najnovijim trendovima u modnoj industriji.",
|
|
"Duboko sam razočaran što moram reći da su naši napori za poboljšanje usluga naišli na ozbiljne izazove.",
|
|
"Presretan sam što mogu podijeliti da smo ostvarili značajan napredak u istraživanju novih tehnologija.",
|
|
"Na stranici su objavljeni rezultati ankete o zadovoljstvu korisnika uslugama javnog prijevoza.",
|
|
"S velikim žaljenjem moram objaviti da su najnoviji financijski izvještaji pokazali gubitke koji će utjecati na naše poslovanje.",
|
|
"Veseli me što mogu podijeliti da smo dobili pohvale za naš rad na međunarodnoj konferenciji.",
|
|
"U današnjem izdanju časopisa možete pročitati pregled najnovijih znanstvenih istraživanja.",
|
|
"S tugom moram reći da su naši planovi za proširenje poslovanja trenutno na čekanju zbog nepredviđenih okolnosti."
|
|
]
|
|
|
|
|
|
st.title("Croatian Sentiment Analysis by DEJAN")
|
|
st.write("BERTic-based Croatian language text classification transformer fine-tuned for sentence-level sentiment analysis. Developed and released by [Dejan Marketing](https://dejanmarketing.com/)")
|
|
|
|
sentence = st.text_input("Enter a sentence for sentiment analysis:")
|
|
|
|
if st.button("Predict"):
|
|
if sentence:
|
|
inputs = tokenizer(sentence, return_tensors="pt", truncation=True, padding=True, max_length=128)
|
|
with torch.no_grad():
|
|
outputs = model(**inputs)
|
|
logits = outputs.logits
|
|
probabilities = torch.nn.functional.softmax(logits, dim=-1).flatten().tolist()
|
|
prediction = torch.argmax(logits, dim=-1).item()
|
|
|
|
|
|
sentiment = {0: "Positive", 1: "Neutral", 2: "Negative"}
|
|
st.write(f"Prediction: {sentiment[prediction]}")
|
|
|
|
|
|
st.write("Probabilities:")
|
|
for i, label in sentiment.items():
|
|
st.write(f"{label}: {probabilities[i]*100:.2f}%")
|
|
|
|
|
|
labels = [sentiment[i] for i in range(3)]
|
|
plt.figure(figsize=(8, 4))
|
|
plt.bar(labels, probabilities, color=['green', 'blue', 'red'])
|
|
plt.xlabel('Sentiment')
|
|
plt.ylabel('Probability')
|
|
plt.title('Sentiment Probabilities')
|
|
st.pyplot(plt)
|
|
else:
|
|
st.write("Please enter a sentence.")
|
|
|
|
if st.button("Test a random sentence"):
|
|
sentence = random.choice(predefined_sentences)
|
|
st.write(f"Random sentence: {sentence}")
|
|
inputs = tokenizer(sentence, return_tensors="pt", truncation=True, padding=True, max_length=128)
|
|
with torch.no_grad():
|
|
outputs = model(**inputs)
|
|
logits = outputs.logits
|
|
probabilities = torch.nn.functional.softmax(logits, dim=-1).flatten().tolist()
|
|
prediction = torch.argmax(logits, dim=-1).item()
|
|
|
|
|
|
sentiment = {0: "Positive", 1: "Neutral", 2: "Negative"}
|
|
st.write(f"Prediction: {sentiment[prediction]}")
|
|
|
|
|
|
st.write("Probabilities:")
|
|
for i, label in sentiment.items():
|
|
st.write(f"{label}: {probabilities[i]*100:.2f}%")
|
|
|
|
|
|
labels = [sentiment[i] for i in range(3)]
|
|
plt.figure(figsize=(8, 4))
|
|
plt.bar(labels, probabilities, color=['green', 'blue', 'red'])
|
|
plt.xlabel('Sentiment')
|
|
plt.ylabel('Probability')
|
|
plt.title('Sentiment Probabilities')
|
|
st.pyplot(plt)
|
|
|