Spaces:
Sleeping
Sleeping
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.") |