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

2 に答える 2

4

ベンの答えはあなたが求めたものを与えますが、あなたが求めたものが賢明かどうかはわかりません. 関係は考慮されません。qdap パッケージを使用したアプローチと 2 番目のアプローチを次に示します。それらは単語のリストを提供します(qdapの場合、単語と頻度を含むデータフレームのリストです。最初のオプションと、インデックス作成とqdapを使用unlistして、残りの方法を取得するために使用できます。qdapアプローチは、生:lapplyunlistCorpus

オプション1:

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

qdap を使用したオプション #2:

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

でラップするtapplylapply(WRAP_HERE, "[", 1)、2 つの回答の内容と形式がほぼ同じになります。

編集: 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"
于 2013-11-04T04:15:26.813 に答える
2

ドキュメントごと (つまり、行ごと) に最も頻度の高い用語の列インデックスを取得するにはmax、に置き換えます。which.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"
于 2013-11-04T02:55:58.023 に答える