# Codifica dei testi

Per codifica del testo s'intende la rappresentazione digitale di un testo.
I testi sono strutture molto complesse, contenenti informazioni articolate su più livelli: dalle sequenze di caratteri che si combinano per formare le parole a strutture linguistiche astratte che legano elementi al di là del contesto della singola frase. I computer non possiedono quelle conoscenze e competenze che ci permettono di accedere con facilità ed immediatezza a questi molteplici livelli di contenuto, sono in grado solo di visualizzare sequenze di codici binari: dovremo perciò predisporre il testo affinché il calcolatore possa cogliere i vari tipi d'informazione in esso contenuti.
Inoltre va tenuto presente che i corpora -ovvero collezioni di testi digitali- costituiscono oggi la prima fonte di dati della Linguistica Computazionale: non è difficile dunque intuire l'importanza della codifica ai fini di questa disciplina e di altre ad essa attinenti.
Nell'operazione possiamo distinguere due livelli distinti: a) la rappresentazione di ciascun carattere alfanumerico componente il testo nella forma di un codice binario; b) la rappresentazione della organizzazione strutturale del testo. Di conseguenza, parleremo di codifica di livello zero e di codifica di alto livello.

## Codifica di livello zero

A questo livello di codifica viene assegnato ad ogni carattere del testo un codice numerico binario (composto da sequenze di 0 ed 1) che lo identifica univocamente.
I cosiddetti set di caratteri sono tabelle di associazioni biunivoche (1 a 1) fra i caratteri di un dato repertorio e dei codici numerici rappresentati in forma binaria, chiamati punti di codice. Ovviamente il numero di caratteri rappresentabili è tanto più elevato quanto più lo è quello dei punti di codice disponibili, che a sua volta dipende da quante cifre binarie vengono usate per la codifica dei caratteri.
Il più famoso set di caratteri è senza dubbio l'ASCII (American Standard Code for Information Interchange), che ha costituito il primo standard per la rappresentazione binaria di caratteri, nonché il nucleo comune per numerosi set successivi.
I 128 punti di codice messi a disposizione dall'ASCII potevano essere sufficienti per la codifica di testi che facessero uso esclusivamente dei caratteri dell'alfabeto latino, ma diventavano pochi nel caso di una lingua come l'italiano, che comprende anche caratteri con diacritici.
Per ovviare a questa limitazione, furono create varie estensioni di ASCII che adoperavano tutti e otto i bit per la codifica, per un totale di 256 punti di codice disponibili; fra queste, la più celebre è probabilmente la ISO-Latin-1 appartenente ad una famiglia di codifiche (la ISO-8859) della quale ogni membro è equivalente ad ASCII per i primi 128 punti di codice, mentre quelli successivi codificano caratteri differenti a seconda del set.
La soluzione a questo limite delle estensioni ASCII è stata individuata nello standard Unicode, la cui ultima versione fornisce la codifica di ben 96382 caratteri. Ogni carattere ha un suo punto di codice, corrispondente a un numero in base esadecimale, consentendoci di mescolare nello stesso testo caratteri appartenenti ad alfabeti diversi.

## Codifica di alto livello

Una lunga sequenza di codici binari, ognuno dei quali corrispondente a un carattere del testo, non esaurisce la rappresentazione del testo. Questo ha una sua organizzazione interna -in parti, capitoli e paragrafi nell'esempio classico di un libro-; inoltre potremmo decidere di esplicitare informazioni linguistiche come le categorie grammaticali delle parole o il ruolo sintattico dei sintagmi.
In tal caso, dovremo individuare il livello d'informazione a cui siamo interessati, definire per questo i tratti che giudichiamo rilevanti, detti attributi, e i valori che agli attributi potranno essere associati. Se volessimo ad esempio analizzare la morfosintassi di un testo, potremmo scegliere come attributi la categoria grammaticale, il genere, il numero, il modo, il tempo, la persona ecc. I valori che potrebbe assumere l'attributo "categoria grammaticale" sarebbero: sostantivo, aggettivo, verbo, pronome, articolo, avverbio, proposizione, congiunzione, interiezione.
Tutte queste scelte, unite ad una chiara specificazione dei criteri di assegnazione dei valori ad ogni singola parola, costituiscono uno schema di codifica. Questo comprenderà quindi
* a) un repertorio di categorie;
* b) delle norme di compatibilità fra le categorie (ad esempio, se una parola è un verbo non potrà avere un attributo di genere);
* c) la descrizione del modo in cui queste categorie vengono applicate al testo in questione.
Nel caso di schemi di codifica per informazioni di tipo linguistico, si parla di schemi di annotazione linguistica.

## XML

I linguaggi di marcatura costituiscono la risposta ideale alla domanda "Come codificare?". Essi rappresentano l'informazione strutturale mediante tag di marcatura, collocati nel testo secondo le regole di combinazione proprie del linguaggio. I tag individuano ("marcano") dei "blocchi" testuali, a cui verrà assegnata una particolare interpretazione.
Tali linguaggi vengono incontro alle nostre necessità di strutturazione dell'informazione, e al tempo stesso garantiscono elevata portabilità: ciò significa che possono essere gestiti da programmi diversi, su qualunque sistema operativo (a differenza di formati proprietari come pdf e doc).
XML nasce alla fine degli anni Novanta come evoluzione del linguaggio di marcatura SGML. I tag di questo linguaggio possono indicare la funzione astratta svolta dalla parte di testo alla quale fanno riferimento (ad esempio "capitolo"), senza dare indicazioni su come questa dovrà apparire sulla pagina. Ogni tag definisce un'unità strutturale del testo, anche complessa, che all'interno può contenere altre strutture progressivamente incassate. A differenza di altri linguaggi di marcatura, XML non pone restrizioni a tipologia, quantità e nome degli elementi marcatori, ma soltanto al modo in cui essi devono combinarsi fra di loro: in questo senso potremmo vederlo come un metalinguaggio di marcatura, un linguaggio che serve a descrivere i linguaggi di marcatura. Va ricordato inoltre che i documenti XML sono in formato "solo testo" e adoperano in genere Unicode UTF-8 per la codifica dei caratteri: ciò determina elevate facilità di scambio e portabilità dei dati anche fra applicazioni diverse.

## Document Type Definition

La Document Type Definition o DTD definisce quali tag vengono utilizzati nella marcatura di una specifica classe di documenti e come devono combinarsi fra di loro. I tipi di oggetti definiti nella DTD (che, a differenza di quanto accade in SGML, è opzionale in XML) sono tre: elementi, attributi ed entità (l'ordine non è rilevante). Ogni oggetto viene definito una volta sola.
La definizione di un elemento all'interno della DTD si divide in due parti: nella prima si riporta il suo identificatore generico (vedi sopra), nella seconda se ne descrive il contenuto in termini strutturali.
<!ELEMENT identificatore (descrizione contenuto)>
La dichiarazione degli attributi include invece, per ogni elemento, l'insieme dei suoi attributi e il tipo di valori che ciascuno di essi può assumere. Per dichiarare gli attributi di un elemento, si riporta il nome dell'elemento di riferimento di seguito alla parola chiave "ATTLIST"; dopodiché si dichiarano gli attributi, uno per riga, accompagnati dalle indicazioni
* 1) della tipologia di valori assumibili;
* 2) dell'obbligatorietà od opzionalità della loro specificazione.
<!ATTLIST nome elemento
Nome attributo Tipo di contenuto Obbligatorietà/Opzionalità della specificazione>
Un particolare attributo, l'ID, serve a identificare univocamente un elemento. Esiste infatti una tipologia dei valori assumibili, chiamata IDREF, per cui il valore assunto da quel particolare attributo è un riferimento ad un attributo di tipo ID di un elemento che compare nello stesso documento. Tali attributi sono usati per esprimere relazioni fra elementi delle quali non si può rendere conto nei termini di un rapporto di inclusione.

## Validazione di un documento XML

I documenti XML si compongono di un prologo e di un'istanza del documento. Nel primo, si trovano le informazioni necessarie al riconoscimento di un documento come documento XML ed al collegamento con la rispettiva DTD (nel caso ci sia). La seconda contiene invece il testo, "marcato" mediante i tag.
<?xml version="1.0" encoding="utf-8" standalone="yes"?> Dichiarazione XML
<!DOCTYPE Testo SYSTEM "Testo.dtd"> Dichiarazione del tipo di documento
In quest'esempio di prologo, la dichiarazione XML indica quale versione del linguaggio è stata usata per la scrittura del documento, il set adoperato per la codifica e la presenza di una DTD (l'attributo "standalone" ha valore default "no" qualora venisse omesso, in tal caso non ci sarebbe alcuna DTD collegata al documento). La dichiarazione del tipo di documento specifica che "Testo" è l'elemento radice e che "Testo.dtd" è il file in cui è contenuta la DTD del documento. Ciò avviene se la DTD è stata scritta su un file a parte, ma può anche essere interna allo stesso documento: fosse così, la si trovererebbe racchiusa da una coppia di parentesi quadre, subito dopo la specificazione dell'elemento radice.
<!DOCTYPE Testo [DTD del documento]>
La scelta di una DTD esterna diviene quasi obbligata quando ci sono più documenti collegati alla medesima DTD: il rimando ad essa nella dichiarazione del tipo di documento ci eviterebbe di riscriverla in ogni documento associato.
Le istanze, per essere validate, dovranno non solo rispettare le regole sintattiche di XML (esistenza di un solo elemento radice, corretto incassamento dei tag ecc.), ma anche quelle stabilite nella DTD del documento. In tal caso l'istanza è valida. Per verificare che la codifica sia stata effettuata in maniera corretta, esistono software detti parser XML validanti che controllano l'aderenza di un documento alle specifiche della relativa DTD.
Per molti tipi d'applicazioni e d'analisi linguistiche possiamo trovare sul web DTD predefinite, liberamente utilizzabili dagli utenti: infatti, se da un lato XML ci offre la possibilità di definire la DTD più adeguata agli obiettivi che ci poniamo, dall'altro esistono degli standard fissati dalla comunità di ricerca internazionale per facilitare lo scambio dei dati. Il più famoso progetto per lo sviluppo di un modello di codifica digitale del testo è il Text Encoding Initiative (TEI), avviato nel 1987: suo scopo principale è appunto quello di realizzare degli schemi in grado di proporsi come standard a livello internazionale.