Подсчитайте количество гиперонимных уровней в R (wordnet)

У меня есть список слов. Используя пакет wordnet в R, я хотел бы вычислить общее количество гиперонимных уровней для каждого слова в списке.

Например, предположим, что список содержит одно слово, "яблоко", и эта сеть wordnet кодирует следующую (стилизованную) иерархию:

apple -> fruit, tree, pie, company -> food, vegetation, dessert, ... -> entity (top level)

Независимо от количества гиперонимов на каждом уровне, всего три уровня выше "яблока". Другими словами, мы должны подняться ровно на три гипернимических уровня от "яблока", прежде чем мы достигнем верхнего уровня.

Я хочу подсчитать количество гипернимических уровней для каждого слова. Я собрал следующие MWE:

x <- c("apple","tree")
count <- 0

for (i in x) { 

filter <- getTermFilter(type="ExactMatchFilter", word="i", ignoreCase=TRUE)
terms <- getIndexTerms("NOUN", 15, filter)
synsets <- getSynsets(terms[[1]])

hyper_i <- getRelatedSynsets(synsets[[1]],"@")         # @ designates hypernym search 
repeat {
  hyper_i <- getRelatedSynsets(hyper_i[[1]],"@")       # iterate next level
  print(sapply(hyper_i, getWord))                      # show us the hypernyms in this level
  count = count+1                                      # advance the levels count
  if (length(hyper_i)==0) {                            # stop when reach the top
    break
  }
}
print(sprintf("The loop repeated %s times.", count))

}

К сожалению, результаты бессмысленны:

[[1]]
[1] "produce"         "green goods"     "green groceries" "garden truck"   

[[2]]
[1] "fruit"

     [,1]        
[1,] "food"      
[2,] "solid food"
[1] "solid"
     [,1]       
[1,] "substance"
[2,] "matter"   
[1] "physical entity"
[1] "entity"
list()
[1] "The loop repeated 7 times."
     [,1]            
[1,] "vascular plant"
[2,] "tracheophyte"  
     [,1]        
[1,] "plant"     
[2,] "flora"     
[3,] "plant life"
     [,1]      
[1,] "organism"
[2,] "being"   
     [,1]           
[1,] "living thing" 
[2,] "animate thing"
     [,1]             
[1,] "object"         
[2,] "physical object"
[1] "physical entity"
[1] "entity"
list()
[1] "The loop repeated 15 times."

Во-первых, у меня проблемы с интерпретацией sapply()результаты для гиперонимов на каждом уровне; похоже, что для "яблока" больше 7 уровней, а для "дерева" меньше 15, так что это неправильно... Во-вторых, согласно этому выводу, "дерево" находится дальше от вершины (т.е. имеет больше промежуточных гиперонимов), чем "яблоко", но на самом деле в естественном языке "дерево" должно быть гиперонимом "яблоко".

Что мне не хватает? Благодарен за любую помощь!

0 ответов

Другие вопросы по тегам