[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [volume] [parte]


Capitolo 430.   Analisi lessicale

Gli errori che si possono fare scrivendo un testo sono di vario tipo, ma 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, come per esempio il nome o il cognome di una persona, un indirizzo o 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.

430.1   Ispell

Ispell (1) è 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.

430.1.1   Dizionari

Generalmente, il pacchetto di distribuzione di Ispell contiene un dizionario predefinito (di solito per la lingua inglese). Dovrebbe trattarsi del file /usr/lib/ispell/default.hash (che comunque di solito è un collegamento simbolico a un altro file). 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, attraverso la compilazione con buildhash, ogni volta che si cambia piattaforma.

Di norma, le distribuzioni GNU, a fianco di Ispell, mettono a disposizione una serie di pacchetti già pronti con i dizionari per le lingue principali. Eventualmente, si può consultare <http://members.xoom.virgilio.it/trasforma/ispell/>, dove è possibile prelevare i file sorgenti di un dizionario italiano.

Il dizionario italiano, in forma sorgente, si compone di due file sorgenti: italian.aff e italian.words. 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 italian.words italian.aff italian.hash[Invio]

Si ottiene il file italian.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: italian.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 italian documento.txt[Invio]

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_default (nella directory personale), a meno di specificare un nome diverso con le opzioni.

Si osservi che in aggiunta ai file personali ci possono essere dei file più specifici, legati alla directory corrente: ./.ispell_linguaggio.

430.1.2   Avvio e opzioni fondamentali

Il modello seguente 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 [opzioni] file_da_analizzare

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

Opzione Descrizione
-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, in quanto 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 composizione e possibilmente anche alcune indicazioni che sono solo funzionali a TeX, dal momento che non riguardano il 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 composizione.
La possibilità di distinguere i codici di composizione di TeX, *roff, o altro, dipende anche dal file affix del dizionario utilizzato.

430.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, quindi Ispell permette di modificare il contenuto del file originale, in base alle scelte dell'utente.

Figura 430.2. Funzionamento interattivo di Ispell.

    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

La figura 430.2 mostra il caso di un file, denominato lettera, che contiene una frase normalissima, in cui la parola «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 menù riepilogativo degli altri comandi a disposizione; comandi che si richiamano prevalentemente con la semplice pressione di tasti o combinazioni di tasti mnemonici.

Comando Descrizione
[Spazio] Fa in modo che Ispell accetti la parola temporaneamente. Se successivamente Ispell ne trova ancora, queste vengono segnalate 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 viene ritrovato ancora lo stesso errore, Ispell continua 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, senza distinguere tra maiuscole e 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.

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

Opzione Descrizione
-M
Richiede espressamente la visualizzazione del menù riassuntivo dei comandi interattivi. Di solito, tale menù appare in modo predefinito, a meno di avere compilato Ispell con opzioni particolari.
-N
Fa in modo che il menù riepilogativo dei comandi non venga visualizzato.

Segue la descrizione di alcuni comandi.

430.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, generando poi un dizionario personale con tutte queste eccezioni. Si procede nel modo seguente:

ispell -d italian -l < romanzo > mio_dizionario[Invio]

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

sort -f < mio_dizionario > dizionario1[Invio]

In questo modo si riordina l'elenco di parole ottenuto, generando il file ./dizionario1, dove 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 italian -l italian.aff dizionario1 > dizionario2[Invio]

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

In alternativa, si può anche tentare di dare in pasto a Ispell il file ottenuto dopo l'ordinamento, senza filtrarlo attraverso munchlist; lasciando che sia Ispell stesso a eliminare i doppioni.

430.1.5   Programmi di servizio 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).

Segue la descrizione di alcuni esempi.

430.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 è ~/.ispell_italian. 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, ma il file è ancora incompleto (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.(4)

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[Invio]

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 composizione 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[Invio]

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[Invio]

munchlist -l minimo.aff -s minimo.hash elenco1 > dizionario[Invio]

Dopo la riduzione si ottiene finalmente il dizionario personale specifico del documento; successivamente si possono 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[Invio]

430.2   Spell

GNU Spell(5) riproduce il funzionamento di un programma omonimo, noto tradizionalmente nei sistemi Unix, avvalendosi a sua volta di Ispell. Ciò che manca al programma Spell tradizionale, rispetto a Ispell, è la possibilità di modificare interattivamente il file indicato per l'analisi ortografica, ma soprattutto, manca la possibilità di riconoscere i caratteri oltre al punto di codifica U+007F, ovvero oltre la codifica ASCII pura e semplice.

spell [opzioni] file...

GNU Spell, avvalendosi di Ispell, utilizza il dizionario predefinito di questo. Eventualmente, con l'opzione -d è possibile indicare un dizionario personale.

Un esempio molto semplice dimostra il significato di questo programma:

spell lettera[Invio]

Evidentemente, il file lettera contiene un testo da controllare. Supponendo che il dizionario predefinito sia quello della lingua inglese, ecco cosa si potrebbe ottenere da un testo in italiano:

stai
molto
che
ci
si
sente
cosa
fai
di
bello
Daniele

In pratica, secondo il programma, questo elenco è quello delle parole «errate», anche se evidentemente, in questo caso, non è così.

Spell è evidentemente un programma superato sotto tutti i punti di vista, che rimane per consentire a vecchi script di continuare a funzionare. Eventualmente per conoscere un po' meglio l'uso di questo programma, si può consultare la pagina di manuale spell(1), oppure, nel caso specifico di GNU Spell, la documentazione Info: info spell.

430.3   Aspell

Aspell(6) è un programma funzionalmente simile a Ispell, che gestisce dei dizionari propri ed è in grado di utilizzare quelli appropriati alla configurazione locale:

aspell [opzioni] comando

I dizionari di Aspell dovrebbero trovarsi nella directory /usr/lib/aspell/, assieme a dei file che gli consentono di riconoscere le codifiche più comuni dei caratteri. Vengono mostrati solo alcuni esempi di funzionamento del programma, senza descrivere le opzioni; per questo si può consultare la pagina di manuale aspell(1), oppure la documentazione Info: info aspell.

430.4   Myspell e Hunspell

Myspell è un componente di OpenOffice 1.* e di altri programmi, per la gestione dei dizionari ortografici. Hunspell(7) è un componente simile, nato per OpenOffice 2.*, con la capacità di gestire meglio il riconoscimento delle parole composte.

In generale, comunque, si tratta sempre di lavori derivati o comunque ispirati al funzionamento di Ispell. In particolare, i dizionari realizzati per Myspell, sono utilizzabili anche da Hunspell.

Generalmente è possibile usare Hunspell anche attraverso un programma frontale simile a Ispell. Supponendo che i dizionari Myspell siano installati a partire da /usr/share/myspell/dicts/, si potrebbe usare Hunspell come si vede nell'esempio seguente:

hunspell -d /usr/share/myspell/dicts/it-IT lettera[Invio]

Così facendo, il programma utilizza il dizionario composto dai file /usr/share/myspell/dicts/it-IT.aff e /usr/share/myspell/dicts/it-IT.dic, per esaminare il file lettera.

430.5   Riferimenti


1) Ispell   software libero con licenza speciale

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.

4) In pratica, munchlist elimina queste parole ritenute estranee. Se si dispone di un elaboratore ben equipaggiato, si può dare in pasto a Ispell il file ottenuto dopo il riordino; lasciando a Ispell stesso il compito di eliminare i doppioni.

5) GNU Spell   GNU GPL

6) Aspell   GNU LGPL

7) Hunspell   GNU GPL, o GNU LGPL, o MPL


Appunti di informatica libera 2008 --- Copyright © 2000-2008 Daniele Giacomini -- <appunti2 (ad) gmail·com>


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome analisi_lessicale.htm

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico]

Valid ISO-HTML!

CSS validator!