File size: 4,720 Bytes
f99351f
 
d71a9cf
dbe3d41
f86f0ff
dbe3d41
 
 
 
 
 
 
 
 
 
f86f0ff
 
 
8b56823
f99351f
 
 
 
 
 
 
8b56823
 
f86f0ff
8b56823
f99351f
 
 
 
 
 
 
 
 
 
0d67209
 
f99351f
 
 
 
efd1bb0
f99351f
 
 
 
 
efd1bb0
f99351f
 
 
 
 
 
0d67209
 
 
 
 
f99351f
 
 
 
 
 
90e7939
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f99351f
 
 
 
 
90e7939
 
 
f99351f
e5b1472
f99351f
0d67209
 
 
f99351f
1871ff3
f99351f
 
 
1871ff3
f99351f
d702ff2
f99351f
d702ff2
 
b97d9f7
36f877d
f99351f
b97d9f7
36f877d
 
332e11b
f99351f
 
 
efd1bb0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
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.")