AIGenMaskedFillLatinText / app_bck_v2.py
Cicciokr's picture
Rename app.py to app_bck_v2.py
6553df3 verified
raw
history blame
4.72 kB
import streamlit as st
from transformers import pipeline, AutoModelForMaskedLM, AutoTokenizer
from cltk.data.fetch import FetchCorpus
import builtins
#import stanza
# Salva la vecchia funzione input
_original_input = builtins.input
# Definisci una funzione che restituisce sempre "Y"
def _always_yes(prompt=""):
print(prompt, "Y") # per far vedere a log che abbiamo risposto 'Y'
return "Y"
# Sostituisci input con _always_yes
builtins.input = _always_yes
#stanza.download("la")
corpus_downloader = FetchCorpus(language="lat")
corpus_downloader.import_corpus("lat_models_cltk")
# Esempio: prova a importare CLTK (se presente)
try:
from cltk import NLP
nlp_lat = NLP(language="lat")
except ImportError:
nlp_lat = None
# Ripristina la funzione input originale (importante!)
#builtins.input = _original_input
# Imposta una chiave di sessione per il testo input, così possiamo aggiornarlo
if "input_text_value" not in st.session_state:
st.session_state["input_text_value"] = "Lorem ipsum dolor sit amet, [MASK] adipiscing elit."
# Frasi di esempio
examples = [
"Asdrubal, frater Annibalis, qui secundo Punico bello [MASK] ingentibus copiis ab Hispania veniens ...",
"hanno et mago qui [MASK] punico bello cornelium consulem aput liparas ceperunt ...",
"Lorem ipsum dolor sit amet, [MASK] adipiscing elit.",
"Populus Romanus cum Macedonibus [MASK] ter gessit",
"Reliqui qui tum principes numerabantur in magistratibus [MASK] cotidieque fere a nobis in contionibus audiebantur."
]
st.title("Completamento di parole in testi Latino Antico con Analisi Morfologica")
st.write("Esempi di testo (clicca sul bottone per copiare la frase nel campo di input):")
# Per ogni frase, creiamo una riga con la frase + bottone "Usa questa frase"
for i, example in enumerate(examples, start=1):
cols = st.columns([4,1]) # la prima colonna più larga per il testo, la seconda più stretta per il bottone
with cols[0]:
st.write(f"Esempio {i}: {example}")
with cols[1]:
# Se il bottone viene premuto, aggiorna la session state
if st.button(f"Usa {i}"):
st.session_state["input_text_value"] = example
# Qui la text_input è associata alla chiave "input_text_value"
input_text = st.text_area(
label="Testo:",
height=150, # Altezza in pixel
key="input_text_value"
)
# Esempio: carichiamo un modello di linguaggio
# (sostituisci con i tuoi modelli)
tokenizer_roberta = AutoTokenizer.from_pretrained("Cicciokr/Roberta-Base-Latin-Uncased")
model_roberta = AutoModelForMaskedLM.from_pretrained("Cicciokr/Roberta-Base-Latin-Uncased")
fill_mask_roberta = pipeline("fill-mask", model=model_roberta, tokenizer=tokenizer_roberta)
punctuation_marks = {".", ",", ";", ":", "!", "?"}
def get_valid_predictions(sentence, max_attempts=3, top_k=5):
attempt = 0
filtered_predictions = []
while attempt < max_attempts:
predictions = fill_mask_roberta(sentence, top_k=top_k)
# Filtra le predizioni rimuovendo la punteggiatura
filtered_predictions = [
pred for pred in predictions if pred["token_str"] not in punctuation_marks
]
# Se troviamo almeno una parola valida, interrompiamo il ciclo
if filtered_predictions:
break
attempt += 1
return filtered_predictions
# Se l'utente ha inserito (o selezionato) un testo
if input_text:
# Sostituiamo [MASK] con <mask> (lo tokenizer Roberta se lo aspetta così)
input_text_roberta = input_text.replace("[MASK]", "<mask>")
predictions_roberta = get_valid_predictions(input_text_roberta)
st.subheader("Risultati delle previsioni:")
for pred in predictions_roberta:
st.write(f" Token: {pred['token_str']}\n")
st.write(f" Probabilità: {pred['score']:.4f}\n")
st.write(f" Sequence: {pred['sequence']}\n")
st.write("---")
# Esempio di analisi con CLTK (se installato e importato)
if nlp_lat is not None:
st.subheader("Analisi Morfologica con CLTK")
for pred in predictions_roberta:
# Ricostruisci la frase sostituendo <mask> con la parola predetta
doc = nlp_lat(pred['token_str'])
st.write(f"Frase {i}: {pred['token_str']}")
for w in doc.words:
st.write(
f"- **Token**: {w.string}\n"
f" - Lemma: {w.lemma}\n"
f" - UPOS: {w.upos}\n"
f" - Morph: {w.features}\n"
)
st.write("---")
else:
st.warning("CLTK non installato (o non importato). Esegui 'pip install cltk' per abilitare l'analisi.")