2013-10-14 13 views
5

Sto cercando di ottenere antonimi di parole usando il pacchetto wordnet. Funziona per alcune parole mentre restituisco un errore che non ottengo davvero per gli altri. La funzione è fondamentalmente solo l'esempio di utilizzo dalla documentazione del pacchetto incapsulato in una funzione.Ottenere antonimi usando il pacchetto R Wordnet

# The function: 

antonyms <- function(x){ 
    filter <- getTermFilter("ExactMatchFilter", x, TRUE) 
    terms <- getIndexTerms("ADJECTIVE", 5, filter) 
    synsets <- getSynsets(terms[[1]]) 
    related <- getRelatedSynsets(synsets[[1]], "!") 
    sapply(related, getWord) 
} 

# Some words work while others return an error: 

> antonyms("happy") 
[1] "unhappy" 
> antonyms("great") 
Error in .jcall(l, "Ljava/util/Iterator;", "iterator") : 
    RcallMethod: invalid object parameter 

# The Error is caused by the "related" step. 

Il mio obiettivo è quello di avere una funzione che posso lapply vettori di parole al fine di ottenere i loro contrari come uscita, molto simile alla funzione di sinonimi fornito dal pacchetto.

Grazie per tutte le idee :)

edit: Sono su: OSX 10.8.5, pacchetto WordNet (in R) wordnet_0.1-9 e WordNet 3.0_3 (a livello di sistema attraverso MacPorts) , rJava 0.9-4, R versione 3.0.1 (2013-05-16).

risposta

2

Il tuo problema è che grande non ha antonimi diretti. Se hai look up great in WordNet Search, vedrai che tutti i contrari sono indiretti tramite un'altra parola. Dovresti prima andare oltre il simile alle relazioni e cercare gli antonimi lì. Al contrario, happy has a direct antonym (contrario a).

si potrebbe desiderare di prendere questo errore specifico con un tryCatch:

antonyms <- function(x){ 
    filter <- getTermFilter("ExactMatchFilter", x, TRUE) 
    terms <- getIndexTerms("ADJECTIVE", 5, filter) 
    synsets <- getSynsets(terms[[1]]) 
    related <- tryCatch(
     getRelatedSynsets(synsets[[1]], "!"), 
     error = function(condition) { 
      message("No direct antonym found") 
      if (condition$message == "RcallMethod: invalid object parameter") 
       message("No direct antonym found") 
      else 
       stop(condition) 
      return(NULL) 
     } 
    ) 
    if (is.null(related)) 
     return(NULL) 
    return(sapply(related, getWord)) 
} 
+1

Grazie così tanto! Pubblicherò se raffinerei ulteriormente la funzione, ma questo è certamente un ottimo inizio. – Matthias