JAWS: un’API Java per ricerche in WordNet

JAWS: un’API Java per ricerche in WordNet

In questo articolo vedremo una libreria Java che ci permette di interagire con il database WordNet denominata JAWS (Java API for WordNet Searching). Esistono diverse API per interfacciarsi a WordNet sia per Java che per altri linguaggi, per un elenco completo basta visitare il seguente indirizzo:http://wordnet.princeton.edu/wordnet/related-projects/una libreria Java molto utilizzata che merita una menzione è senza dubbio JWNL (chiamata anche JWordNet), che è possibile visionare all'indrizzo:http://sourceforge.net/apps/mediawiki/jwordnet/index.php?title=Main_Page

SimMetrics: misurare la similarità tra stringhe in Java
Sviluppare con il Google Web Toolkit (GWT)
Quartz Scheduler: integrazione con una Web Application

In questo articolo vedremo una libreria Java che ci permette di interagire con il database WordNet denominata JAWS (Java API for WordNet Searching).

Esistono diverse API per interfacciarsi a WordNet sia per Java che per altri linguaggi, per un elenco completo basta visitare il seguente indirizzo:

http://wordnet.princeton.edu/wordnet/related-projects/

una libreria Java molto utilizzata che merita una menzione è senza dubbio JWNL (chiamata anche JWordNet), che è possibile visionare all’indirizzo:

http://sourceforge.net/apps/mediawiki/jwordnet/index.php?title=Main_Page

Per poter utilizzare JAWS dobbiamo aver installato una versione di WordNet (2.1 o l’ultima versione 3.0) in versione completa (quindi non solo il database!), avere una versione di Java superiore o uguale alla 1.4 e aver configurato la directory di base del database di WordNet.

Scarichiamo la libreria .jar a questo indirizzo:

http://lyle.smu.edu/~tspell/jaws/jaws-bin.jar

Per completare questo task possiamo operare in diversi modi a seconda di come lanceremo il nostro codice, supponendo che il database si trovi in “C:WordNet-3.0dict”:

  1. includiamo nel classpath la libreria jawl-bin.jar e settiamo una proprietà “wordnet.database.dir” nella classe System utilizzando il metodo setProperty () come in questo esempio : System.setProperty(“wordnet.database.dir”, “C:WordNet-3.0dict”);
  2. se invece lanciamo i nostri codici all’interno di un IDE come Eclipse dobbiamo includere la libreria jaws-bin.jar nel buld path del nostro progetto e poi specificare come argomento della Virtual Machine (VM arguments) il valore: -Dwordnet.database.dir=C:WordNet-3.0dict.  Per far questo clicchiamo col destro sul progetto java e poi su Run as -> Run Configuration :
Settiamo gli argomenti della VM lanciando Run Configurations…

si aprirà una schermata dove setteremo gli argomenti della VM:

Inseriamo il path del nostro dizionario in VM arguments
  • se invece lanciamo i nostri codici da linea di comando ricordiamoci di indicare il classpath della libreria JAWL e il percorso del dizionario come in questo esempio: java -classpath .;C:myworkcodejaws-bin.jar -Dwordnet.database.dir=C:WordNet-3.0dict MyApp.
  • Veniamo ora al codice: la prima cosa da fare per utilizzare WordNet nel nostro codice Java è ottenere una istanza della Classe WordNetDatabase:

    WordNetDatabase database = WordNetDatabase.getFileInstance();
    

    possiamo a questo punto ricavare tutti i Synset di una parola (o meglio di un lemma) utilizzando questo metodo:

    Synset[] synsets = database.getSynsets("dog", SynsetType.NOUN);
    

    ricaviamo cioè tutti i Synset (di tipo Nome) del lemma dog. Possiamo a questo punto iterare sui risultati ottenuti e ricavare tutte le forme (lemmi) di uno stesso Synset (quindi legati da una relazione sintattica di sinonimia), utilizziamo un doppio ciclo for (il ciclo esterno itera sui Synset, quello interno ricava i lemmi dello stesso Synset, quando termina richiama il metodo getDefinition() che ritorna la descrizione semantica del  Synset):

    for (int i = 0; i < synsets.length; i++){
       String[] wordForms = synsets[i].getWordForms();
       for (int j = 0; j < wordForms.length; j++){
          System.out.print((j > 0 ? ", " : "") + wordForms[j]);
       }
     System.out.println(": " + synsets[i].getDefinition());
    }
    
    for (int i = 0; i &amp;lt; synsets.length; i++)
    {
    String[] wordForms = synsets[i].getWordForms();
    for (int j = 0; j &amp;lt; wordForms.length; j++)
    {
    System.out.print((j &amp;gt; 0 ? ", " : "") +&amp;nbsp;wordForms[j]);
    }
    System.out.println(": " + synsets[i].getDefinition());
    }
    

    Per ogni Synset possiamo navigare attraverso le relazioni semantiche che li legano, ad esempio andando ad esplorare le relazioni di Iponimia e Iperonimia, per fare questo invochiamo i metodi getHyponyms() e getHypernyms() rispettivamente. Queste ultime relazioni sono tipiche dei nomi quindi bisogna effettuare un Cast del Synset a NounSynset prima di poter invocare il metodo, è possibile ottenere Synset appartenenti ad una particolare categoria sintattica utilizzando questo metodo:

    Synset[] synsets = database.getSynsets(wordForm, SynsetType.NOUN);
    

    dopodichè bisogna effettuare un cast sulle singole istanze ritornate:

    NounSynset nounSynset;
    NounSynset[] hyponyms;
    for (int i = 0; i < synsets.length; i++) {
       nounSynset = (NounSynset) (synsets[i]);
       hyponyms = nounSynset.getHypernyms();
       System.out.println(nounSynset.getWordForms()[0] +
       ": " + nounSynset.getDefinition() + ") ha " + hyponyms.length + " 
       Iponimi");
    for (int j = 0; j < hyponyms.length; j++) {
       System.out.print((j > 0 ? ", " : "") +
    hyponyms[j].getWordForms()[0]);
    }
    System.out.print("n");
    }
    

    I VerbSynset hanno  il metodo getHypernyms() mentre definiscono per gli Iponimi il metodo getTroponyms() (un verbo è troponimo di un altro verbo quando esprime un particolare modo, ad esempio camminare -> muoversi)

    COMMENTS

    WORDPRESS: 0