Spaces:
Sleeping
Sleeping
Upload app.py
Browse files
app.py
ADDED
@@ -0,0 +1,111 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
import pandas as pd
|
3 |
+
from transformers import AutoModelForSequenceClassification, AutoTokenizer
|
4 |
+
import torch
|
5 |
+
import random
|
6 |
+
import matplotlib.pyplot as plt
|
7 |
+
|
8 |
+
# Set Streamlit layout to wide
|
9 |
+
st.set_page_config(layout="wide")
|
10 |
+
|
11 |
+
# Load the model and tokenizer
|
12 |
+
model_name = 'dejanseo/BERTic-sentiment'
|
13 |
+
model = AutoModelForSequenceClassification.from_pretrained(model_name)
|
14 |
+
tokenizer = AutoTokenizer.from_pretrained(model_name)
|
15 |
+
|
16 |
+
# Predefined sentences for testing
|
17 |
+
predefined_sentences = [
|
18 |
+
"Veseli me što mogu podijeliti vijest da smo danas otvorili novu poslovnicu u centru grada, što će sigurno olakšati dostupnost našim klijentima.",
|
19 |
+
"Danas je objavljen izvještaj o prometnoj situaciji u gradu, koji pokazuje blagi pad broja nesreća u odnosu na prošli mjesec.",
|
20 |
+
"S velikom tugom moram objaviti da je naša tvrtka pretrpjela značajne gubitke u posljednjem tromjesečju, što će rezultirati otpuštanjima.",
|
21 |
+
"Uživao sam čitajući novi članak o inovacijama u tehnologiji, koji pokazuje koliko brzo napredujemo u ovom području.",
|
22 |
+
"Jutros je objavljena nova vremenska prognoza koja predviđa stabilne temperature tijekom tjedna.",
|
23 |
+
"Nažalost, moram podijeliti da je moja recenzija najnovijeg filma izrazito negativna zbog loše izvedbe glavnih glumaca i slabe radnje.",
|
24 |
+
"S velikim zadovoljstvom najavljujemo lansiranje našeg novog proizvoda, koji je rezultat višegodišnjeg istraživanja i razvoja.",
|
25 |
+
"Na stranici je objavljena nova studija koja analizira utjecaj društvenih mreža na mlade.",
|
26 |
+
"Razočaran sam što moram reći da je kvaliteta usluge u našem lokalnom restoranu značajno opala u posljednje vrijeme.",
|
27 |
+
"Presretan sam što mogu podijeliti da smo osvojili prestižnu nagradu za inovativnost u poslovanju, što je velika čast za naš tim.",
|
28 |
+
"U današnjem broju novina možete pronaći intervju s poznatim autorom koji govori o svojoj najnovijoj knjizi.",
|
29 |
+
"Uz veliko nezadovoljstvo moram reći da su nedavne promjene u zakonodavstvu dovele do mnogih poteškoća za male poduzetnike.",
|
30 |
+
"Jako me veseli što smo uspjeli završiti naš projekt prije roka i s izvanrednim rezultatima.",
|
31 |
+
"Danas je na blogu objavljen članak o važnosti zdrave prehrane u svakodnevnom životu.",
|
32 |
+
"Sa žaljenjem moram objaviti da su najnovije vijesti o ekonomskoj situaciji izrazito nepovoljne za naš sektor.",
|
33 |
+
"S velikom radošću najavljujem da će se održati besplatni online seminar o najnovijim trendovima u digitalnom marketingu.",
|
34 |
+
"Današnje vijesti donose pregled najvažnijih događaja iz svijeta sporta.",
|
35 |
+
"Nažalost, moram podijeliti da su naši napori za prikupljanje sredstava za dobrotvorne svrhe naišli na neočekivane prepreke.",
|
36 |
+
"Uzbuđen sam što mogu podijeliti da smo postigli novi rekord u prodaji naših proizvoda ovog kvartala.",
|
37 |
+
"Na web stranici je objavljena nova analiza tržišta koja pokazuje stabilan rast u sektoru nekretnina.",
|
38 |
+
"S velikim razočaranjem moram reći da su korisničke recenzije našeg najnovijeg proizvoda izrazito negativne.",
|
39 |
+
"S velikim ponosom objavljujemo da je naš tim osvojio prvu nagradu na međunarodnom natjecanju inovacija.",
|
40 |
+
"Danas je na portalu objavljen članak o najnovijim trendovima u modnoj industriji.",
|
41 |
+
"Duboko sam razočaran što moram reći da su naši napori za poboljšanje usluga naišli na ozbiljne izazove.",
|
42 |
+
"Presretan sam što mogu podijeliti da smo ostvarili značajan napredak u istraživanju novih tehnologija.",
|
43 |
+
"Na stranici su objavljeni rezultati ankete o zadovoljstvu korisnika uslugama javnog prijevoza.",
|
44 |
+
"S velikim žaljenjem moram objaviti da su najnoviji financijski izvještaji pokazali gubitke koji će utjecati na naše poslovanje.",
|
45 |
+
"Veseli me što mogu podijeliti da smo dobili pohvale za naš rad na međunarodnoj konferenciji.",
|
46 |
+
"U današnjem izdanju časopisa možete pročitati pregled najnovijih znanstvenih istraživanja.",
|
47 |
+
"S tugom moram reći da su naši planovi za proširenje poslovanja trenutno na čekanju zbog nepredviđenih okolnosti."
|
48 |
+
]
|
49 |
+
|
50 |
+
# Streamlit interface
|
51 |
+
st.title("Croatian Sentiment Analysis by DEJAN")
|
52 |
+
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/)")
|
53 |
+
|
54 |
+
sentence = st.text_input("Enter a sentence for sentiment analysis:")
|
55 |
+
|
56 |
+
if st.button("Predict"):
|
57 |
+
if sentence:
|
58 |
+
inputs = tokenizer(sentence, return_tensors="pt", truncation=True, padding=True, max_length=128)
|
59 |
+
with torch.no_grad():
|
60 |
+
outputs = model(**inputs)
|
61 |
+
logits = outputs.logits
|
62 |
+
probabilities = torch.nn.functional.softmax(logits, dim=-1).flatten().tolist()
|
63 |
+
prediction = torch.argmax(logits, dim=-1).item()
|
64 |
+
|
65 |
+
# Map the prediction to sentiment labels (assuming 0: Positive, 1: Neutral, 2: Negative)
|
66 |
+
sentiment = {0: "Positive", 1: "Neutral", 2: "Negative"}
|
67 |
+
st.write(f"Prediction: {sentiment[prediction]}")
|
68 |
+
|
69 |
+
# Display probabilities
|
70 |
+
st.write("Probabilities:")
|
71 |
+
for i, label in sentiment.items():
|
72 |
+
st.write(f"{label}: {probabilities[i]*100:.2f}%")
|
73 |
+
|
74 |
+
# Plot probabilities
|
75 |
+
labels = [sentiment[i] for i in range(3)]
|
76 |
+
plt.figure(figsize=(8, 4))
|
77 |
+
plt.bar(labels, probabilities, color=['green', 'blue', 'red'])
|
78 |
+
plt.xlabel('Sentiment')
|
79 |
+
plt.ylabel('Probability')
|
80 |
+
plt.title('Sentiment Probabilities')
|
81 |
+
st.pyplot(plt)
|
82 |
+
else:
|
83 |
+
st.write("Please enter a sentence.")
|
84 |
+
|
85 |
+
if st.button("Test a random sentence"):
|
86 |
+
sentence = random.choice(predefined_sentences)
|
87 |
+
st.write(f"Random sentence: {sentence}")
|
88 |
+
inputs = tokenizer(sentence, return_tensors="pt", truncation=True, padding=True, max_length=128)
|
89 |
+
with torch.no_grad():
|
90 |
+
outputs = model(**inputs)
|
91 |
+
logits = outputs.logits
|
92 |
+
probabilities = torch.nn.functional.softmax(logits, dim=-1).flatten().tolist()
|
93 |
+
prediction = torch.argmax(logits, dim=-1).item()
|
94 |
+
|
95 |
+
# Map the prediction to sentiment labels (assuming 0: Positive, 1: Neutral, 2: Negative)
|
96 |
+
sentiment = {0: "Positive", 1: "Neutral", 2: "Negative"}
|
97 |
+
st.write(f"Prediction: {sentiment[prediction]}")
|
98 |
+
|
99 |
+
# Display probabilities
|
100 |
+
st.write("Probabilities:")
|
101 |
+
for i, label in sentiment.items():
|
102 |
+
st.write(f"{label}: {probabilities[i]*100:.2f}%")
|
103 |
+
|
104 |
+
# Plot probabilities
|
105 |
+
labels = [sentiment[i] for i in range(3)]
|
106 |
+
plt.figure(figsize=(8, 4))
|
107 |
+
plt.bar(labels, probabilities, color=['green', 'blue', 'red'])
|
108 |
+
plt.xlabel('Sentiment')
|
109 |
+
plt.ylabel('Probability')
|
110 |
+
plt.title('Sentiment Probabilities')
|
111 |
+
st.pyplot(plt)
|