[Dizionario] Favele
Marco Gaiarin
gaio a sv.lnf.it
Ven 27 Set 2002 16:13:05 CEST
Mandi! Giuseppe Bilotta
In chel di` si favelave...
> Grazie per l'attenzione (e per il magnifico lavoro!),
...e non potete sapere quanto questa cosa mi riempia il cuore! ;)
Favele nasce per la mia tesi, un paio di anni or sono, ed è una cosa
che pensavo all'interno di un progetto più grande (dislinux) per
iniziare a rendere linux più accessibilie a persone disabili.
Non credo di aver impegnato risorse allo sfinimento in favele, come
dovrebbe essere una tesi, ma ci ho perso un po' di tempo.
Il problema è che non mi sono mai considerato un bravo programmatore
(la programmazione è un arte, e io non sono un artista ;), e una serie
di scelte conseguenti mi hanno sempre più allontanato. Non ho
manutenuto un byte di quel progetto dal giorno della mia laurea. ;(
Quindi mi fa sommo piacere pensare che possa essere utile a qualcuno, e
pensare che il suo sviluppo possa riprendere.
Ma forse è il caso che spieghi per bene cosa voleva essere favele.
Innanzitutto mi ero orientato verso le disabilità motorie, con l'idea
di realizzare un sw di ``predizione sintattica'', ovvero un software
che potesse aiutare un disabile nell'utilizzo della tastiera. Un
``completamente automatico'', ma possibilmente più intelligente. ;)
Come prima cosa, in parallelo alla ricerca di algoritmi e altro, mi
sono messo a cercare un formato per il database di parole.
Mi sono inizialmente orientato verso database per aspell/ispell,
pensavo che fosse fattibile, ma quei database sono orientati a trovare
una parola ``simile'' a quella digitata, mentre io dovevo cercare per
prefisso.
Alla stessa maniera avevo anche io pensato a dict, ma quel formato
conteneva tutta una serie di elementi a me assolutamente inutili, e
quindi non sarebbe stato un formato efficiente.
Alla fine ho costuito un mio formato di dati su file (brutale file di
testo) e in memoria (albero alfabet-ario, nel senso di n-ario con n le
lettere dell'alfabeto ;)
Questo per dire due parole sulla corrente discussione sul formato, per
me vano bene tutti, importante che da questi si possa poi generare un
vocabolario con le caratteristiche giusto per quello scopo, e non vedo
la differenza (se non pratica) tra XML e un database.
Ma andimao avanti.
Favele quindi è una libreria pensata per essere integrata in ``ambienti
di scrittura'', e gfavele nel pacchetto è solo un esempio di poche
righe dell'uso della libreria con il toolkit ``testo'' di gtk 1.2.
Contiene essenzialmente tutta una serie di funzioni di inizializzazione
del dizionario, una serie di funzioni di inizializzazione del contesto
(nel senso di ``ultimo testo digitato''), una funziona di avanzamento
del contensto e delle funzioni di manipolazione del ``risultato'',
ovvero della struttura dati che contiene le possibili parole predette.
L'interfaccia della libreria fa schifo, era la priam cosa che mi ero
ripromesso di fare. ;(
Nella predizione ``seria'' (in campi in cui realmente serve) si usano
una molteplicità di tecniche, potete dare una letta alla tesi per
vederle in dettagio, ma comunque si da per scontato che il vocabolario
in uso è molto piccolo ed estremamente caretterizzato.
Questo perchè solitamente un disabile non ha solo un tipo di
menomazioen, e quindi a una disabilità fisica può accompagnarsi una
limitazione delle capacità cognitive.
Oppure la predizione è usata come strumento per accellerare la
comunicazione immediata, e quindi normalmente nellalingua parlata in un
dato contesto le parole sono poche.
Questo implica che cuore degli algoritmi di favele è la statistica,
ovvero la parola che più è stata usata è quella che più verrà usata.
Su questo sono state introdotte degli algoritmi ulteriori, e in
particolare:
+ gestione di abbreviazioni
+ gestione di una grammatica molto elementare (in pratica ho usato
solo la concordanza genere e numero di articolo-aggettivo-sostantivo)
+ gli ngrammi
La prima è una porcata, non commento oltre. ;)
La seconda sarebbe una cosa interessante se fosse possibile scrivere
una grammatica che vada bene per tute le stagioni, ma pur avendo
implementato un parses grammaticale assolutamente elementare, mi sono
accorto che più allungavo e complicavo la definizione della grammatica,
più peggioravo i risultati.
L'aproccio ha un senso per me sempre nel caso che l'utente sia abituato
a utilizzare 4-5 schemi di frasi tipo, (interrogativa classica, ...)
come un disabile può essere.
Gli ngrammi hanno per me un fulgido futuro, occorre però trovare un bel
modo di calcolarli (nel senso di ``contarli'') per assegnarne un peso.
Se ci pensate su 1000 parole ci sono 1000x1000 = 1M di ngrammi
possibili, la complessità aumenta enormemente e non ha senso tenere
traccia di 1/2 occorrenze.
Ho implementato gli ngrammi in manier statica (ovvero uno se li
definisce a manina, o utilizza un programma di calcolo esterno per
generare un file di ngrami da una serie di sue produzioni).
Qunidi passo a spiegare i file. Esiste un file di definizione della
lingua (.lang) che contiene riferimenti ad alcuni parametri della
lingua e del dizionario in uso, e una definizione spero non troppo
cervellotica delel tipologie gramamticali (articolo, ...) con alcune
loro caratteristiche.
Sono bit field perchè poi quando calcolo i risultati con favele posso
confrontare nua parla candidata con una possibile con un semplice or.
Segue la definizione dei flag aggiuntivi presenti eventualmente in
queste categorie (determinativo, ...) con maschere per definire limiti
(l'articolo non può essere infinito ;) e poi una definizione di regole
di espansione.
Attenzione che a me interessano solo e soltanto i suffissi, quindi nno
mi sono assolutamente radicalmente strafregato degli affissi in
generale, quindi dei prefissi. A me interessa indovinare una parola da
2-3 carateri inseriti, do per scontato di avere il prefisso...
[poi non è vero, se potessi condensare i prefissi potrei assegnare
meglio i pesi...]
Alal fine le righe autotag permettono di (tentare di) assegnare
categoria e flag a una parola nuoova.
I file .lex contengono il dizionario. In testa hanno delle statistiche
generali assolutamente inutili se avessi avuto volgia di scrivere una
funzioncina che si faceva i conti in fase di lettura da disco del file.
;)
Poi c'è un elenco di forme verbali, con relativi tipi/flag/indicazioni
di regolarità.
Il formato è semplicissimo, e con un po' di perl credo s possa trarne
qualsiasi cosa. Tutta la parte iniziale è fatta a manina, mentre
l'elenco dei verbi regolari (e nomi regolari) è stata presa da non
ricordo manco dove, ma ricontrollata a manina.
[ma sono un perito, abbiate misericordia]
I file .gram contengono la definizione della grammatica, assolutamente
lineare e senza ricorsioni/forme normali.
Il formato non è di difficile comprensione.
Il file .ngr contiene la lista degli ngrammi, i file .abbr la lista
delle abbreviazioni.
tutti questi file possono avere due informazioni aggiuntive (nella
riga) ovvero numero di volte che è stato utilizzato e timestamp di
ultimo utilizzo.
Non ho osato riprendere in mano il codice, snoo passati due anni e
sicuramente non ricordo assolutamente nulla... ;)))
Ad ogni modo spero di aver almeno chiarito a che cosa serve favele, per
me può essere esteso e migliorato, questo è indubio, ma nase e resta un
sistema per prevedere la parola in scrittura in quel dato istante,
quindi con un uso limitato e sicuramente non compatibile con una
correzione ortografica, che invece deve cercare parole similia quelle
digitate come ad esempio tuti i miei errori di ortografia in questa
email.
Detto questo... non ho nessun problema a rilassare la licenza a LGPL,
e sarei onorato di vedere questa cosa finire in qualcosa di serio come
openoffice.
Chiedo solo una piccola cosa: mi piacerebbe restasse una libreria a se,
qindi mi chiedo se valga la pena aprire un progetto su savannah.gnu.org
o cose simili, e chi possa esere interessato a lavorarci sopra.
Scusate della fretta di questa mail ma... di questi tempi va così. Se
non sono stato chiaro potete chiedere altre cose, vi leggo anche se
magari con un po' di ritardo. ;)
--
dott. Marco Gaiarin GNUPG Key ID: 240A3D66
Associazione ``La Nostra Famiglia'' http://www.sv.lnf.it/
Polo FVG - Via della Bontà, 7 - 33078 - San Vito al Tagliamento (PN)
gaio(at)sv.lnf.it tel +39-0434-842711 fax +39-0434-842797
NO al super tributo alla SIAE!
http://www.edisport.it/edisport/afdigitale/petizione.nsf/main?openframeset
Maggiori informazioni sulla lista
Dizionario