0

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

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) ... 

怎么了?

4

2 回答 2

2

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

您使用该wordnet软件包的方式存在几个问题,如下所述,但最重要的是,即使在解决了这些问题之后,wordnet除了胡言乱语我什么也做不了。

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

第二:看起来getTermFilter(...)需要一个字符参数x。您设置它的方式是传递一个 type 的对象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,出于某种原因,我建议您联系包作者。

于 2014-10-04T22:53:12.573 回答
2

因此,这并不能解决您对wordnet. 这使用了西北大学开发的 MorphAdorner API。您可以在此处找到详细文档。在下面的代码中,我使用他们的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 约定。

于 2014-10-04T23:11:22.797 回答