Как получить все гипонимы для всех синсетов в Wordnet с пакетом wordnet в R

Я пытаюсь получить все гипонимы для каждого глагола в Wordnet. Поскольку в NLTK в Python отсутствует около 2000 глаголов, мне приходится делать это в R, и у меня есть некоторые серьезные проблемы, которые я не могу решить самостоятельно. Я хотел бы обобщить следующее решение:

Как получить иерархию слов (например, гиперонимы, гипонимы) с использованием wordnet в R

По одному слову за раз, он работает безупречно. (Чтобы заставить его работать, файлы словаря можно загрузить по адресу https://wordnet.princeton.edu/download/current-version (только для базы данных))

library(wordnet)
setDict("path/to/dict/")

filter <- getTermFilter("ExactMatchFilter", "accept", TRUE)
terms <- getIndexTerms("VERB", 50, filter)
synsets <- getSynsets(terms[[1]])
related <- getRelatedSynsets(synsets[[1]],"~")
hyponyms_1  <- getRelatedSynsets(synsets[[1]], "~")
hypos_1 <- sapply(hyponyms_1, getWord) # to extract the words from the synsets
hyponyms_2  <- getRelatedSynsets(hyponyms_1[[1]], "~") # get the hyponyms of the hyponyms
hypos_2 <- sapply(hyponyms_2, getWord)
hyponyms_3  <- getRelatedSynsets(hyponyms_2[[1]], "~")
hypos_3 <- sapply(hyponyms_3, getWord)

Однако это не работает по нескольким причинам:

  1. Если у слова нет гипонима, результатом будет пустой список (list(0)), который я не могу обработать. Я мог бы попробовать проверить это с помощью if(length(hyponym_1) == 0){ ...} , но это, похоже, работает по-другому на более низких уровнях, поскольку попытка создать список из пустого списка даже не создает этот объект, поэтому проверка невозможна.
  2. Все мои усилия приводят к ошибкам, таким как выход за пределы индекса, и не работают с уровня 3 и ниже. Вот:
myList <- list()

for(i in 1:length(synsets)){
  hyponyms_1  <- getRelatedSynsets(synsets[[1]], "~")
  hypo_1 <- sapply(hyponyms_1, getWord)
  try(myList[[i]] <- hypo_1[[i]], silent = TRUE)
}
# all elements that are character are one level up, the list is level 2
for(j in 1:length(hyponyms_1)){
  hyponyms_2  <- getRelatedSynsets(hyponyms_1[[j]], "~")
  hypo_2 <- sapply(hyponyms_2, getWord)
  try(myList[[j]] <- c(list(myList[[j]]), list(hypo_2)), silent = TRUE)  
}
for(k in 1:length(hyponyms_2)){
  hyponyms_3  <- getRelatedSynsets(hyponyms_2[[k]], "~")
  hypo_3 <- sapply(hyponyms_3, getWord)
  try(myList[[k]] <- c(list(myList[[k]]), list(hypo_3)), silent = TRUE)  
}
for(l in 1:length(hyponyms_3)){
  hyponyms_4  <- getRelatedSynsets(hyponyms_3[[l]], "~")
  hypo_4 <- sapply(hyponyms_4, getWord)
  try(myList[[l]] <- c(list(myList[[l]]), list(hypo_3[[k]]), list(hypo_4)), silent = TRUE)  
}

Итак, я ищу цикл для такой структуры (дерева): 1-1a-ничего 2-2a-ничего-2b-2c-ничего 3-3a-3b-3c-ничего-3d-ничего и т. д.

Идеальным решением является вложенный список всех глаголов (~14000), каждый со всеми его гипонимами. Было бы здорово, если бы кто-нибудь мог мне помочь! Мне все равно, с базой R, с apply, с tidyverse - все ценится (решение также может состоять в том, чтобы работать с гипернимами, т.е. наоборот)!


person litotes    schedule 07.11.2020    source источник