mercoledì 14 marzo 2007

Come forzare un lucchetto



Sembra incredibile, ma tra le ricerche che ieri hanno portato al mio blog c'è la frase riportata nel titolo.
Quando l'ho visto mi sono chiesto se potevo aver scritto qualcosa in trance e aver svelato anche i segreti del grande Houdini
Ho ripetuto la ricerca e, come vedete dalla foto, è proprio vero: addirittura sono in cima all'elenco!
Fortunatamente sono secondo, anche se si cerca hibernate pro e contro :)

Evidentemente qualcuno cercava di capire come possa essere fuggito Marco Berry in Danger, probabilmente queste ricerche aumenteranno con le puntate del programma.
A pensarci bene poteva pure essere uno scassinatore di cassette di sicurezza. Un professionista, che ha ben chiaro che bisogna prepararsi, prima.
Beh, a quanto pare, sono io che ho rubato uno unique visitor, stavolta.

Comunque, sfruttiamo questa situazione e scriviamo anche questo post: se già ero in cima prima, ora chi mi smuove più? Gli hits sono hits, ragazzi (e lo so che la 's' finale non ci vuole, in italiano: l'ho messa apposta, per accentuare il suono sibilante dell'ultima frase).

C'è un problema in tutto questo: non sarebbe dovuto capitare. Anche per voi, dico, perchè poi vi dovete sorbire questi vaneggiamenti.

C'è forse una soluzione informatica? E' forse il Web Semantico?



Prima di passare alla discussione vera e propria, è necessario che vi segnali anche il secondo risultato dell'elenco (che, intanto che scrivo, è passato primo: forse anche per colpa mia): è un blog di enigmi, ma era inevitabile che a questo dovessi commentare (l'ho fatto, andate a leggervi cosa ho scritto su quel post), dal momento che era evidente che stavano parlando di informatica.

O sembrava solo a me? Davvero non distinguo più vita e informatica?

Torniamo al Web Semantico.
Come introduzione vi consiglio una presentazione della Dott.ssa Mordonini, usato in un seminario nell'Università di Bologna, molto chiaro ed esteso.

Provo giusto a riassumere due o tre punti essenziali, da dilettante dell'argomento e con un occhio, al solito, alle implementazioni pratiche:
  • il Web contiene un numero enorme di informazioni che non sempre riusciamo a raggiungere come vorremmo (e fin qui, lo sapevate già, l'ho riportato solo per vedere se eravate svegli e mi stavate seguendo)

  • il problema è legato al fatto che il Web è oggi costituito solo da legami sintattici (URI) e non semantici. Ovvero, le pagine sono, tipicamente, collegate tra loro senza una spiegazione del significato del link, che possa essere utilizzata da un computer.

  • non basta aggiungere dei tag, simili a quelli che trovate nei vari blog, per aggiungere questo significato: è necessario un maggior formalismo per permettere di applicare algoritmi inferenziali.

Parentesi.
    Le slide chiariscono che Web Semantico non è Intelligenza Artificiale (AI), ma più avanti ricordano che sono necessarie capacità inferenziali (correttamente evidenziando che in questo ambito, ci interessa particolarmente la deduzione e non l'abduzione o l'induzione).

    Probabilmente è corretto, ma solo in senso stretto e formale, e cercando di dare ragione a Douglas Hofstadter che, nel suo oramai-letto-anche-dai-sassi (se non lo avete fatto, è un po' tardi: per quanto sia un libro grandioso - vinse anche il premio Pulitzer - è del 1979, un po' datato, visto l'argomento) Gödel, Escher, Bach - Un'eterna ghirlanda brillante sosteneva che
    l'Intelligenza Artificiale è tutto ciò che non ancora non è stato fatto
    perchè
    tutto ciò che le macchine hanno imparato a fare e che (prima che lo facessero) era ritenuto segno di comportamento intelligente, non viene ritenuto più tale una volta che le macchine lo fanno
Fine Parentesi.

Le slide proseguono con una ben chiara distinzione tra semplici tassonomie, tesauri (es: Wordnet) e ontologie (es: OpenCyc).

Vorrei evitare di appesantire ancora, ma sono costretto a due rapidi pprofondimenti, altrimenti non si capisce più nulla, (rivedremo entrambi gli argomenti in prossimi post in maggior dettaglio):
  • Wordnet è un vocabolario semantico, organizzato in Synset, ovvero insiemi di sinonimi. Ovvero: come certamente sapete le parole (i lemmi) possono avere diversi sinonimi. I dizionari dei sinonimi e dei contrari dei tempi della scuola sono un primo passo in questa direzione, ma hanno la brutta tendenza a mettere assieme sinonimi anche con significati differenti (non tutti, ma quelli che si comportano bene non ci stanno, nella cartella) ed è, comunque, difficile, fare dei controlli incrociati di congruenza senza averli in formato elettronico. I Synset, invece, sono insiemi di sinonimi con lo stesso significato. Per fare un esempio, il lemma prova comparirà in diversi Synset, insieme ai suoi sinonimi. Per es:

    • prova, evidenza, ... (nel senso di prova giudiziaria)
    • prova, esperimento, ...
    • prova, esame, ...
    • etc. etc.
    Ogni Synset rappresenta, quindi, nella pratica, un concetto diverso.

  • Di OpenCyc vi ho già parlato, e ne riparleremo più avanti, è troppo complesso per spiegarlo in 2 righe - spero riuscirete a dormire la sera, nel frattempo. Per ora ci basterà dire (tagliandola spessa) che la principale differenza rispetto a Wordnet sta, soprattutto, nell'aggiunta della capacità inferenziale e di informazioni necessarie a supportarla (Knowledge Base, una base di conoscenza, abbreviata con KB). Peraltro esiste, nella KB di OpenCyc, una esplicita relazione con Wordnet e le relazioni tra i lemmi ed i loro significati (esistono anche relazioni implicite, basate sulla struttura delle informazioni, ma non sono, solitamente, mappabili 1:1 con facilità).

A questo punto del post voi siete stremati, anche se io ho a malapena finito la premessa.
Questa volta, però, non vi grazio, altrimenti non arriveremo mai al punto.
Inoltre non ho ancora sentito suonare la campanella.

Per portare tutte queste considerazioni sul Web, è necessario un linguaggio che permetta di aggiungere informazioni strutturate alle pagine.

La proposta più consolidata, ad oggi, la si trova in un insieme di linguaggi formali (per lo più basati sull'XML) che, a diverso livello, permettono di definire le proprietà che descrivono i documenti (risorse identificabili da un URI) e di ricercarle.
Sempre andandoci giù pesante con le semplificazioni, si tratta di:
  • RDF: attraverso triple [soggetto, predicato, oggetto], anche complesse e composte (es: un oggetto può essere, a sua volta, una tripla - si parla di reificazione), si forniscono proprietà al documento

  • RDFS (RDF Schema): permette di descrivere le classi dell'RDF (ovvero, serve per definire meta-informazioni riguardanti i componenti della tripla di cui sopra), specificandone relazioni e vincoli

  • OWL (Ontology Web Language): siccome la coppia di cui sopra ha solo un limitato potere espressivo, viene proposto (via W3C e sempre nel contesto RDF) questo linguaggio, con l'intento di permettere di eseguire delle inferenze

  • SPARQL: il linguaggio W3C per eseguire query sull'RDF, di fatto una sorta di SQL portato su queste tecnologie

Niente male, come stack (non sono in grado di valutarlo ora, anche per mancanza di tempo, ma pongo lo stesso la domanda per chi fosse in grado di rispondermi: non sarebbe più semplice usare un solo linguaggio come CycL, quello usato per OpenCyc? è veramente più complesso da imparare, o stiamo solo nascondendoci dietro alla sintassi per problemi più seri che interessano la semantica? anche l'espressività ne guadagnerebbe, o no? non piace il fatto che si tratti di una proposta di una sola azienda e che il gap per creare simili motori sia difficile da colmare?)

A questi dobbiamo aggiungere un vocabolario condiviso. Qualcuno suggerisce che URI che puntano alla Wikipedia potrebbero fare al caso, altri (compreso il W3C) propongono vocabolari più specifici.

E' importante notare che non si tratta di sola teoria, ma esistono già tool che trattano queste problematiche (es: Jena, un framework per il Web Semantico in Java, che è in grado di gestire RDF, RDFS, OWL, SPARQL e contiene già un motore inferenziale - realizzato dagli HP Labs, ma presenta licenza apache-like).

Tutto risolto? Veramente no: restano aperti problemi pratici importanti:
  • bisogna comunque partire da informazioni corrette, alla base, altrimenti otterremo ragionamenti non corretti. Ovvero, anche in perfetta buona fede è facile ricadere nelle ambiguità del linguaggio naturale. In generale, per costruire una ontologia in un ambito ristretto, tipico di una Intranet e limitandosi ad argomenti tecnici, ci possono volere mesi/uomo (infatti, sono allo studio classificazioni automatiche). Approfondiremo meglio questi aspetti quando parleremo dell'enorme sforzo portato avanti su OpenCyc (anche se in ambito più complesso ed esteso, ovvero sulla KB alla base del senso comune) e delle best practice che da là sono emerse. Vi anticipo che non è pane per Web Designer, ma per ingegneri della conoscenza. Questa sola considerazione fa parecchio pensare, IMHO, sulla possibilità di utilizzare nel breve le tecniche fin qui descritte su Internet in modo produttivo.

  • anche supponendo che le informazioni siano corrette alla fonte, come possiamo dare all'utente finale degli strumenti semplici da usare che gli permettano di eseguire ricerche mirate? Di fargli usare SPARQL non se ne parla nemmeno (sarebbe come dire: smettiamo di fare interfacce grafiche per i vostri gestionali, imparatevi l'SQL e arrangiatevi a farvi le query da soli). Non è che l'utente finale preferirà
    una risposta potenzialmente errata e sporca (che, tutto sommato, capita più raramente di quanto si voglia far credere, soprattutto in ambiti ristretti, che sono quelli su cui oggi è affrontabile un discorso di ontologie) tipica di un motore di ricerca, che trovarsi di fronte ad interfacce complesse da utilizzare?

  • veridicità ed affidabilità delle informazioni: dovremmo prevedere una sorta di certificatore? quante risorse potrebbero servire per validare tutti i documenti immessi? Serve, comunque, un confronto semantico, altrimenti ricadiamo nella semplice verifica incrociata, già eseguita dai principali motori di ricerca, tra meta tag nell'head dell'HTML con quanto contenuto nel body

L'abbiamo presa da un punto di vista più serio della volta che vi ho parlato dell'AIML, ma i risultati sono quasi gli stessi: forse serve qualcosa di più potente ed automatizzabile. Ancora una volta, è un mio parere personalissimo, rischiamo di dover ricadere verso ambiti più legati all'AI. Quanto siamo lontano dal far comprendere il linguaggio al computer?

Forse meno di quanto pensate.
Forse più di quanto penso io (bisogna ben tenere in conto il teorema di Hofstadter -
Ci vuole sempre di più di quello che ti aspetti, anche se tieni in conto la Legge di Hofstadter
- per tacer di Murphy).

Come già minacciato, per finire quelli che sono sopravvissuti a questo post, torneremo ancora su questi argomenti parlando almeno di Wordnet (e suo figlio, Eurowordnet, che potrebbe tornare utile per le traduzioni - potendo comprare la licenza, s'intende...), Conceptual Dependency di Shank e OpenCyc.

Se un giorno di questi sono di buona magari vi parlo di approcci più leggeri, per iniziare a fare qualcosa, per esempio utilizzando bene Lucene, anche con le nuove funzionalità di stemming recepite da Snowball, ma non contateci troppo.

Bye
    Depa

7 commenti:

Anonimissimo ha detto...

Scusa, io ti avevo già perso a "abduzione" che per me che vivo su questo pianeta era una parola nuova. Ma ti giuro sono andato su Wiki per leggere la spiegazione e, ovviamente non ho capito nulla, o meglio, per me "abduzione" = "deduzione". Insomma è una deduzione di chi vuol fare il figo.

Poi ho proseguito e sono arrivato fino a "Tutto risolto? Veramente no" ma ho dovuto desistere. Mi spiace vermente che tutto non sia risolto ma credo che io non vi/li potrò aiutare.
Mi spiace davvero.

Cercherò in futuro di leggere altri post, ma mi sa che la mia laurea in ingegneria rigorosamente con la i minuscola, non mi basti.
La mia mente obnubilata non ce la fa.

Depa ha detto...

Post un po' pesante, eh?
Chiariamo in due parole, semplificando (al solito, si fa per dire...):
- deduzione, induzione ed abduzione sono le 3 inferenze (modi di ragionare) che utilizziamo; tutti i modi di ragionare che conosciamo ricadono in queste categorie, con diverse varianti
- deduzione: partendo dalle premesse, si arriva alle conclusioni, nell'ipotesi che le prime siano certezze. Es:
- Premesse: Depa è un uomo, tutti gli uomini sono mortali
- Conclusioni: Depa è mortale
Notare che le conclusioni derivano SOLO dalle premesse e da logica applicata alle premesse.
Per questo tipo di inferenze, esistono algoritmi ben noti. Il problema principale è l'efficienza, in presenza di grandi quantità di dati

- abduzione: dagli effetti, si risale alle cause. Tipiche abduzioni: diagnosi, investigazione poliziesca (Sherlock Holmes, erroneamente famoso per le deduzioni, in realtà è abilissimo nelle abduzioni)

- induzione: da una serie di fatti, si estrae una regola. Es: perchè sappiamo che, salvo menomazioni, i cani hanno 4 zampe? A parte che ce lo hanno detto, è perchè ne abbiamo visti tanti con 4 zampe. Abbiamo anche delle regole per le menomazioni, quindi se ne vediamo uno con 3, poverino, se con meno, accidenti cosa gli hanno fatto, se lo vediamo con 10, è colpa dell'inquinamento (o dobbiamo davvero cambiare pusher).

Le ultime due portano a risultati incerti, solitamente. Esistono algoritmi anche per queste inferenze, ma sono, tipicamente, applicabili ad alcuni domini, meno ad altri, soprattutto per l'induzione.
A parità di problema, comunque, ho visto dei programmi performare meglio di molte persone, anche in questi ambiti.

giampi ha detto...

Ma ci sono esempi di programmi che estraggono la semantica da un testo?

Quello che mi piacerebbe trovare è qualcuno che parserizzato un testo mi sappia inserire "concetti" in OpenCyc.

Ma se esistesse un oggetto del genere vorrebbe dire che sa comprendere il testo. A questo punto avrebbe ancora bisogno di rapresentarlo con una determinata sintassi (OWL, RDF, ecc...)

Altro quesito. Costrutita l'ontologia, possiamo solo interrogarla o riesce a ottenere nuovi fatti da quelli a sua disposizione? Questo sarebbe per me intelligente, andare al di là delle risposte: ragionare/pensare.

Grazie per il post.
Giampiero Granatella

Depa ha detto...

Giampi,
sì, ovviamente ci sono esempi di estrazioni di semantica da un testo (per esempio quelli citati in altri post che usano la Conceptual Dependency). Lo si riesce a fare, in ambiti ristretti, almeno dalla fine degli anni '70.
Prova una ricerca tipo 'estrazione semantica testo' su Google...

Credo che l'inserimento di concetti in OpenCyc (e, forse, anche di Cyc, per il quale, peraltro, più o meno chiaramente fanno pensare che siano in grado di farlo) in seguito ad una analisi del testo piacerebbe anche agli autori di OpenCyc ;)
Probabilmente sono già in grado di farlo in casi ristretti.
In questo caso sarebbe forse più semplice rappresentare il testo in CycL, ovviamente, al posto che con un altro linguaggio.

L'ultima domanda che poni apre un mondo di risposte. In breve, ma troppo semplicisticamente, una ontologia puoi interrogarla (percorrerla, browsarla), ma puoi anche aggiungerci un inference engine e riuscire ad ottenere qualcosa di più.
Come vuole e riesce a fare il solito OpenCyc (ma non è il solo)...

Anonimo ha detto...

ciao,
mi sto approcciando al Web Semantico, allutilizzo di OWL e Jena. volevo kiederti se è possibile con Jena fare l'update di ontologie...

grazie 1000
ciaociaociao

Depa ha detto...

La domanda è forse un po' ampia e generale. Fortunatamente, direi, visto che non è che io sia così esperto. Gente che ne sa mi dice che sia possibile. Rovistando nella documentazione (in particolare quella che approfondisce l'ontology API) direi che potrebbe essere ottenuto attraverso il Document Manager (OntDocumentManager) e le classi OntResource (e relativi metodi add<property> e simili) e OntProperty. Almeno per iniziare...
Comunque mi sembra che la documentazione di Jena sia veramente ben fatta.
Spero di essere stato d'aiuto.
Bye
Depa

Depa ha detto...

Meglio approfondire anche con a-box e t-box.
Mi sono ricordato che me lo avevano detto e ho visto questo link subito dopo aver postato il commento.