2013-11-04 1 views
3

나는 R의 tm 패키지를 사용하여 분류 문제에 많은 성공을 거뒀습니다. 나는 전체 자료 (findFreqTerms())를 통해 가장 빈번한 용어를 찾는 법을 알고 있지만 가장 빈번한 용어를 발견 할 수있는 문서 내에서는 아무것도 볼 수 없다. (나는 스톱 어라운드를 제거하고 스톱 어를 제거한 후에 스파 스 용어를 삭제하기 전에)를 코퍼스의 개별 문서에 저장합니다. apply()max 명령을 사용하여 시도했지만이 때문에 각 문서에서 용어 자체의 이름이 아닌 최대 횟수가 표시됩니다.코퍼스의 각 문서에서 가장 자주 찾는 용어

library(tm) 

data("crude") 
corpus<-tm_map(crude, removePunctuation) 
corpus<-tm_map(corpus, stripWhitespace) 
corpus<-tm_map(corpus, tolower) 
corpus<-tm_map(corpus, removeWords, stopwords("English")) 
corpus<-tm_map(corpus, stemDocument) 
dtm <- DocumentTermMatrix(corpus) 
maxterms<-apply(dtm, 1, max) 
maxterms 
127 144 191 194 211 236 237 242 246 248 273 349 352 
5 13 2 3 3 10 8 3 7 9 9 4 5 
353 368 489 502 543 704 708 
4 4 4 5 5 9 4 

생각 나게하기?

답변

4

벤의 대답은 당신이 요구 한 것을 보여줍니다. 그러나 당신이 요구 한 것이 현명한 지 확신하지 못합니다. 그것은 유대 관계를 설명하지 않습니다. 다음은 접근 방법이고 두 번째 방법은 the qdap package입니다. qdap의 경우 단어와 빈도가있는 데이터 프레임의 목록 인 단어가있는 목록을 제공합니다. unlist을 사용하면 첫 번째 옵션으로 lapply, 인덱싱 및 unlist과 qdap을 사용하여 나머지를 얻을 수 있습니다.

library(qdap) 
dat <- tm_corpus2df(crude) 
tapply(stemmer(dat$text), dat$docs, freq_terms, top = 1, 
    stopwords = tm::stopwords("English")) 
: qdap와

apply(dtm, 1, function(x) unlist(dtm[["dimnames"]][2], 
    use.names = FALSE)[x == max(x)]) 

옵션 # 2 :

옵션 # 1 : Corpus 원료에서 작동

으로 tapply을 입력하면 내용과 형식이 거의 동일합니다.

편집 : 추가 qdap의 야윈 사용하는 것입니다 예 :

FUN <- function(x) freq_terms(x, top = 1, stopwords = stopwords("English"))[, 1] 
lapply(stemmer(crude), FUN) 

## [[1]] 
## [1] "oil" "price" 
## 
## [[2]] 
## [1] "opec" 
## 
## [[3]] 
## [1] "canada" "canadian" "crude" "oil"  "post"  "price" "texaco" 
## 
## [[4]] 
## [1] "crude" 
## 
## [[5]] 
## [1] "estim" "reserv" "said" "trust" 
## 
## [[6]] 
## [1] "kuwait" "said" 
## 
## [[7]] 
## [1] "report" "say" 
## 
## [[8]] 
## [1] "yesterday" 
## 
## [[9]] 
## [1] "billion" 
## 
## [[10]] 
## [1] "market" "price" 
## 
## [[11]] 
## [1] "mln" 
## 
## [[12]] 
## [1] "oil" 
## 
## [[13]] 
## [1] "oil" "price" 
## 
## [[14]] 
## [1] "oil" "opec" 
## 
## [[15]] 
## [1] "power" 
## 
## [[16]] 
## [1] "oil" 
## 
## [[17]] 
## [1] "oil" 
## 
## [[18]] 
## [1] "dlrs" 
## 
## [[19]] 
## [1] "futur" 
## 
## [[20]] 
## [1] "januari" 
+1

넥타이에 관한 좋은 지적, 맞아. – Ben

+0

동의 함. 벤, 네가 괜찮다면 나는이 대답을 받아 들일 것이다. – Bryan

2

거의 다 왔으므로 maxwhich.max으로 대체하면 문서 당 빈도가 가장 높은 (즉 행당) 용어의 열 색인을 얻을 수 있습니다. 그런 다음 해당 열 인덱스 벡터를 사용하여 문서 용어 행렬에서 용어 (또는 열 이름, 종류)를 서브 세트 화하십시오. 그러면 해당 문서의 최대 빈도가있는 각 문서의 실제 용어가 반환됩니다 (max을 사용할 때와 마찬가지로 빈도 값이 아니라). 따라서 귀하의 예를 따르십시오

maxterms<-apply(dtm, 1, which.max) 
dtm$dimnames$Terms[maxterms] 
[1] "oil"  "opec" "canada" "crude" "said" "said" "report" "oil"  
[9] "billion" "oil"  "mln"  "oil"  "oil"  "oil"  "power" "oil"  
[17] "oil"  "dlrs" "futures" "january" 
+0

신난다! 감사합니다. – Bryan

관련 문제