【问题标题】:Extracting synonymous terms from wordnet using synonym()使用 synonym() 从 wordnet 中提取同义词
【发布时间】:2011-09-22 09:24:07
【问题描述】:

假设我通过 wordnet 中的 synonyms() 函数拉取“帮助”的同义词并得到以下信息:

Str = synonyms("help")    
Str
[1] "c(\"aid\", \"assist\", \"assistance\", \"help\")"     
[2] "c(\"aid\", \"assistance\", \"help\")"                 
[3] "c(\"assistant\", \"helper\", \"help\", \"supporter\")"
[4] "c(\"avail\", \"help\", \"service\")"  

然后我可以使用

得到一个字符串
unique(unlist(lapply(parse(text=Str),eval)))

最后是这样的:

[1] "aid"        "assist"     "assistance" "help"       "assistant"  "helper"     "supporter" 
[8] "avail"      "service"

上述过程是由 Gabor Grothendieck 提出的。他/她的解决方案很好,但我仍然想不通如果我将查询词更改为“公司”、“男孩”或其他人,会出现错误消息。

一个可能的原因可能是由于“公司”的“第六”同义词(请参见下文)是一个单独的术语,并且不遵循“c(\”company\“)”的格式。

synonyms("company")

[1] "c(\"caller\", \"company\")"                                    
[2] "c(\"company\", \"companionship\", \"fellowship\", \"society\")"
[3] "c(\"company\", \"troupe\")"                                    
[4] "c(\"party\", \"company\")"                                     
[5] "c(\"ship's company\", \"company\")"                            
[6] "company"

谁能帮我解决这个问题。 非常感谢。

【问题讨论】:

  • 我写了一个可行的代码,分享给大家:unique(Str[which(str_detect(Str,"[(]")==FALSE)], unlist(lapply(parse(text=Str[其中(str_detect(Str,"[(]")==TRUE)]),eval))))

标签: r nlp wordnet


【解决方案1】:

您可以通过创建一个使用 R 的 try 机制来捕获错误的小辅助函数来解决此问题。在这种情况下,如果eval产生错误,则返回原始字符串,否则返回eval的结果:

创建一个辅助函数:

evalOrValue <- function(expr, ...){
  z <- try(eval(expr, ...), TRUE)
  if(inherits(z, "try-error")) as.character(expr) else unlist(z)
}

unique(unlist(sapply(parse(text=Str), evalOrValue)))

生产:

[1] "caller"         "company"        "companionship" 
[4] "fellowship"     "society"        "troupe"        
[7] "party"          "ship's company"

我复制了你的数据,然后用dput在这里复制了:

Str <- c("c(\"caller\", \"company\")", "c(\"company\", \"companionship\", \"fellowship\", \"society\")", 
"c(\"company\", \"troupe\")", "c(\"party\", \"company\")", "c(\"ship's company\", \"company\")", 
"company")

【讨论】:

    【解决方案2】:

    这些同义词的形式看起来像一个表达式,因此您应该能够按照您的说明解析它们。但是:当我执行上面的原始代码时,我从同义词调用中得到一个错误,因为你没有包含词性参数。

    > synonyms("help")
    Error in charmatch(x, WN_synset_types) : 
      argument "pos" is missing, with no default
    

    注意synonyms 的代码使用了getSynonyms,并且它的代码有一个unique,因此不再需要您正在进行的所有预处理(如果您更新);:

    > synonyms("company", "NOUN")
    [1] "caller"         "companionship"  "company"       
    [4] "fellowship"     "party"          "ship's company"
    [7] "society"        "troupe"        
    > synonyms
    function (word, pos) 
    {
        filter <- getTermFilter("ExactMatchFilter", word, TRUE)
        terms <- getIndexTerms(pos, 1L, filter)
        if (is.null(terms)) 
            character()
        else getSynonyms(terms[[1L]])
    }
    <environment: namespace:wordnet>
    
    > getSynonyms
    function (indexterm) 
    {
        synsets <- .jcall(indexterm, "[Lcom/nexagis/jawbone/Synset;", 
            "getSynsets")
        sort(unique(unlist(lapply(synsets, getWord))))
    }
    <environment: namespace:wordnet>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多