NLP – Natural Language Processing – Introduzione al Naive Bayes Classifier

31 gennaio 2010 - 15:55 by Charlenger

La classificazione documentale, come spiegato nel precedente articolo sull’argomento, si compone di varie fasi e sfrutta vari strumenti. Uno tra quelli presentati è il classificatore ingenuo di Bayes o “Naive Bayes Classifier”. La solita citazione da Wikipedia è:

“A Bayes classifier is a simple probabilistic classifier based on applying Bayes’ theorem (from Bayesian statistics) with strong (naive) independence assumptions. A more descriptive term for the underlying probability model would be “independent feature model”.”

Prima di poter parlare di classificazione documentale sarebbe innanzi tutto necessario parlare di classificazione in maniera più generale. Infatti, la classificazione documentale, altro non è che un normale processo di classificazione, in questo caso basata su un approccio statistico, composta di numeri, regole e formule. Viene spontaneo chiedersi come sia possibile a questo punto che un documento, fatto di parole, lettere, punteggiatura e simboli che vanno ben oltre semplici numeri, possa essere trattato come se fosse una variabile di un’equazione matematica.

La risposta al questio si chiama “modello matematico”. I modelli matematici, grande divertimento dei ricercatori operativi, sono il risultato di processi di analisi e modellazione che permettono di mappare in qualche modo, più o meno coerente e completo, un qualsiasi elemento della realtà. Il “più o meno coerente e completo” è d’obbligo perché è noto che la natura non fa spigoli, cioè il mondo non è lineare, mentre spesso i problemi reali vengono modellizzati in modo tale da essere risolvibili, per esempio, studiandone una versione linearizzata.

Prendendo il caso particolare del metodo statistico di Bayes, e semplificando al minimo il modello matematico da utilizzare, è possibile trasformare un documento in un semplice vettore di numeri che, nel caso del classificatore classico, appartengono all’insieme {0,1}, cioè sono binari. Questa modellazione è possibile grazie a una “legenda” di riferimento detta vocabolario. In questo particolare caso, il vocabolario del modello matematico corrisponde con un vocabolario secondo la sua più stretta e umana definizione.

Passando a un esempio concreto, si supponga di avere questo vocabolario:

[giocatore, sport, calcio, pallone, scarpa, rete, palo, portiere]

e la seguente frase:

“Durante la partita, il giocatore ha dato un calcio al pallone e ha perso la scarpa”

dunque il vettore di riferimento sarebbe:

[1, 0, 1, 1, 1, 0, 0, 0]

Senza andare nel dettaglio della fase di pre-elaborazione dei dati (cioè la loro trasformazione in dati utilizzabili per l’addestramento e la fruizione del classificatore), è possibile illustrare il principio che sta alla base della classificazione ingenua. Tale classificazione è definita in questo modo perché si presuppone che gli elementi che costituiscono i vettori e il vocabolario siano indipendenti tra loro, e dunque non vengano considerate eventuali correlazioni. Per intendere meglio cosa voglia dire ingenuo può essere utile un esempio:

In un documento che parla di biologia, e in particolare del ciclo di vita di una pianta, la probabilità che nel testo appaia la parola “fotosintesi” non è indipendente dalla presenza del termine “clorofilliana”. Nella conoscenza comune è noto associare le due parole e, per di più, la presenza della seconda può addirittura essere correlata in posizione al termine precedente. Sarà infatti molto più probabile incontrare nel testo l’espressione “fotosintesi clorofilliana” che “clorofilliana fotosintesi”.

Quando si parla di classificazione ingenua, si assume che il valore corrispondente a questi due termini, sia indipendente l’uno dall’altro, cioè si ignora il fatto che la presenza delle due parole insieme costituirebbe una maggiore probabilità che un certo testo parli di biologia vegetale. Viene naturale chiedersi perché non lo si consideri. La risposta è già stata fornita in precedenza. Il modello da utilizzare deve essere semplice e computabile e inserire questo tipo di dipendenze (ne esistono anche di molto complesse nella linguistica e nella teoria della probabilità), significherebbe rendere il problema molto complesso, e in vari casi anche NP-Completo.

La regola di Bayes su cui si basa il classificatore dice che:

La probabilità P di un evento E, data l’evidenza F{1,2,…,N} è data dal rapporto tra il prodotto della probabilità del singolo evento P(E) con la probabilità dell’evidenza dato il fatto E, e la probabilità dell’evidenza.

P(E | F1,F2,…,Fn) = P(E) * P(F1,F2,…,Fn | E) / P(F1,F2,…,Fn)

Detto in termini di classificazione, si supponga che l’evento E sia la categoria da assegnare a un certo documento, e che l’evidenza siano i singoli termini che costituiscono il vocabolario, la regola potrebbe esprimersi come “la probabilità che un documento appartenga alla categoria E, data la presenza/assenza delle parole F1,…,Fn è pari al prodotto della probabilità stessa che un documento appartenga a una certa categoria moltiplicato per la probabilità di ciascuna delle parole, presupposto che si tratti della categoria E, diviso la probabilità delle parole stesse.

Anche espresso in questo modo, il concetto non rimane chiarissimo, ma la comprensione di questa legge non è lo scopo di questo articolo. In ogni caso, la legge scritta in questo modo è altamente esauriente ma sarebbe computazionalmente difficile da calcolare e rappresenterebbe il classificatore “ideale” di bayes.

La classificazione infatti avverrebbe calcolando, dato un documento, la probabilità che questo appartenga a ciascuna delle possibili categorie, scegliendo, ovviamente, quella più alta. Come fare dunque a rendere la legge utilizzabile? Proprio utilizzando il principio di “ingenuità”. Infatti, considerato che la probabilità congiunta espressa al numeratore del secondo membro dell’equazione è esprimibile come:

P(E, F1, F2, … Fn) = P(E)*P(F1|E)*P(F2|F2,E)*…*P(Fn|Fn-1,…F1)

La condizione di indipendenza o ingenuità ci permette di dire che per ogni “i” diverso da “j” è valida la seguente relazione:

P(Fi | C, Fj) = P(Fi | C)

Cioè che non c’è nessuna relazione di probabilità tra “fotosintesi” e “clorofilliana”. Questo ci permette di ridurre l’equazione precedente (dove l’evidenza sarà espressa comeF) nel seguente modo:

P(E | F) = P(C)*P(F1|C)*P(F2|C)*…*P(Fn|C)/P(F)

Adesso, posto che nella classificazione ingenua, generalmente, le categorie sono considerate equiprobabili, e che l’evidenza è un fattore identico per ogni categoria, il valore che vogliamo calcolare potrà essere calcolato come:

P(E | F) = P(F1|C)*P(F2|C)*…*P(Fn|C)

Che significa che dato un documento, il valore che ci permette di ipotizzare a quale categoria appartenga, è data dal massimo prodotto di tutti i valori di probabilità di ciascuna parola del vocabolario in relazione a ciascuna categoria. Il concetto può essere spiegato meglio con un esempio pratico.

Supponiamo di prendere un vocabolario di 5 parole:

W = [cane, soldi, deputato, calciatore, locale]

e di avere 3 categorie:

C = [sport, economia, tempo libero]

La prima cosa da fare sarebbe addestrare il classificatore. Per farlo bisogna calcolare le tabelle di probabilità di ciascun termine per ciascuna categoria e per farlo si passa attraverso l’addestramento. Per esemplificare, si prende un insieme di 3 vettori (documenti) per la categoria “sport”:

v1 = [1,0,0,1,1]
v2 = [1,0,0,1,0]
v3 = [0,0,0,1,1]

 La riga relativa alla categoria “sport” per la tabella delle probabilità sarebbe:

sport = [2/3, 0/3, 0/3, 3/3, 2/3]

Si supponga di avere ache le altre due categorie e di avere dunque la seguente tabella delle probabilità positive (quelle negative si calcolano come “1 – p”):

[2/3, 0/3, 0/3, 3/3, 2/3]
[1/3, 2/3, 3/3, 0/3, 0/3]
[2/3, 1/3, 0/3, 1/2, 3/3]

 Se volessimo classificare il seguente documento: “il calciatore ha giocato come un cane”, a cui corrisponde il vettore [1, 0, 0, 1, 1] potremmo calcolare i tre possibili valori come:

v(sport) = 2/3*(1 – 0/3)*(1 – 0/3)*3/3*2/3 = 4/9 = 0,44
v(economia) = 1/3*(1 – 2/3)*(1 – 3/3)*0/3*0/3 = 0
v(tempo libero) = 2/3*(1 – 1/3)*(1 – 0/3)*3/3*2/3 = 8/27 = 0,30

quindi max(V) = 0,44 cioè: il documento è classificato come “sport”.

Emerge subito come il risultato sia fortemente dipendente dai dati con cui viene addestrato il sistema e soprattutto esso non è esente da condizioni limite. Per esempio, l’assenza della parola “deputato”, dal momento che è presente nel 100% dei campioni di economia, andrebbe ad azzerare la probabilità nonostante altre parole potrebbero aumentare significativamente lo stesso valore. Questo sarebbe un caso di sotto-stima dell’insieme di addestramento. Al contrario potrebbero esserci significative differenze nel numero dei documenti utilizzati e una categoria potrebbe essere favorita. In questo caso si ha un problema di sovra-dimensionamento. Per far fronte a questi problemi si usano varie tecniche basate su tecniche che calcolano i valori di probabilità sulla base della frequenza dei termini, la loro rilevanza e la proporzione normalizzata dei documenti (e.g. TF-IDF). Questo genere di approcci può trasformare il vettore che rappresenta il documento da binario a reale (e.g. [0.2, 0.4, ... , 0.7]).

Esistono varie altre tecniche e adattamenti di questo algoritmo o che ne siano valide alternative, per esempio le macchine a vettori di supporto, tuttavia il classificatore Naive Bayes rimane uno dei più usati in quanto è facile da implementare, facilmente personalizzabile in base ai tipi di classificazione che deve svolgere, raffinabile e molto efficiente sebbene fortemente dipendente dalla qualità dei dati forniti per l’addestramento.



NLP – Natural Language Processing – Classificazione Documentale

21 gennaio 2010 - 7:08 by Charlenger

La classificazione documentale (document classification/clustering) è un processo studiato all’interno dell’elaborazione del linguaggio naturale che si occupa di assegnare una o più categorie a un elemento detto documento. Come di consueto riporto la citazione da una delle fonti più cliccate del web, wikipedia:

Document classification/categorization is a problem in information science. The task is to assign an electronic document to one or more categories, based on its contents. Document classification tasks can be divided into two sorts: supervised document classification where some external mechanism (such as human feedback) provides information on the correct classification for documents, and unsupervised document classification, where the classification must be done entirely without reference to external information. There is also a semi-supervised document classification, where parts of the documents are labeled by the external mechanism.

In breve, dato un documento, questo viene analizzato e al termine del processo si ha un dato che può essere, per esempio, “Spam”.

La classificazione documentale ha diverse applicazioni e, l’esempio arriva non a caso, una delle prime forme di applicazione pseudo-commerciale è stata proprio la classificazione di e-mail come spam o non-spam. Tra i più famosi e usati troviamo proprio “Spambayes”, cioè un classificatore che utilizza l’approccio Naive Bayes per la classificazione “raffinabile” delle e-mail di spam. Ma procediamo con ordine.

Innanzi tutto, come è composto un processo di classificazione documentale? Esistono sostanzialmente pochi macroblocchi:

- Scelta del modello di classificatore più adatto al problema
- Addestramento (Training) del classificatore
- Implementazione/Integrazione del classificatore nel sistema che sfrutta la classificazione
- Raffinamento dinamico (dipendente dal modello) del classificatore

Il primo problema da affrontare è appunto quello della scelta di un buon tipo o approccio alla classificazione. Esistono vari metodi in letteratura ma quelli più usati e più affidabili sono sostanzialmente pochi. Tra questi troviamo il metodo statistico basato sulle reti bayesiane, cioè il classificatore ingenuo di Bayes (Naive Bayes), il metodo a vettori di supporto, cioè SVM (Support Vector Machine), le reti neurali e i metodi geometrici che rappresentano i documenti nello spazio e calcolano le aree di apparteneza (e.g. distanza di Hamming).

Ognuno di questi classificatori ha vantaggi e svantaggi che possono incidere sulla scelta. Per esempio il metodo che sfrutta l’approccio statistico bayesiano è sufficientemente semplice da implementare, ha buone prestazioni in termini di calcolo computazionale ed è facilmente raffinabile dinamicamente. Allo stesso tempo però, il termine Naive, viene proprio dal fatto che si tratta di un classificatore ingenuo, che non è in grado, da solo, di associare valori statistici di relazione tra parole che invece, nella conoscenza comune, potrebbero averle (e.g. “Fotosintesi” e “Clorofilliana”). Per portare un altro esempio, le macchine a vettori di supporto, si sono rivelate essere tra le migliori in termini di affidabilità e prestazioni, in grado di modellare anche non linearità con sufficiente semplicità, tuttavia l’implementazione dei metodi di addestramento che prevedono la risoluzione di sistemi lineari o linearizzati è meno semplice rispetto all’esempio precedente in quanto si rivela necessario applicare metodi matematici come simplesso, moltiplicatori di Lagrange, etc. Tra gli altri possibili “difetti” delle SVM troviamo anche il fatto che questo tipo di classificatore non nasce con lo scopo di modellare uno spazio multi-categoria, ma di trovare la massima distanza tra due categorie. In realtà esistono vari approcci (one vs one & one vs many) per rendere anche i classificatori SVM multi-classe.

Supponendo di avere scelto il modello più adatto, il passo successivo è quello della pre-elaborazione (pre-processing) dei dati. Non solo i documenti in ingresso non possono essere elaborati così come sono, ma devono anche subire varie modifiche affinché i risultati della classificazione siano ottimali. Per esempio, il testo che viene elaborato, soprattutto in fase di addestramento del sistema, dovrebbe essere ripulito da tutte le parole che non apportano alcun valore alla categorizzazione del documento, quali articoli, congiunzioni, avverbi, etc. Il fatto che in un documento sia ripetuta la parola “quando” non fa sì che quel testo sia più vicino a un testo di sport o di economia. Un’altra elaborazione che è possibile fare è lo “stemming” ovvero la rimozione degli elementi non significativi in termini di classificazione dalle parole. Se per esempio in una email di spam, il verbo “comprare” è usato molto spesso, questo si può presentare in varie forme “Compra questo prodotto”, “prova a comprare il nostro prodotto”, “hai già comprato il nostro prodotto?”, etc. Se per un essere umano la relazione tra queste parole sembra ovvia, per una macchina “compra” e “comprato” sono due parole differenti finché non venga fornita una informazione di relazione. Lo stemming andrebbe a rimuovere “a” da “compra” e “ato” da “comprato”, lasciando solo l’elemento realmente significativo del verbo comprare. Chiaramente questo tipo di processi è dipendente dalla linuga e introduce un ulteriore livello di difficoltà nell’addestramento di un sistema.

La pre-elaborazione può essere considerata come parte integrante del processo complessivo di addestramento che segue il modello canonico di tutti i sistemi addestrabili (pre-processing-training-check-loop). L’addestramento vero e proprio può avvenire in vari modi e generalmente si divide in supervisionato e non supervisionato. Senza scendere nel dettaglio, prendendo a esempio il classificatore Naive Bayes, l’addestramento consiste nel calcolare le tabelle di probabilità bayesiane tramite le quali sia possibile calcolare il valore di appartenenza di un documento a una certa categoria. L’addestramento, generalmente, viene fatto mediante dati etichettati cioè a partire da un insieme di documenti di cui si conosce la categoria di appartenenza. Questo non dovrebbe stupire, in fondo, se a un bambino si spiega cosa sia un testo di storia, non potrà mai riconoscerne uno se prima non sa cosa sia la storia stessa. Per le macchine il principio è più o meno lo stesso.

Particolare attenzione va rivolta alla trasformazione dei dati. Uno dei primi problemi in cui ci si imbatte è la rappresentazione dei dati. Il principio è che le macchine ragionano per numeri e quindi i dati, sebbene siano testo, vanno normalmente trasformati in numeri, vettori, matrici, etc. Un documento viene spesso trasformato in un vettore binario che fa riferimento a un vocabolario. Per esempio, se il vocabolario di riferimento fosse [io, pasta, cane, pallone, carta] e la frase fosse “io mangio la pasta, ma il cane no” il documento sarebbe rappresentato dal vettore binario [1,1,1,0,0]. Alcuni tipi di classificatore permettono di utilizzare delle versioni più complesse di rappresentazione, per esempio quelle che utilizzano valori continui e non binari, derivate dall’analisi TF-IDF (Term Frequency – Inverse Document Frequency). Quest’utlima tecnica è nata principalmente per calcolare la rilevanza di una certa parola all’interno di un contesto che può essere un singolo documento o un insieme di documenti e ha trovato larga applicazione nei motori di ricerca e negli algoritmi keyword-based.

Una volta addestrato e verificato il sistema, il passo successivo è quello di integrare il classificatore con sistemi che ne devono sfruttare le funzionalità e possibilmente devono essere in grado di fornire ulteriori dati per il raffinamento della classificazione. Un esempio è proprio “SpamBayes” che a ogni mail arrivata, determina mediante il comportamento dell’utente (cancellazione, segnalazione esplicita di spam, lettura e archiviazione) se il campione in oggetto va utilizzato o meno per raffinare il classificatore.

In conclusione, la classificazione documentale è un problema complesso che dipende da moltissimi fattori; uno su tutti è l’insieme dei documenti di addestramento che dovrebbe essere pulito, robusto e completo. Le applicazioni della classificazione documentale sono molteplici e possono rendere molto più efficienti e funzionali vari compiti attualmente, generalmente svolti “a mano”. Alcuni esempi possono proprio essere la classificazione di spam per le caselle e-mail (spam filter), il raggruppamento di documenti per la ricerca veloce (fast search), il reperimento di informazioni chiave da grossi gruppi di documenti (information retrieval), etc. Tuttavia l’utilizzo dei classificatori non finisce qui. In realtà la matematica applicata ai classificatori è la stessa che tratta anche dati differenti per cui è possibile (come già avviene) pensare di trasformare anche altri dati nelle forme classificabili. Basandosi su questo approccio è possibile pensare anche a sistemi esperti che siano in grado di selezionare dei sintomi e effettuare una prima diagnosi dei pazienti… “Sistemi esperti”… sembrano una cosa futuristica e invece si tratta di cose che esistono già da ben più di 20 anni e che hanno largamente fatto parlare di loro in termini di fattibilità, applicabilità ed etica… ma i tempi e i mezzi a nostra disposizione oggi sono fortemente cambiati.
Lo scopo di questo articolo era quello di scendere maggiormente nel dettaglio in una delle branche presentate con il precedente articolo introduttivo sulla NLP e di presentare alcune parole chiave, come per esempio Naive Bayes, che in futuro verranno approfondite. Nel frattempo spero che questa breve e veloce overview sia stata utile a chi, anche non informatico, si avvicina con interesse a quest’area di studio e ricerca.



NLP – Natural Language Processing – Una breve introduzione

11 gennaio 2010 - 1:42 by Charlenger

L’elaborazione del linguaggio naturale, in inglese abbreviata con la sigla NLP (Natural Language Processing), è una branca dell’intelligenza artificiale che abbraccia tutte quelle aree all’interno delle quali si ricercano e sviluppano algoritmi per l’estrazione automatica di informazioni a mezzo di calcolatori elettronici a partire da una qualunque forma di linguaggio naturale.

Un linguaggio naturale può essere una forma scritta, verbale o anche gestuale. Qualunque tipo di linguaggio che abbia una struttura definita da regole e che venga “naturalmente” utilizzato per comunicare può quindi essere considerato un linguaggio naturale.

Tutti i problemi affrontati all’interno della NLP possono essere considerati come parte del più generale problema della comprensione del linguaggio naturale che è IA (Intelligenza Artificiale) completo in quanto presuppongono che la macchina sia in grado di sfruttare complesse capacità di logica, deduzione, apprendimento e così via, al fine di avere una conoscenza, per l’appunto, completa (o per lo meno quanto più completa possibile) del mondo in cui essa opera.

Alcune delle aree che fanno capo alla NLP sono le seguenti:

- Riconoscimento Automatico del Parlato (ASR – Automatic Speech Recognition): area che si occupa di estrarre informazioni da informazioni verbali come l’identificazione del parlante, l’identificazione di particolari vocaboli all’interno di una frase, il riconoscimento completo di frasi e così via;
- Classificazione Documentale (DC – Document Classfication): area che si occupa di analizzare testi scritti e di catalogarli o etichettarli secondo particolari categorie, siano esse binarie o multiple, estraendo dai vari documenti informazioni come la rilevanza delle varie parole, somiglianza tra campioni e così via;
- Analisi emozionale (SA – Sentiment Analysis): area che si occupa di estrarre informazioni legate ai sentimenti espressi all’interno di un testo scritto, il parere dell’autore e le possibili relazioni tra due o più documenti in termini di vicinanza a una data opinione;
- Supporto Grammaticale (GS – Grammatical Support): area che si occupa di analizzare testi scritti e di estrarre informazioni legate alla struttura grammaticale del testo in relazione alla lingua in cui è scritto o in relazione a leggi prestabilite da altri documenti;
- Sintesi Vocale (SS – Speech Synthesys): area che si occupa di creare suoni a partire da testi scritti che siano coerenti con le regole fonetiche della lingua da sintetizzare, sulla base di quanto il testo voglia esprimere;
- Interpretazione dei Gesti (GI – Gesture Interpretation): area che si occupa di associare a dei gesti visuali un significato in termini di testo o vocabolo;

Come è facile immaginare, ciascuno di queste aree ha grandi applicazioni sia al livello puro nel mondo accademico e della ricerca, che nel mondo commerciale. Tuttavia spesso non è semplice immaginare quali difficoltà stiano dietro allo sviluppo di tecnologie che si occupino di risolvere problemi che all’apparenza sono piccoli e che rappresentano anche solo una piccola parte di un sotto-problema della comprensione del linguaggio naturale.

Per fare un esempio, non molto spesso ci si ferma a riflettere su quanto complesso sia il nostro sistema di comunicazione. Quando ci capita di parlare con qualcuno in mezzo a una folla, siamo attorniati da migliaia di rumori e voci, dati che il nostro cervello scarta e non traduce in informazioni se non nello stretto necessario. Siamo tuttavia in grado di focalizzarci su ciò che il nostro interlocutore ci sta dicendo, comprenderlo ed elaborare una risposta. Sembra semplice tuttavia per una macchina non lo è. Questo è dovuto al fatto che la comunicazione umana non si basa, come è facile pensare, solo sull’elemento verbale. Essa si basa su moltissimi altri elementi contestuali come i gesti, la conoscenza pregressa, la cultura e così via. Quando crediamo di avere sentito una parola e gli abbiamo associato un significato, non è detto che questo sia avvenuto attraverso la mera elaborazione del suono.

Un celebre esempio presentato da Rabiner, uno dei luminari nel campo del riconoscimento automatio del parlato, mostra come una macchina sia impossibilitata a comprendere una semplice espressione che un umano darebbe per scontata:

“I want an ice cream” – io voglio un gelato

Facile da capire no?

“I want an I scream” – io voglio un io grido

ovviamente non ha significato… per noi. Tuttavia è interessante riflettere sul fatto che una macchina non sa a priori che “want” e “scream” siano dei verbi e che una frase come “I want an …” probabilmente ha bisogno di un complemento oggetto. Ma leggendo la frase ad alta voce con tono naturale ci accorgeremmo che la differenza fonetica è praticamente impercettibile tra le due frasi.

Il cervello umano è un sistema molto complesso e dal quale siamo ancora ben lontani dal crearne uno artificiale in grado di simulare le funzioni di uno reale. La comprensione del linguaggio naturale è un processo che nella nostra mente attiva una serie di processi di analisi sintattica e semantica, lessicale e grammaticale, che sono corredati da filtri percettivi che il nostro cervello impara a usare, come l’ignorare il rumore circostante, il ricostruire frasi o parole incomplete sulla base della “probabilità” che quel suono in quel contesto significasse qualcosa in particolare.

Dal momento che questa è una breve introduzione voglio rifare l’elenco precedente esponendo una singola possibile applicazione di questo tipo di sistemi a livello avanzato e una a livello quotidiano:

- ASR: interfaccia di comando vocale per sistemi complessi (e.g. navigazione in auto, aereo, etc) | sistema di videoscrittura digitale basata sul dettato
- DC: classificazione automatica di testi e frasi per l’interazione con chatbot di supporto online | classificazione di pagine web orientata all’ottimizzazione delle prestazioni dei motori di ricerca
- SA: analisi automatica della reputazione di un’entità sul web | classificazione di opinioni binarie su documenti con struttura specifica
- GS: creazione di testi alternativi e sommari a partire da testi più complessi | correttore sintattico per sistemi di videoscrittura
- SS: creazione di voci realistiche per l’interazione di chatbot di supporto telefonico | sintesi di annunci vocali automatici per stazioni (aeroportuali, ferroviarie, etc)
- GI: interfaccia di comando gestuale per sistemi a scarsa propagazione della voce (ambienti spaziali, subacquei, etc) | sistema di gaming entertainment basato sui movimenti

Ciascuna di queste aree presenta molti agganci e sbocchi interessanti sotto vari punti di vista e rappresenta, nel suo piccolo, una frontiera innovativa sia dal punto di vista della ricerca scientifica, sia dal punto di vista dell’evoluzione commerciale dei prodotti che usiamo quotidianamente.

Per concludere voglio introdurre un progetto attualmente in sviluppo su questo sito web. Di recente ho aggiornato una libreria che era orientata alla classificazione documentale. Questa libreria ha cambiato nome e, sebbene possa sembrare troppo generalizzato, adesso è NLP4J, cioè una libreria che vuole accrescersi cercando di fornire strumenti sempre più completi e general purpose per i temi di NLP. Ovviamente la libreria è, in tema con il progetto JOProject, open source e in Java.

Al momento NLP4J include solo il support per la classificazione documentale ma verrà presto aggiornata sia con i contributi di chiunque volesse mettere alla prova le proprie conoscenze all’interno di questo tema e instaurare una collaborazione, sia con quello che personalmente aggiungerò strada facendo. Una presentazione più dettagliata del progetto seguirà prossimanete. Nel frattempo potete visualizzare lo stato del progetto, scaricare i files relativi a sorgenti, binari e documentazione da queste pagine: pagina del progetto, forum.



L’Etica del Software

3 dicembre 2009 - 7:55 by Charlenger

Ormai dovrebbe essere chiaro che uno dei temi portanti di questo sito/blog è il software e le sue innumerevoli facce e questioni, tra open-source e licenze varie. Qualche giorno fa, mi sono trovato a leggere alcuni articoli scritti da un personaggio alquanto celebre che le persone legate in qualche modo all’open source e al software “etico” conosceranno abbastanza bene. Sto parlando di Richard Stallman.

Come di consueto riporto cosa dice l’enciclopedia web 2.0, Wikipedia:

Richard Matthew Stallman (New York, 16 marzo 1953) è un programmatore, hacker e attivista statunitense.

È uno dei principali esponenti del movimento del software libero. Nel settembre del 1983 diede avvio al progetto GNU con l’intento di creare un sistema operativo simile a Unix ma libero: da ciò prese vita il movimento del software libero. Nell’ottobre del 1985 fondò la Free Software Foundation (FSF). Fu il pioniere del concetto di copyleft ed è il principale autore di molte licenze copyleft compresa la GNU General Public License (GPL), la licenza per software libero più diffusa. Dalla metà degli anni novanta spende molto del suo tempo sostenendo il software libero e promuovendo campagne contro i software proprietari e ciò che a lui sembra una eccessiva estensione delle leggi su copyright. Stallman ha anche sviluppato molti software ampiamente usati: Emacs, la GNU Compiler Collection e lo GNU Debugger.

Leggendo gli articoli che riporto in coda al post, ho riflettuto su alcuni aspetti importanti del software, indipendentemente dal suo tipo, e in particolare a quella che potrebbe essere definita “etica” del software.

Sempre da Wikipedia:

L’etica (dal greco antico ἔθος (o ήθος)[1], “èthos”, comportamento, costume, consuetudine) è quella branca della filosofia che studia i fondamenti oggettivi e razionali che permettono di distinguere i comportamenti umani in buoni, giusti, o moralmente leciti, rispetto ai comportamenti ritenuti cattivi o moralmente inappropriati.

L’etica può anche essere definita come la ricerca di uno o più criteri che consentano all’individuo di gestire adeguatamente la propria libertà nel rispetto degli altri. Essa pretende inoltre una base razionale, quindi non emotiva, dell’atteggiamento assunto, non riducibile a slanci solidaristici o amorevoli di tipo irrazionale. In questo senso essa pone una cornice di riferimento, dei canoni e dei confini entro cui la libertà umana si può estendere ed esprimere. In questa accezione ristretta viene spesso considerata sinonimo di filosofia morale: in quest’ottica essa ha come oggetto i valori morali che determinano il comportamento dell’uomo.

Cosa signifca dunque etica del software? Parlando da ingegnere dell’informazione e da appassionato di software design & development, mi sono reso conto che non è affatto facile parlare di questo argomento. In primo luogo mi sono trovato a pensare dal punto di vista dell’utente. Per l’utente, che sia un’azienda o un privato, il software dovrebbe essere sicuro, potente, facile da usare e così via… e soprattutto dovrebbe costare molto poco.

In molti, sentendo parlare di “free software”, associano alla parola free il senso di gratuito, ma non è esattamente questo ciò che Stallman intendeva quando usava quel termine. Nei paesi di lingua anglosassone la differenza è ancora più sottile in quanto free significa letteralmente sia gratis che libero. In italiano la traduzione corretta è infatti “Software Libero” e non “Software Gratis”.

Vorrei sottolineare che non ho detto che per l’utente il software dovrebbe essere gratis. Quanto meno se si tratta di qualcosa di importante e soprattutto se si tratta di un’azienda. Per qualche ragione, un software “libero” e anche “gratuito” fa paura alle aziende e a chi ha bisogno di un software che vuole percettivamente chiamare “sicuro”. Free Software e Open Source infatti spesso non sono capiti e per questo motivo non adottati.

Ma analizzando il punto di vista di chi il software lo vende, o di chi guadagna su di esso, chiaramente l’idea di software è quella di un servizio da cui tirare fuori quanti più soldi possibili a prescindere dalla qualità e dalle tecniche utilizzate. Sta poi a ciascuno operare le sue scelte, fare i propri prezzi e adottare le proprie strategie di vendita e quanto tempo dedicare alla qualità del proprio prodotto.

Come è facile intuire queste due cose non vanno esattamente d’amore e d’accordo. Ritorno dunque alla domanda iniziale. Cosa significa etica del software? Per quanto mi riguarda, la risposta, forse un po’ semplificata, riguarda tutti coloro che hanno relazioni con il software.

L’utente dovrebbe scegliere il software in base alle sue esigenze, o richiedere delle caratteristiche ragionevolmente con ciò che è disposto a scegliere, e dovrebbe fidarsi di ciò che adotta come soluzione. Parlando per esempio dell’utente finale, trovo non etico utilizzare una versione pirata di Microsoft Office perché ha delle funzioni di indubbia e superiore qualità rispetto a ogni altro prodotto dello stesso tipo. La scelta etica è quella di pagare il prezzo del software e acquistarlo, oppure se non si è disposti a pagare adottare una soluzione gratuita, per esempio l’open source Open Office di Sun Microsystem. Forse non sarà il massimo delle funzioni ma offre tutto ciò che serve per svolgere gli stessi compiti di Microsoft, quanto meno per l’utente “home”.

Dal punto di vista dello sviluppatore, ritengo che etica del software significa applicare sempre il massimo delle proprie capacità quando si svolge il proprio lavoro, applicare tariffe e prezzi ragionevoli al lavoro svolto, accettare solo lavori che si sa di poter svolgere oppure avvalersi, a fronte di un guadagno inferiore, di capacità esterne che consentano di andare incontro ai bisogni del cliente. Ritengo altrettanto etico però non svendersi, non regalare le proprie competenze perché essere buoni è un conto, essere etici è un altro, ma regalare tutto il proprio lavoro è da stupidi.

Di certo all’utente piacerebbe che i programmatori lavorassero gratis e sviluppassero ogni cosa per il semplice divertimento di farlo, ma non lo ritengo per nulla né produttivo né appunto, etico. Qualcuno, come in questo sito, può dedicarsi allo sviluppo di software che è gratuito oltre che “free software” e “open source”. Ma ciò dovrebbe avvenire solo perché il guadagno arriva in altri termini, quali esperienza, visibilità, divertimento, condivisione, etc.

La questione secondo me tocca anche chi usufruisce dei software cercando di farlo in modo etico ma senza informarsi troppo. Molti puntano il dito su Microsoft. Sebbene sia vero che quest’azienda abbia un grosso strapotere sul mercato, soprattutto riguardo sistemi operativi e suite office, e abbia adottato strategie di mercato non sempre etiche ma sicuramente vincenti, tuttavia esistono molte altre aziende che hanno adottato strategie molto simili ma su cui nessuno ha puntato mai il dito contro perché offrivano software e servizi gratuiti. Un esempio è Google.

Premettendo che io non mi schiero né contro né a favore di Microsoft o Google, c’è da dire che trovo un po’ troppo eccessiva la critica a Microsoft da parte di molti “Linuxisti” che però sono giorno e notte su internet, cercano so google, magari hanno scaricato Chrome, e presto useranno anche Chrome OS e così via. Basterebbe accorgersi che alcune cose di Microsoft, alla fine sono gratuite e open source, e sufficienti per gli utenti “home” e molte cose di Google non sono affatto “Open Source”, sebbene siano “Free”.

Dal momento che parlare di etica, richiede alcune competenze che mi mancano, voglio comunque approfittare del mio amico filosofo, per riportare un parere più specialistico. E dal momento che non voglio dilungarmi troppo, concludo riassumendo il pensiero che mi si è rafforzato sempre di più leggendo gli articoli di Stallman:

Chi sceglie di usare un software dovrebbe farlo pensando che utilizzare un software pirata non significa essere furbi e risparmiare, ma significa solo invitare chi produce software proprietario a incrementare i prezzi non proporzionalmente alla qualità, ridurne i guadagni e costringerli ad adottare politiche scorrette. Al di là del fatto che grosse aziende potrebbero comunque non essere etiche non deve essere l’utente a comportarsi per primo in maniera non etica. Allo stesso modo chi sviluppa software dovrebbe attenersi alle regole etiche della professione oltre che pensare che ciò che rende buono il lavoro non è quanto ci si guadagna, sebbene sia un fattore importante come stimolo e come sopravvivenza, ma la qualità dello stesso e dunque dovrebbe essere necessario scegliere l’approccio (open-source, proprietario, free, etc) più adatto e le tecniche appropriate per implementarlo.

E per chi si dicesse “voglio essere etico ma non posso perché mi servono software che facciano ciò che mi serve”, sappia che nella maggior parte dei casi esistono soluzioni gratuite o open source per ottenere ciò che volete. Alcuni esempi?

Suite di programmi per l’ufficio: OpenOffice – se hai proprio “bisogno” di Microsoft Office probabilmente è perché ti serve per lavoro e la tua azienda te lo potrà procurare. Se lavori in proprio e ti “serve” MS Office… compralo.
Sistemi operativi: Linux Ubuntu – facile da installare permette praticamente tutte le funzioni che l’utente home usa su windows, dalla navigazione internet, alla posta, alla videoscrittura, all’instant messaging.
Sviluppo software: sviluppi microsoft…? perché hai piratato la versione “enterprise” di Visual Studio se esiste la versione Express che per il privato è ben più che sufficiente?
Database: MySql, Microsoft Sql Server Express, etc…
Creazione PDF: BullZip Printer, Ghost Script.
Fotoritocco: Paint .NET, Gimpshop

e potrei continuare all’infinito.

E come anticipato ecco una breve dissertazione di LandOfNowhere:

***

riflessioni “inconcluse” sull’etica della programmazione

Sorvoliamo sul problema filosofico di cosa sia l’etica e sul fatto che per me è una domanda tutt’altro che conclusa. Sorvoliamo pure sul fatto che etica e politica, almeno secondo il sottoscritto, vanno a braccetto e che, per politica, non si debba intendere solo uno strano insieme di giochi di palazzo.
Partiamo da premesse semplici e volutamente semplicistiche: un’azione etica promuove una società migliore, rapporti sociali migliori e un’esistenza migliore per le persone che ci circondano. A molti potrà anche piacere come definizione…. ma per me, resta semplicistica; ciò nonostante da qualche parte dobbiamo partire.
Se accettiamo queste premesse, una delle “etiche” più concludenti è sicuramente quella di Stallman. Un consiglio che posso dare è quello di acquistare questa raccolta dei suoi interventi (tutti comunque rintracciabili su internet).
Si tratta di pensare la creazione di un programma come qualcosa che facciamo all’interno di una società; e che determinate scelte influenzano, in piccolo od in grande quella stessa società. Non si tratta soltanto della licenza con cui il software viene rilasciato. Si tratta, per dirla con Kant, di non pensare l’utente come un mezzo, ma come un fine. Quello che emerge, più che un etica del programmatore è, a ben vedere, un etica del lavoro. Stallman insiste sul fatto che un programmatore di software libero non rinuncia certo al suo stipendio…, ma aggiunge anche che esso verrà ridimensionato – ed in questo emerge un lato “utopico”, che a mio parere semplicemente registra una contraddizione fra questa etica e il sistema capitalistico per come è regolato attualmente.
In altre parole, quest’etica insiste su una (appunto) contraddizione della nostra società: il lavoro deve creare una ricompensa morale nel lavoratore, oltre a permettergli di vivere; la ricompensa morale si misura nell’essere riuscito a contribuire alla comunità di cui si fa parte (e quindi nella “gloria”, nella gratitudine ricevuta, ecc. ecc). La ricompensa economica va, quindi, in secondo piano. In fondo, l’etica del lavoro come “servizio” e “dono”, oltre (e forse anche più) che ai sistemi di valore “socialisti”, rimanda molto anche etiche religiose, in primis quella di molte comunità cristiane/cattoliche (non certo calviniste).
Dicevo prima, che quest’etica spinge su una contraddizione interna della nostra società: essa è costituita dalla scissione personale che ognuno di noi vive. Siamo tutti, da un lato cittadini “solidali” e dall’altro soggetti economici. Membri di una società escludente, che elargisce elemosine agli esclusi. Come molte etiche, inclusa quella cattolica, la cultura hacker insiste sull’unità dei due “soggetti”: mentre viviamo come homini aeconomici (sperando di non aver sbagliato con il latino) non smettiamo di essere cittadini solidali. Ed è questa soggettività quella preminente. Certo, l’origine non marxista di quest’etica di solito gli impedisce di cogliere l’esatta natura di questa scissione/contraddizione e di poter porre così la questione. Ad ogni modo, non può che generare un sistema di valori per cui nell’atto di rilasciare un programma, io debba tenere in  mente di promuovere l’avanzamento della cultura, della fratellanza e della cooperazione. Quindi devo mediare fra i miei interessi economici e quelli della società. Ed allora, posto che il mio lavoro è ciò con cui vivo, ogni qual volta ledo gli interesse e le libertà degli utenti (o della comunità) per il mio profitto, sbaglio. E quindi, devo lasciare a tutti il diritto di modificare e ridistribuire le mie “creature”. Ci sono mille altri modi, che Stallman non si lesina ad elencare, con cui un programmatore può vivere, invece che estorcere soldi per ogni “copia”: ad esempio, un’azienda può pagarlo per avere quelle modifiche di cui ha bisogno per aumentare la produttività o altri metodi ancora.
Resta il fatto che quest’etica stride con i valori “consumistici” e di “profitto” vigenti nel mondo economico di oggi, che pur moralmente bistrattato, è la verità di quello “solidale” (sul perché non mi posso dilungare in questa sede). E che un modello di scambi economico fondato su base esclusivamente “morale”, difficilmente è in grado di creare una pratica davvero capace di scardinare le abitudini consolidate, soprattutto se si basano su sistemi di potere. Ma se dividiamo etica, da politica e se c’interessa sapere soltanto “qual’è il metodo corretto di creare software”, il lavoro di Stallman è una buon punto di partenza. I limiti qui elencati, stanno al di sotto del livello della critica. Infatti sono possibili solo, considerando insoddisfacente la definizione usuale di etica. Ma anche accettando tutte le mie notazioni, il punto di partenza della FSF resta gravido di intuizioni utili e geniali: cosa vuol dire cooperazione nel nostro secolo? Cosa vuol dire diritto di proprietà sui beni non materiali? Il sistema attuale è davvero il più “produttivo possibile”? Come sarebbe il mondo senza l’idolo del profitto? Come sarebbe la nostra società se fosse fondata sul collettivismo e non sull’individualismo?

***

Ecco gli articoli da cui è nato questo post:

http://www.gnu.org/philosophy/free-software-for-freedom.it.html
http://www.gnu.org/philosophy/open-source-misses-the-point.it.html