|
||||||
| [IT] Riconoscimento di testo con automi: teoria ed esempio in C | ||||||
|
Riconoscimento di testo con automi: teoria ed esempio in C Cos'e'un Automa? Come si puo' intuire dal nome, e' un qualcosa che ci permette di automatizzare un procedimento. Nel caso di questo documento, si parlera' di automi a stati finiti per il riconoscimento di testi, senza passare per la definizione di grammatica e linguaggio. Non e' intenzione di questo documento approfondire troppo l'argomento del riconoscimento dei testi. Il concetto di automa e' molto potente e facilmente
implementabile, almeno ad un livello senza particolari ottimizzazioni.
Ad esempio, vediamo un caso pratico come l'accensione di una autovettura. Alcuni stati che si possono individuare sono:
Da uno stato all'altro e' possibile passare compiendo un'azione. Ad esempio, per passare dallo stato (2) allo stato (3), si puo' compiere l'azione di girare la chiave di avviamento. Tornando all'automa per il riconoscimento del testo, e' facile vedere a questo punto come si possa procedere alla scansione di una stringa: anticipando un po' il discorso, abbiamo gli stati formati dal carattere letto e dalla posizione raggiunta nella lettura del testo; le azioni possibili saranno due, ovvero quelle indicate in precedenza. Formalmente, un automa a stati finiti e' una quintupla (insieme ordinato di 5 elementi) del tipo A=(Alfabeto, Stati, Funzione di transizione, Stato iniziale, Stati finali)L'alfabeto e' un insieme di simboli possibili (nel nostro caso un set di caratteri), cioe' tutti i simboli che si possono incontrare nella stringa di ingresso (input). Gli stati, in accordo con quanto gia' spiegato, sono un insieme di simboli (S1, S2, S3, ecc.) che identificano la situazione in cui si e' arrivati durante la lettura del testo: hanno informazione della posizione in cui si e' arrivati a leggere e quindi di tutta la storia passata per arrivare allo stato stesso. La funzione di transizione, nel riconoscimento del testo, e' una funzione che associa ad ogni stato "Si" un altro stato "Sj" a seconda del carattere letto alla posizione associata ad "Si". Ad esempio, se "F" e' la funzione, potrebbe esserci una regola del tipo In pratica, la funzione di transizione identifica le azioni da compiere per passare da uno stato ad un altro.F(S1,"d")=S5 Lo
stato iniziale
e' lo stato da cui si parte, cioe' la condizione iniziale: ogni automa
prevede uno stato iniziale.
Gli stati finali sono un insieme di stati dal significato particolare. Quando l'automa raggiunge un stato finale durante la propria elaborazione, significa che il riconoscimento e' avvenuto con successo. Che accade se l'automa termina la lettura del testo e si trova in uno stato che non e' finale? In una situazione del genere, l'automa termina la propria esecuzione con una condizione di errore (che puo' essere un valore booleano falso in una implementazione software). Riassumendo, un automa a stati finiti, per il riconoscimento di un testo, legge un carattere alla volta, passando da uno stato ad un altro nel modo specificato dalla funzione di transizione. Al termine della scansione, si trovera' in uno stato finale (successo) o in un altro stato (insuccesso). Per implementare via software un automa, e' bene
costruirlo prima graficamente. Nella figura
A viene mostrato un automa per il riconoscimento
di tutte le stringhe che contengono la coppia di lettere "ci" (es. "facciamo",
"facile", "bacino", "fucina").
Una volta pronto lo schema grafico, la realizzazione software e' immediata. Verra' qui usato il C ("gcc" di Linux). Consideriamo due
funzioni C: Transizione
ed Automa.
La prima si occupa dell'indicazione del prossimo stato, dipendentemente
dal carattere e dallo stato ricevuti in ingresso: restituisce un numero
intero positivo simboleggiante lo stato a cui passare (es. 0=S0, 1=S1,
ecc.). La seconda funzione, "Automa", e' l'implementazione dell'automa:
restituisce "0" in caso di successo, "-1" in caso di insuccesso.
La funzione e' semplicissima: scandisce tutto il
testo chiamando la funzione Transizione per passare da un testo ad un altro.
Alla fine controlla se lo stato raggiunto e' uno stato finale e restituisce
il risultato opportuno.
Vediamo quindi la funzione "Transizione":
La struttura della funzione "Transizione" e' di comprensione
immediata. Ovviamente, invece di usare ogni volta tutti gli stati possibili
(0,1,2,...) e tutti i caratteri possibili (a,b,c,...), si terra' conto
solo di quelli effettivamente impiegati nello schema grafico. Un'altra
osservazione da fare e' che, in caso di errore (stato o carattere non previsti
dallo schema), viene restituito uno stato di errore (simboleggiato dall'intero
"-1").
Ecco il codice della funzione "Transizione" nel caso dell'esempio mostrato nelle figure precedenti (la funziona "Automa" non cambia):
L'automa puo' essere lanciato nel seguente modo:
|
||||||
(c) 1999-2006
|