2014-10-04 1 views
0

저는 워드 네트워크 라이브러리를 사용하여 R의 문서 모음을 평행 화하려고합니다. 이 코드는 다음과 같습니다.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) ... 

잘못 무엇을?

+0

정확히'getLemma'는 무엇입니까?위의 코드에서 이것을 보자. – Rentrop

+1

그것은'wordnet' 패키지의 일부이다. – jlhoward

+1

@ntrax - 나는'getTermFilter (..., x)'가 문자 인자를 기대한다고 생각한다. TextDocument 객체를 전달 중입니다. 'getTermFilter ("ContainsFilter", as.character (x), TRUE)'를 시도하십시오. 내가 이것을 시도하면 (간단한 문서에 * 당신은 어떤 데이터도 제공하지 않았다 !!!), 그 함수는 작동한다. – jlhoward

답변

2

이렇게하면 wordnet을 사용하지는 않지만 사용할 수있는 lemmatizing 옵션이 제공됩니다 (더 나은 IMO ...). 이것은 Northwestern University에서 개발 된 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  .  .    .  .    . 
# ... 

난 그냥 첫 번째 "문서"의 lemmatization을 보여주고 있습니다. partsOfSpeech은 NUPOS 협약을 따릅니다.

+0

우선, 많은 도움을 주신 모든 분들께 감사드립니다! MorphAdorner 웹 서비스는 매우 직관적 인 것 같습니다! 제안에 감사드립니다! – ntrax

2

이 질문에 대한 대답은 있지만 실제로 문제를 해결하지는 않습니다. 솔루션을 제공하려고 시도하는 다른 해결책 (다른 대답)이 있습니다.

아래에 설명 된 wordnet 패키지를 사용하는 방법에는 몇 가지 문제가 있지만 결론적으로이 주소를 지정한 후에도 wordnet에 횡설수설을 일으키지 않습니다.

첫 번째로 : wordnet 패키지를 R에 설치할 수는 없으며 컴퓨터에 Wordnet을 설치하거나 사전을 다운로드해야합니다. 그런 다음 패키지를 사용하기 전에 initDict("path to wordnet dictionaries")을 실행해야합니다.

두 번째 : getTermFilter(...)x의 문자 인수가 필요합니다. 설정 한대로 PlainTextDocument 유형의 객체를 전달하고 있습니다. 따라서 포함 된 텍스트로 변환하려면 as.character(x)을 사용해야합니다. 그렇지 않으면 질문에 java 오류가 발생합니다.

세 번째 : getTermFilter(...)은 단일 단어 (또는 구)를 예상합니다. 예를 들어, "This is a phrase"를 getTermFilter(...)으로 전달하면 사전에서 "This is a phrase"를 찾을 것입니다. 물론 찾을 수는 없으므로 getIndexTerms(...)NULL이고 getLemma(...)은 실패합니다 ... 따라서 PlainTextDocument의 텍스트를 먼저 구문 분석해야합니다.

마지막으로 구두점을 제거하는 것이 좋습니다. 예를 들어 "it 's"는 "its"로 변환 될 것입니다. 그러나 이들은 다른 의미를 지닌 다른 단어이고, 그들은 다르게 lemmatize합니다.

모든이를 압연 : 당신이 볼 수 있듯이, 출력은 여전히 ​​횡설수설입니다

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" 

. "이것"은 "엉겅퀴"로 등화된다. 사전을 부적절하게 구성했기 때문에 운이 좋을 수도 있습니다. 어떤 이유로 든 wordnet에게 헌신하는 경우 패키지 작성자에게 문의하시기 바랍니다.

관련 문제