[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]


146. Analisi lessicale

Gli errori che si possono fare scrivendo un testo sono di vario tipo, e quelli puramente lessicali, ovvero ciò che potrebbe essere classificato come errore di battitura, rappresentano i meno importanti. Tuttavia, si tratta pur sempre di una buona percentuale nell'insieme globale di errori che può contenere un testo.

Un programma banale che sia in grado di mostrare le parole che risultano semplicemente sconosciute, è già un buon aiuto verso l'obiettivo dello scrivere in modo corretto.

Un programma di analisi lessicale è utile quando si può gestire un dizionario personale, perché non si possono escludere le eccezioni da un testo: il nome o il cognome di una persona, un indirizzo, una sigla particolare,... In presenza di documenti di grandi dimensioni, diventa necessario gestire un dizionario specifico per ognuno di questi, in modo da non interferire con l'analisi di altri in cui certi termini, ammissibili da una parte, non possono esistere dall'altra.

146.1 Ispell

Ispell è un programma di scansione lessicale che permette la realizzazione di dizionari contenenti anche indicazioni sulle possibili aggregazioni di parole (si pensi alla lingua tedesca in cui le parole sono generate spesso dall'unione di altre).

Lo studio di questa caratteristica di Ispell riguarda chi vuole realizzare un dizionario standard per un linguaggio particolare: generico o specifico di un certo settore. Qui si intende mostrare un uso semplificato di questo programma, in cui si utilizzano dizionari standard e si generano i propri dizionari personali specifici per ciò che si fa.

146.1.1 Dizionari

Generalmente, il pacchetto di distribuzione di Ispell contiene un dizionario standard per la lingua inglese. Dovrebbe trattarsi del file `/usr/lib/ispell/english.hash'. Nella stessa directory vanno collocati altri file per altre lingue, o per linguaggi specifici. Questi file, terminanti con l'estensione `.hash', sono ottenuti a partire da una coppia di file di testo, e devono essere compilati attraverso `buildhash', ogni volta che si cambia piattaforma.

È disponibile un pacchetto contenente un dizionario generico per la lingua italiana. Lo si dovrebbe trovare presso ftp://ftp.cnr.it/pub/Linux-local/apps/ispell/ e si tratta di un file denominato secondo il modello `italiano-<versione>.tgz'.

Il dizionario italiano si compone di due file sorgenti: `italiano.aff' e `italiano.sml'. Il primo dei due contiene la tabella affix, che in pratica rappresenta una serie di regole sull'insieme dei caratteri ammissibili e sulla possibile unione di parti di parole, mentre il secondo è l'elenco di parole vero e proprio. Queste parole elencate, contengono a volte dei riferimenti aggiuntivi indicati dopo una barra obliqua (`/') che hanno valore in base alle definizioni della tabella affix. L'approfondimento sulla sintassi del file affix è utile solo se si vuole realizzare un dizionario hash specifico, mentre l'utilizzatore normale può ignorare questo problema. La compilazione dei file sorgenti in modo da ottenere un dizionario hash si ottiene con il comando seguente:

buildhash italiano.sml italiano.aff italiano.hash

Si otterrà il file `italiano.hash', da collocare nella directory `/usr/lib/ispell/'. Se si intende utilizzare sistematicamente questo dizionario, si può predisporre la variabile di ambiente `DICTIONARY', assegnandovi il nome del file: `italiano.hash'. In alternativa, si può usare `ispell' con l'opzione `-d', come nell'esempio seguente (l'estensione `.hash' è predefinita e può essere omessa).

ispell -d italiano documento.txt

I dizionari personali sono invece una cosa diversa: si tratta di un elenco di termini, scritto con le stesse modalità di un sorgente, senza un file affix a fianco (o meglio, utilizzando quello del dizionario hash a cui si fa riferimento). Normalmente, tali file personali sono aggiornati da Ispell, quando questo viene usato in modo interattivo. Il nome predefinito del dizionario personale è `~/.ispell_<linguaggio>'. Per esempio, se si utilizza il dizionario standard predefinito, viene generato e utilizzato il file `~/.ispell_english' (nella directory personale), a meno di specificare un nome diverso con le opzioni.

146.1.2 Avvio e opzioni fondamentali

ispell [<opzioni>] <file-da-analizzare>

Quella che si vede rappresenta una semplificazione estrema della sintassi dell'eseguibile `ispell', però, prima di apprendere il funzionamento delle particolarità di questo programma, è meglio comprendere le sue possibilità fondamentali.

Ispell può funzionare in modo interattivo, oppure no. In teoria, è possibile anche realizzare un programma che sfrutti le funzionalità di Ispell attraverso una pipeline; in pratica, si tratta dell'utilizzo meno importante che si può fare di Ispell.

Alcune opzioni

-d <dizionario-hash>

Permette di specificare un file dizionario differente da quello predefinito (che di solito è `english.hash'). Il nome del file viene indicato generalmente senza estensione, e senza percorso, facendo implicitamente riferimento alla directory `/usr/lib/ispell/', e a file con estensione `.hash'.

-p <dizionario-personale>

Permette di specificare un dizionario personale differente da quello predefinito (che di solito è `~/.ispell_...').

-W <n-caratteri>

Specifica la lunghezza delle parole che non devono essere prese in considerazione. In pratica, da quel numero di caratteri in giù, si considerano tutte valide.

-x

Evita la creazione di una copia di sicurezza. Senza indicare questa opzione, dovrebbe essere salvata una copia del file originale aggiungendo al suo nome l'estensione `.bak'.

-b

Si tratta dell'opzione opposta a `-x', e permette di forzare la richiesta di creazione di una copia di sicurezza.

-t

Fa in modo che il testo da analizzare sia considerato un sorgente TeX, o LaTeX, per il quale si devono ignorare i codici di formattazione, e possibilmente anche alcune indicazioni che sono solo funzionali a TeX, e non al contenuto del testo. Questa dovrebbe essere la modalità predefinita di funzionamento.

In generale, questa modalità va bene anche per il testo puro e semplice, purché non ci siano barre oblique inverse che possano essere confuse con comandi di TeX.

-n

Fa in modo che il testo da analizzare sia considerato un sorgente Nroff o Troff, per il quale si devono ignorare i codici di formattazione. *1*

146.1.3 Funzionamento interattivo

Il funzionamento normale di Ispell è interattivo. Generalmente viene fatta una copia di sicurezza del file analizzato, con un nome che termina con l'aggiunta dell'estensione `.bak', e poi Ispell permette di modificare il contenuto del file originale, in base alle scelte dell'utente.

    stai              File: lettera


Ciao come stai?

00: stab     09: st-AI
01: stag
02: staid
03: stain
04: stair
05: Stan
06: star
07: stay
08: st AI

[SP] <number> R)epl A)ccept I)nsert L)ookup U)ncap Q)uit e(X)it or ? for help

Figura 146.1: Funzionamento interattivo di Ispell.

La figura 146.1 mostra il caso di un file, denominato `lettera', che contiene una frase normalissima, in cui la parla «stai» non viene riconosciuta. In effetti, si suppone di avere utilizzato il dizionario hash predefinito, ovvero quello inglese.

La parola `stai' viene evidenziata se le caratteristiche del terminale lo consentono; in ogni caso, viene indicata a parte, all'inizio (come si vede dall'esempio). Se possibile, Ispell elenca una serie di alternative possibili, in base alle affinità che può avere il termine sconosciuto con altre parole contenute nel dizionario. Questo elenco è numerato, in modo da permetterne la selezione. Nella parte bassa dello schermo appare un menu riepilogativo degli altri comandi a disposizione; comandi che si richiamano prevalentemente con la semplice pressione di tasti o combinazioni di tasti mnemonici.

Alcuni comandi

[Spazio]

Fa in modo che Ispell accetti la parola temporaneamente. Se ne troverà ancora, Ispell le segnalerà nuovamente.

[R]   |   [r]

Richiede la sostituzione della parola errata con un'altra che deve essere inserita subito dopo. Se anche la nuova parola non sembra valida, questa viene segnalata ugualmente da Ispell. La sostituzione riguarda solo quell'occorrenza particolare; se verrà ritrovato ancora lo stesso errore, Ispell continuerà a segnalarlo.

[A]   |   [a]

Fa sì che Ispell ignori la parola per tutto il resto del documento.

[I]   |   [i]

Fa sì che Ispell accetti la parola e la inserisca nel dizionario personale, esattamente com'è, rispettando maiuscole e minuscole.

[U]   |   [u]

Fa sì che Ispell accetti la parola e la inserisca nel dizionario personale, perdendo le informazioni sulle maiuscole e sulle minuscole.

[0]   |   [1]   |   ...   |   [0][0]   |   [0][1]   |   ...

La selezione di un numero fa riferimento alle voci proposte come parole alternative a quella errata. Con questa selezione di intende ottenere la sostituzione delle parole. È importante osservare che, se l'elenco supera le nove unità, la selezione avviene con due cifre numeriche. L'esempio che appare nella figura mostra questo caso: per indicare la parola `stag', occorre la sequenza [0][1].

[X]   |   [x]

Conclude il lavoro completando la scrittura del file e ignorando altri errori eventuali. Chiude anche il file del dizionario personale, mantenendo le voci aggiunte fino a quel punto.

[Q]   |   [q]

Termina immediatamente, lasciando inalterato il file, senza conservare i termini eventualmente annotati per l'aggiunta nel dizionario personale.

[Ctrl-l]   |   [Ctrl-L]

Ripulisce lo schermo.

Alcune opzioni

Per quanto riguarda il funzionamento interattivo di Ispell, sono importanti due opzioni.

-M

Richiede espressamente la visualizzazione del menu riassuntivo dei comandi interattivi. Di solito, tale menu appare in modo predefinito, a meno di avere compilato Ispell con opzioni particolari.

-N

Fa in modo che il menu riepilogativo dei comandi non venga visualizzato.

Alcuni esempi

ispell -d italiano lettera

Analizza il file `lettera' utilizzando il dizionario hash `italiano', ovvero, il file `/usr/lib/ispell/italiano.hash'.

ispell -d italiano -p mio lettera

Come nell'esempio precedente, ma in questo caso si utilizza il dizionario personale rappresentato dal file `./mio'. Nell'esempio precedente, si faceva riferimento al dizionario personale predefinito: `~/.ispell_italiano'.

146.1.4 Funzionamento non interattivo

Quando Ispell funziona in modo non interattivo, si limita a generare un elenco di termini, anche ripetuti, che risultano sconosciuti in base al dizionario. Ispell può anche essere utilizzato attraverso un altro programma, quando si indica l'opzione `-a', ma si tratta di un modo un po' complicato, che qui non viene descritto.

Per ottenere l'elenco dei termini sconosciuti, si utilizza l'opzione `-l'. Per esempio, questa possibilità di Ispell può essere sfruttata per produrre rapidamente un dizionario personale.

Se si dispone di un testo della cui esattezza si è certi, si può ottenere da Ispell l'elenco dei termini da lui sconosciuti, e generare un dizionario personale con tutte queste eccezioni. Si procede nel modo seguente:

ispell -d italiano -l < romanzo > mio_dizionario

In questo modo, tutti i termini contenuti nel file `./romanzo' che non risultano dal dizionario hash `italiano', vengono emessi attraverso lo standard output, e diretti nel file `./mio_dizionario'.

sort -f < mio_dizionario > dizionario1

In questo modo si riordina l'elenco di parole ottenuto, generando il file `./dizionario1', e l'opzione `-f' serve a non distinguere tra lettere minuscole e maiuscole, anche se restano i doppioni. Con questo elenco si vuole generare un dizionario personale, eliminando questi doppioni ed eventualmente generando altre semplificazioni.

munchlist -s italiano -l italiano.aff dizionario1 > dizionario2

In questo modo, si ottiene il compattamento del file `./dizionario1', in base a quanto già contenuto del dizionario hash `italiano' e secondo le regole del file affix `./italiano.aff', generando il file `./dizionario2', che finalmente può essere utilizzato come dizionario personale.

146.1.5 Programmi di utilità di contorno a Ispell

Ispell si compone di diversi file binari. Il più importante è `ispell', come si è visto, ma altri sono necessari per la gestione dei file di dizionario. Si è già accennato a `buildhash' e a `munchlist', il cui utilizzo è il caso di riepilogare.

buildhash <dizionario-sorgente> <file-affix> <dizionario-hash>

munchlist [-l <file-affix>] [-s <dizionario-hash>] [<elenco-da-ridurre>] > <elenco-ridotto>

Quelle mostrate sono le sintassi semplificate di questi due programmi. Di più può essere appreso dalla lettura di ispell(1).

Alcuni esempi

munchlist mio_dizionario > dizionario

Utilizza il dizionario hash e il file affix standard per ridurre l'elenco contenuto nel file `./mio_dizionario', generando il file `./dizionario'.

munchlist -s italiano -l ./italiano.aff mio_dizionario > dizionario

Utilizza il dizionario hash `italiano' (`/usr/lib/ispell/italiano.hash'), e il file affix `./italiano.aff' per ridurre l'elenco contenuto nel file `./mio_dizionario', generando il file `./dizionario'.

buildhash italiano.sml italiano.aff italiano.hash

Genera il dizionario hash `./italiano.hash', a partire dall'elenco `./italiano.sml' e dal file affix `./italian.aff'.

146.1.6 Gestione dei dizionari personali

L'utilizzo occasionale di Ispell richiede la presenza di un dizionario hash e probabilmente di uno personale predefinito, che quasi sicuramente sarà `~/.ispell_italiano'. Ma la correzione ortografica basata esclusivamente su un dizionario è tanto più efficace quanto minore è il numero delle parole previste, ovvero, quanto più specifico è il dizionario utilizzato.

Di fronte alla realizzazione di un documento di un certo impegno, o di una serie di documenti che trattano dello stesso genere di cose, potrebbe essere conveniente utilizzare un dizionario personale specifico per quel progetto, eventualmente partendo da un dizionario hash praticamente vuoto. *2*

Per realizzare un dizionario «vuoto», adatto a qualunque linguaggio che utilizzi la codifica ISO 8859-1, si potrebbe partire dal file affix che contiene solo le righe seguenti, il cui unico scopo è quello di ammettere l'uso di tutte le lettere accentate e speciali. *3*

# minimo.aff
# Accetta qualunque carattere accentato e speciale di ISO 8859-1

wordchars	[a-z]	[A-Z]
wordchars	[à-\376]	[À-\336]
wordchars	[\337]
wordchars	[\377]

prefixes

suffixes

Le parole chiave `prefixes' e `suffixes' sono obbligatorie, e comunque il file non è completo (viene segnalato dai programmi come `buildhash' e `munchlist'), anche se funziona ugualmente per lo scopo che ci si prefigge qui.

Volendo esagerare, se le cifre numeriche possono avere un ruolo nella composizione delle parole che si vogliono controllare, si può aggiungere anche la riga seguente, tenendo conto che però poi `munchlist' non funziona tanto bene.

wordchars	[0-9]

A fianco di questo si deve creare un elenco di parole che ne contenga almeno una, come nell'esempio seguente:

Linux

Si suppone che il file affix sia stato nominato `minimo.aff' e che l'elenco sia `minimo.sml'. Per creare il file hash, si procede come è già stato presentato più volte.

buildhash minimo.sml minimo.aff minimo.hash

Pur con una segnalazione di errore, dovuta all'estrema semplicità del file affix, si ottiene il file `minimo.hash' nella directory corrente. Questo file hash può essere usato solo per testi normali, senza codici di formattazione di alcun tipo, dal momento che il file affix mostrato non è stato predisposto per questo.

Se si dispone di un documento ritenuto sicuro, si può generare il dizionario personale relativo.

ispell -d ./minimo.hash -l < documento.txt > elenco

In questo modo si ottiene l'elenco delle parole usate nel file `documento.txt', che sono praticamente tutte sconosciute. Questo elenco deve essere riordinato e ridotto.

sort -f < elenco > elenco1

munchlist -l minimo.aff -s minimo.hash elenco1 > dizionario

Dopo la riduzione si ottiene finalmente il dizionario personale specifico del documento, e successivamente si potranno eseguire le verifiche sullo stesso documento di origine (a seguito di aggiunte o di modifiche), con il comando seguente:

ispell -d ./minimo.hash -p ./dizionario documento.txt

---------------------------

Appunti Linux 2000.04.12 --- Copyright © 1997-2000 Daniele Giacomini --  daniele @ pluto.linux.it


1.) La possibilità di distinguere i codici di formattazione di TeX, *roff, o altro, dipende anche dal file affix del dizionario utilizzato.

2.) Quando si ha a che fare con documentazione tecnica, in cui l'uso di termini in inglese è frequente, si potrebbe addirittura valutare la possibilità di basare l'analisi sul dizionario standard (`english.hash'), affiancando il dizionario personale specifico per il documento, solo che in tal caso si avrebbero difficoltà con le lettere accentate, dal momento che queste non sono previste nel file affix inglese.

3.) Le lettere `ÿ' e `ß', corrispondenti ai codici `\377' e `\337', sono minuscole e non hanno un equivalente maiuscolo nella codifica ISO 8859-1.


[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]