2013-10-14 18 views
5

Próbuję uzyskać antonimy słów przy użyciu pakietu wordnet. Działa to dla niektórych słów, zwracając błąd, którego naprawdę nie dostaję dla innych. Funkcja jest w zasadzie tylko przykładem użycia z dokumentacji pakietu zawartej w funkcji.Uzyskiwanie antonimów za pomocą pakietu 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. 

Moim celem jest, aby mieć funkcję, że mogę lapply wektorów słów, aby uzyskać ich antonimy jako wyjście, podobnie jak funkcji synonimów dostarczonych przez pakiet.

Dzięki za wszelkie pomysły :)

edit: jestem na: OSX 10.8.5, wordnet opakowaniu (R) wordnet_0.1-9 i wordnet 3.0_3 (system szerokiej poprzez DarwinPorts) , rJava 0.9-4, R wersja 3.0.1 (2013-05-16).

Odpowiedz

2

Twój problem polega na tym, że świetnie nie ma bezpośrednich antonimów. Jeśli masz look up great in WordNet Search, zobaczysz, że wszystkie antonimy są pośrednie przez inne słowo. Najpierw musisz przejść przez relacje podobne do i wyszukać tam antonimy. Przeciwnie, happy has a direct antonym (w przeciwieństwie do).

może chcesz złapać ten konkretny błąd z 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

Dziękuję bardzo! Opublikuję, jeśli dodatkowo udoskonalę funkcję, ale to na pewno świetny początek. – Matthias

Powiązane problemy