【问题标题】:R error in lemmatizzation a corpus of document with wordnet使用 wordnet 对文档语料库进行词形还原时的 R 错误
【发布时间】:2014-10-04 18:51:39
【问题描述】:

我正在尝试使用 wordnet 库对 R 中的文档语料库进行词法分析。这是代码:

corpus.documents <- Corpus(VectorSource(vector.documents))
corpus.documents <- tm_map(corpus.documents removePunctuation)

library(wordnet)
lapply(corpus.documents,function(x){
  x.filter <- getTermFilter("ContainsFilter", x, TRUE)
  terms <- getIndexTerms("NOUN", 1, x.filter)
  sapply(terms, getLemma)
})

但是在运行时。我有这个错误:

Errore in .jnew(paste("com.nexagis.jawbone.filter", type, sep = "."), word,  :
java.lang.NoSuchMethodError: <init> 

这些是堆栈调用:

5 stop(structure(list(message = "java.lang.NoSuchMethodError: <init>", 
call = .jnew(paste("com.nexagis.jawbone.filter", type, sep = "."), 
    word, ignoreCase), jobj = <S4 object of class structure("jobjRef", package 
="rJava")>), .Names = c("message", 
"call", "jobj"), class = c("NoSuchMethodError", "IncompatibleClassChangeError",  ... 
4 .jnew(paste("com.nexagis.jawbone.filter", type, sep = "."), word, 
ignoreCase) 
3 getTermFilter("ContainsFilter", x, TRUE) 
2 FUN(X[[1L]], ...) 
1 lapply(corpus.documents, function(x) {
x.filter <- getTermFilter("ContainsFilter", x, TRUE)
terms <- getIndexTerms("NOUN", 1, x.filter)
sapply(terms, getLemma) ... 

怎么了?

【问题讨论】:

  • getLemma 到底是什么?在上面的代码中看不到它
  • 它是包wordnet的一部分
  • @ntrax - 我认为getTermFilter(...,x) 需要一个字符参数。您正在传递一个 TextDocument 对象。试试getTermFilter("ContainsFilter", as.character(x), TRUE)。当我尝试这个(在一个简单的文档上 - 您没有提供任何数据!!!)时,该功能有效。

标签: r wordnet lemmatization


【解决方案1】:

因此,这并不能解决您对wordnet 的使用问题,但确实提供了一个可能适合您的词形还原选项(更好的是,IMO...)。这使用了西北大学开发的 MorphAdorner API。你可以找到详细的文档here。在下面的代码中,我使用了他们的Adorner for Plain Text API

# MorphAdorner (Northwestern University) web service
adorn <- function(text) {
  require(httr)
  require(XML)
  url <- "http://devadorner.northwestern.edu/maserver/partofspeechtagger"
  response <- GET(url,query=list(text=text, media="xml", 
                                 xmlOutputType="outputPlainXML",
                                 corpusConfig="ncf", # Nineteenth Century Fiction
                                 includeInputText="false", outputReg="true"))
  doc <- content(response,type="text/xml")
  words <- doc["//adornedWord"]
  xmlToDataFrame(doc,nodes=words)
}

library(tm)
vector.documents <- c("Here is some text.", 
                      "This might possibly be some additional text, but then again, maybe not...",
                      "This is an abstruse grammatical construction having as it's sole intention the demonstration of MorhAdorner's capability.")
corpus.documents <- Corpus(VectorSource(vector.documents))
lapply(corpus.documents,function(x) adorn(as.character(x)))
# [[1]]
#   token spelling standardSpelling lemmata partsOfSpeech
# 1  Here     Here             Here    here            av
# 2    is       is               is      be           vbz
# 3  some     some             some    some             d
# 4  text     text             text    text            n1
# 5     .        .                .       .             .
# ...

我只是展示了第一个“文档”的词形还原。 partsOfSpeech 遵循 NUPOS 约定。

【讨论】:

  • 首先,非常感谢大家的帮助! MorphAdorner 网络服务似乎很有趣!谢谢你的建议!
【解决方案2】:

这回答了您的问题,但并不能真正解决您的问题。上面还有另一个解决方案(不同的答案)试图提供解决方案。

您使用wordnet 包的方式存在几个问题,如下所述,但最重要的是,即使在解决了这些问题之后,我也无法让wordnet 产生任何问题,除了乱码。

首先:你不能只在 R 中安装 wordnet 包,你必须在你的计算机上安装 Wordnet,或者至少下载字典。然后,在使用该包之前,您需要运行initDict("path to wordnet dictionaries")

第二:看起来getTermFilter(...) 需要x 的字符参数。按照您的设置方式,您正在传递一个PlainTextDocument 类型的对象。因此,您需要使用 as.character(x) 将其转换为包含的文本,否则您的问题中会出现 java 错误。

第三:看起来getTermFilter(...) 需要单个单词(或短语)。例如,如果您将“这是一个短语”传递给getTermFilter(...),它将在字典中查找“这是一个短语”。它当然不会找到它,所以getIndexTerms(...) 返回NULLgetLemma(...) 失败...所以你必须先将PlainTextDocument 的文本解析成单词。

最后,我不确定删除标点符号是否是个好主意。例如,“it's”会被转换成“its”,但它们是具有不同含义的不同词,它们的词形还原也不同。

汇总所有这些:

library(tm)
vector.documents <- c("This is a line of text.", "This is another one.")
corpus.documents <- Corpus(VectorSource(vector.documents))
corpus.documents <- tm_map(corpus.documents, removePunctuation)

library(wordnet)
initDict("C:/Program Files (x86)/WordNet/2.1/dict")
lapply(corpus.documents,function(x){
  sapply(unlist(strsplit(as.character(x),"[[:space:]]+")), function(word) {
    x.filter <- getTermFilter("StartsWithFilter", word, TRUE)
    terms    <- getIndexTerms("NOUN",1,x.filter)
    if(!is.null(terms)) sapply(terms,getLemma)
  })
})
# [[1]]
#                 This                   is                    a                 line                   of                 text 
#            "thistle"              "isaac"                  "a"               "line" "off-axis reflector"               "text" 

如您所见,输出仍然是乱码。 “This”被词形化为“thistle”等等。可能是我的字典配置不正确,所以你可能会有更好的运气。如果你致力于wordnet,出于某种原因,我建议你联系包作者。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 2018-01-05
    • 2015-09-10
    • 1970-01-01
    • 2019-08-01
    相关资源
    最近更新 更多