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


Capitolo 422.   Analisi sintattica e stilistica con Textchk

L'analisi sintattica di un testo è un problema ben più complicato della semplice verifica delle parole con un dizionario. Esistono però alcuni tipi di errori sintattici, o stilistici, che si possono identificare con l'aiuto di espressioni regolari (regular expression).

La lingua italiana consente spesso l'utilizzo di forme espressive differenti, per le quali dovrebbe esserci almeno uniformità all'interno di uno stesso documento. Per esempio, occorre decidere se si vuole scrivere: «una aula» oppure «un'aula», «ed anche» oppure «e anche»,...

In questo capitolo si vuole mostrare un programma Perl che può aiutare a definire delle regole rappresentate in forma di espressioni regolari, per segnalare degli errori sintattici o stilistici. Con questo programma è possibile indicare anche delle regole di eccezione e delle particolarità riferite a un solo documento. Il programma in questione è Textchk, (1) che è derivato dagli strumenti preparati originariamente per la composizione di questo documento (ALtools e Alml).

Textchk dovrebbe trovarsi assieme alla distribuzione di questa opera; tuttavia, il suo riferimento principale è <http://na.mirror.garr.it/mirrors/appuntilinux/software/>.

422.1   Principio di funzionamento

Textchk scandisce un file di partenza generando un altro file contenente le parti di testo che risulterebbero errate (oltre a un file diagnostico contenente la registrazione del procedimento di verifica). Prima di iniziare a leggere il file da esaminare, vengono caricati dei modelli che esprimono degli errori, espressi in forma di espressione regolare, seguiti eventualmente da dei modelli di eccezione. Infine, vengono caricate anche delle particolarità riferite al testo che si elabora, trattate in forma letterale e non più secondo il modello di un'espressione regolare.

Figura 422.1. Schema di funzionamento di Textchk.

Textchk

Gli errori che si possono ricercare attraverso delle espressioni regolari, riguardano la vicinanza di parole che hanno caratteristiche determinate, come l'uso o meno di articoli apostrofati. Sotto questo aspetto, diventa importante che, nel file di testo originale, ogni paragrafo si trovi su una sola riga, cioè non sia interrotto su più righe.

A fianco di questo problema, si aggiunge il fatto che il file sorgente che si vuole esaminare potrebbe contenere dei codici di controllo, come nel caso di TeX (o LaTeX) e di HTML. In tutte queste situazioni, prima di passare all'analisi vera e propria, occorre ripulire e riadattare il testo, in modo da avere a che fare con un file di testo puro, in cui ogni paragrafo si trovi su una sola riga. Al limite, può essere sufficiente che ogni periodo, cioè ogni frase completa che termina con un punto, si trovi su una sola riga.

422.1.1   Espressioni regolari

Textchk è scritto in Perl, pertanto le espressioni regolari che possono essere gestite sono quelle di questo linguaggio di programmazione.

La ricerca della corrispondenza con le espressioni regolari che esprimono un errore, viene fatta in modo da circoscrivere, se possibile, tre parole prima e dopo della zona dell'errore. Per questa ragione, non ha senso tentare di identificare l'inizio e la fine di una riga (con i simboli ^ e $), inoltre non è possibile utilizzare le parentesi tonde.

A titolo di esempio, si propone il problema della «d» eufonica, per la precisione il caso di «ad». Supponendo di volerla utilizzare solo quando la parola successiva inizia con la vocale «a», escludendo il caso in cui la parola continui con un'altra «d» (per esempio: «ad amare», ma non «ad adattare»), si possono usare le espressioni regolari seguenti per individuare gli errori.

\ba\s+a[^d]\w*\b
\bad\s+ad\w*\b
\bad\s+[^a]\w*\b

Per intendere meglio il significato di ciò che è scritto, la prima riga significa:

\b lo spazio vuoto prima della parola;
a la lettera «a»;
\s+ uno o più spazi orizzontali;
a[^d] la lettera «a» seguita immediatamente da qualunque cosa che sia diversa dalla lettera «d»;
\w* zero o più caratteri alfabetici;
\b lo spazio vuoto dopo la parola.

Nello stesso tempo, però, si può decidere di accettare un'eccezione: «ad esempio», che secondo quanto stabilito con l'ultima delle espressioni regolari appena mostrate, dovrebbe essere un errore. Si può usare quindi l'espressione regolare seguente, tra le eccezioni.

\bad\s+esempio\b

422.2   Configurazione

La configurazione di Textchk serve a definire gli errori sintattici che si ricercano. In generale è importante definire una configurazione specifica per ogni singolo progetto di documentazione, ma resta la possibilità di stabilire regole personali, legate all'utente, oltre che regole generali legate al sistema (per quanto questo possa avere un valore relativo).

La configurazione avviene attraverso un file di testo normale, in cui le righe bianche, quelle vuote e quelle che iniziano con il simbolo # vengono ignorate. Le altre righe sono dei record che possono avere una delle due forme seguenti:

DBL____regola_di_errore[____testo_esplicativo]
ERR____regola_di_errore[____testo_esplicativo]
EXC____regola_di_eccezione

Nel primo caso si identifica una parola che si ritiene possa essere stata scritta due volte, in modo erroneo; il secondo indica un modello di errore, mentre nel terzo si tratta di un'eccezione. I record che descrivono le regole di eccezione si riferiscono sempre all'ultima regola di errore (di tipo DBL o ERR) che sia stata incontrata fino a quel punto.

La forma di questi record è un po' strana, nel senso che la separazione dei campi avviene attraverso una sequenza di quattro trattini bassi (____). Ciò serve per evitare di creare problemi alla realizzazione delle espressioni regolari che descrivono gli errori e le eccezioni.

#
# d eufonica
# a|e|o prendono una «d» eufonica se sono seguite da una parola che
# inizia con la stessa vocale, a meno che ci sia subito dopo un'altra
# «d».
#
ERR____\ba\s+a[^d]\w*\b____a --> ad
EXC____\bda\s+a\s+a\b
#
ERR____\bad\s+ad\w*\b____ad --> a
#
ERR____\bad\s+[^aA]\w*\b____ad --> a
EXC____\bad\s+esempio\b
EXC____\bad\s+ora\b
#
ERR____\be\s+e[^d]\w*\b____e --> ed
ERR____\bed\s+[eE]d\w*\b____ed --> e
ERR____\bed\s+[^eèE]\w*\b____ed --> e
#
ERR____\bo\s+[oO][^d]\w*\b____o --> od
ERR____\bod\s+[oO]d\w*\b____od --> o
ERR____\bod\s+[^oO]\w*\b____od --> o

L'esempio mostra una serie di istruzioni con le quali si cerca di definire l'uso della «d» eufonica. Vale la pena di analizzare cosa succede di fronte a una situazione precisa. Si suppone di avere scritto un testo nel quale è stata inserita la frase seguente:

Purtroppo, fino ad ora il colore dell'auto non è stato scelto dal cliente.

Concentrando l'attenzione sui record di configurazione seguenti, si può simulare ciò che succede.

ERR____\bad\s+[^aA]\w*\b____ad --> a
EXC____\bad\s+esempio\b
EXC____\bad\s+ora\b

Per cominciare, viene individuato un errore in via preliminare in corrispondenza di «ad ora», perché la parola che segue «ad» non inizia con una lettera «a». Textchk preleva una stringa di tre parole prima e tre parole dopo questo errore: «Purtroppo, fino ad ora il colore dell'auto». In questo caso, le parole precedenti sono solo due, perché non è stato possibile ottenere di più.

Su questa stringa estratta viene condotto il controllo per le eccezioni successive; così, dal momento che si ottiene una corrispondenza (sempre con «ad ora»), l'errore si rivela infondato (in base ai presupposti stabiliti).

L'ultimo campo dei record che descrivono gli errori serve per indicare una spiegazione per ciò che viene identificato come un errore. Questa spiegazione viene mostrata da Textchk nel momento in cui l'errore relativo viene mostrato, secondo lo schema seguente:

testo_esplicativo
    tre_parole_precedenti>>errore<<tre_parole_successive

Come si vede, la corrispondenza con l'errore viene evidenziata dai delimitatori >> e <<.

422.2.1   Gerarchia della configurazione

Textchk è stato pensato originariamente per avere una configurazione specifica per ogni progetto di documentazione che ogni autore possa gestire. Tuttavia, è possibile definire anche una configurazione personale e una di sistema. Si tratta dei file seguenti:

./.textchk.rules contiene la configurazione corrente, che viene letta prima delle altre;
~/.textchk.rules contiene la configurazione personale, letta subito dopo quella corrente;
/etc/textchk.rules contiene la configurazione di sistema, che viene letta alla fine.

In generale non è opportuno stabilire una configurazione generale di sistema. Tuttavia, se c'è la necessità di annullare l'effetto di una regola di errore stabilita a livello generale, si può dichiarare la stessa regola nella configurazione personale o in quella corrente, facendola seguire immediatamente da un'eccezione identica. Per esempio, si può supporre di avere definito a livello di sistema la regola seguente, che richiede l'uso della «d» eufonica ogni volta che la parola seguente inizia con una vocale:

ERR____\b[aeo]\s+[aeiouAEIOU]\w*\b____a/e/o --> ad/ed/od

Per annullarne l'effetto completamente, basta aggiungere la stessa regola in qualità di eccezione, subito dopo:

#
# Regola di sistema che qui viene annullata.
#
ERR____\b[aeo]\s+[aeiouAEIOU]\w*\b____a/e/o --> ad/ed/od
EXC____\b[aeo]\s+[aeiouAEIOU]\w*\b

422.2.2   Casi particolari

Alle volte non conviene indicare troppe eccezioni, oppure non è materialmente possibile. Per esempio, si può immaginare il caso in cui si vuole mostrare veramente un modo sbagliato di scrivere per qualche ragione. Per queste situazioni viene in aiuto un file di configurazione aggiuntivo, che però può essere associato esclusivamente a un solo progetto di documentazione. Si tratta del file ./.textchk.special, in cui si possono inserire integralmente alcune stringhe che Textchk ha indicato precedentemente come errate.

Per questa parte della configurazione non c'è molto da fare: basta utilizzare un programma per la creazione e la modifica dei file di testo ricopiando ciò che serve dal file che viene generato da Textchk per registrare gli errori trovati. L'esempio seguente mostra un estratto di quello che potrebbe contenere questo file. Si osservi il fatto che si tratta di esempi di errori scritti così di proposito.

oppure «un'aula», «ed anche» oppure «e
vuole scrivere: «una aula» oppure «un'aula»,
ma non «ad adattare»), si possono

422.2.3   L'indicazione di parole doppie

Un errore frequente nella scrittura di un testo consiste nella ripetizione di una parola per due volte di seguito, mentre l'intenzione sarebbe quella di scriverla una volta sola. Per intercettare questo tipo di situazione si utilizza il record DBL. Nel campo dell'espressione che indica l'errore, si fa riferimento implicitamente a una parola intera. Infatti, nella comparazione reale, viene aggiunto il simbolo \b all'inizio e alla fine, a sottolineare che la parola deve essere completa. Si osservi l'esempio seguente:

#
# Parole doppie.
#
DBL____\w\w+____Due parole identiche
EXC____\bciao\s+ciao\b

L'intenzione è di individuare qualunque parola (\w+), composta almeno da due caratteri, che si ripete immediatamente. Viene posta una sola eccezione alla coppia «ciao ciao».

422.3   Come si usa

Textchk si compone di un eseguibile unico, textchk, che si utilizza secondo lo schema sintattico seguente:

textchk --input-type=tipo_di_file file_da_analizzare [errori_risultanti [file_diagnostico]]
textchk --help
textchk --version

Oltre alle opzioni standard, --help e --version, l'opzione --input-type serve a stabilire il tipo di file che si fornisce in ingresso, in modo che Textchk sappia come fare per gestirlo opportunamente, attraverso un argomento:

Opzione Descrizione
--input-type=standard
si riferisce a un file di testo in cui ogni capoverso occupa esattamente una riga e non richiede altri adattamenti;
--input-type=man
si riferisce a un file Troff delle pagine di manuale, che come tale richiede una rielaborazione in modo da ottenere un file di testo, simulando uno schermo di ampiezza orizzontale smisurata;
--input-type=texinfo
--input-type=texi
si riferisce a un sorgente Texinfo;
--input-type=html
si riferisce a un file HTML che può essere trasformato in un file di testo attraverso Lynx.

Il secondo argomento della riga di comando è il nome del file da analizzare, che deve corrispondere al tipo indicato precedentemente. Il terzo argomento serve a definire il nome del file che viene creato per annotare le stringhe errate che vengono individuate; se non viene fornito espressamente il suo nome, viene creato un file con lo stesso nome di quello in ingresso, con l'aggiunta dell'estensione .err (file_da_analizzare.err). Il quarto argomento serve a specificare il nome del file diagnostico, nel quale vengono registrate tutte le fasi di individuazione di errori e di eccezioni. Anche l'indicazione di questo file può essere omessa; in tal caso viene usato il nome del file degli errori con l'aggiunta dell'estensione .diag, oppure il file in ingresso con la stessa aggiunta (errori_risultanti.diag oppure file_da_analizzare.diag).

Per esempio, il comando seguente genera i file bash.1.err e bash.1.diag:

textchk --input-type=man bash.1[Invio]

422.3.1   Come vengono mostrati gli errori e i dati diagnostici

Durante il suo lavoro, Textchk mostra sullo schermo ciò che trova, delimitando gli errori tra i delimitatori >> e <<. Per esempio, in base alle regole seguenti,

ERR____\bad\s+[^aA]\w*\b____ad --> a
EXC____\bad\s+esempio\b
EXC____\bad\s+ora\b

si possono ottenere segnalazioni come queste:

ad --> a
    Pertanto, andando >>ad elevare<< il proprio livello
ad --> a
    contrario, riuscendo così >>ad esplorare<< il proprio mondo

Nel file che elenca gli errori si trovano le righe seguenti:

Pertanto, andando ad elevare il proprio livello
contrario, riuscendo così ad esplorare il proprio mondo

Inoltre, nel file diagnostico si trova l'intero procedimento:

??? Pertanto, andando >>ad elevare<< il proprio livello
ERR \bad\s+[^aA]\w*\b
!!! Pertanto, andando >>ad elevare<< il proprio livello

??? contrario, riuscendo così >>ad esplorare<< il proprio mondo
ERR \bad\s+[^aA]\w*\b
!!! contrario, riuscendo così >>ad esplorare<< il proprio mondo

??? Il colore rosso, >>ad esempio<<, rappresenta la propria
ERR \bad\s+[^aA]\w*\b
EXC \bad\s+esempio\b

??? Il colore rosso, >>ad esempio<<, rappresenta la propria
ERR \bad\s+[^aA]\w*\b
EXC \bad\s+esempio\b

??? Pertanto, l'espressione «>>ad emettere<<» non è corretta.
ERR \bad\s+[^aA]\w*\b
SPC Pertanto, l'espressione «ad emettere» non è corretta.

Il file diagnostico mostra informazioni diverse, distinte attraverso una sigla iniziale. Le righe che iniziano con ??? indicano il problema trovato; le righe che iniziano con ERR rappresentano la regola di errore in base alla quale viene evidenziato il problema; le righe che iniziano con EXC indicano una regola di eccezione per la quale il problema viene superato; le righe che iniziano con SPC rappresentano un caso particolare (speciale), per cui la frase in questione viene accettata così come si trova. Infine, le righe che iniziano con !!! rappresentano la conferma finale che si deve trattare di un errore.

422.4   Come si installa

Textchk si compone di un solo programma Perl: textchk. Questo file può essere collocato ovunque sia ritenuto più conveniente, preferendo evidentemente una directory elencata all'interno della variabile di ambiente PATH.

Trattandosi di un programma Perl, deve essere disponibile l'interprete relativo. Attualmente si prevede che questo corrisponda esattamente all'eseguibile /usr/bin/perl. Se il proprio sistema non è organizzato in questo modo, basta modificare la prima parte del programma:

#!/usr/bin/perl
...

Dopo la soluzione di questo problema, c'è solo bisogno di predisporre un file di regole, ./.textchk.rules, poi, mano a mano che il lavoro procede, può essere conveniente predisporre anche il file ./.textchk.special.

422.4.1   Gettext

I messaggi che può mostrare Textchk possono essere tradotti, dal momento che viene usato il modulo Perl-gettext. Nel pacchetto del sorgente è presente un file di messaggi per la lingua italiana, che però deve essere compilato e installato:

msgfmt -o textchk.mo it.po[Invio]

In questo modo, si genera il file textchk.mo, che probabilmente va collocato nella directory /usr/share/locale/it/LC_MESSAGES/.

422.4.2   Dipendenze

Per funzionare, Textchk richiede l'interprete Perl e la presenza di un modulo speciale: Perl-gettext. Inoltre, per poter gestire correttamente i diversi tipi di file per cui è stato predisposto, richiede in particolare Groff, Lynx e Texinfo.

422.5   Riferimenti

Appunti di informatica libera 2007.02 --- Copyright © 2000-2007 Daniele Giacomini -- <daniele (ad) swlibero·org>


1) Textchk   GNU GPL


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

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

Valid ISO-HTML!

CSS validator!