私はRのtmパッケージを使い始めているので、私とテキストの大きな古い壁についてお詫び申し上げます。私は社会主義/共産主義のプロパガンダのかなり大きなコーパスを作成し、新しく造られた政治用語(複数の単語、例えば「闘争-批評-変革運動」)を抽出したいと思います。
これは2段階の質問です。1つはこれまでのコードに関するもので、もう1つはどのように進めるべきかに関するものです。
ステップ1:これを行うには、最初にいくつかの一般的なngramを特定したいと思いました。しかし、私は非常に早い段階で立ち往生しています。これが私がやってきたことです:
library(tm)
library(RWeka)
a <-Corpus(DirSource("/mycorpora/1965"), readerControl = list(language="lat")) # that dir is full of txt files
summary(a)
a <- tm_map(a, removeNumbers)
a <- tm_map(a, removePunctuation)
a <- tm_map(a , stripWhitespace)
a <- tm_map(a, tolower)
a <- tm_map(a, removeWords, stopwords("english"))
a <- tm_map(a, stemDocument, language = "english")
# everything works fine so far, so I start playing around with what I have
adtm <-DocumentTermMatrix(a)
adtm <- removeSparseTerms(adtm, 0.75)
inspect(adtm)
findFreqTerms(adtm, lowfreq=10) # find terms with a frequency higher than 10
findAssocs(adtm, "usa",.5) # just looking for some associations
findAssocs(adtm, "china",.5)
# ... and so on, and so forth, all of this works fine
Rにロードするコーパスは、スローするほとんどの関数で正常に機能します。コーパスからのTDMの作成、頻繁な単語の検索、関連付け、Wordクラウドの作成などに問題はありません。しかし、 tm FAQ で概説されているアプローチを使用して、識別ngramを使用しようとすると、tdm-constructorで間違いを犯しているようです。
# Trigram
TrigramTokenizer <- function(x) NGramTokenizer(x,
Weka_control(min = 3, max = 3))
tdm <- TermDocumentMatrix(a, control = list(tokenize = TrigramTokenizer))
inspect(tdm)
このエラーメッセージが表示されます:
Error in rep(seq_along(x), sapply(tflist, length)) :
invalid 'times' argument
In addition: Warning message:
In is.na(x) : is.na() applied to non-(list or vector) of type 'NULL'
何か案は? 「a」は正しいクラス/オブジェクトではありませんか?よくわかりません。ここに根本的な間違いがあると思いますが、私はそれを見ていません。 :(
ステップ2:次に、コーパスを他のコーパスと比較するときに、大幅に過大評価されているngramを特定したいと思います。たとえば、自分のコーパスを大規模な標準英語コーパスと比較できます。または、相互に比較できるサブセットを作成します(たとえば、ソビエトと中国共産党の用語)。これをどのように行うべきかについて何か提案はありますか?調べる必要のあるスクリプト/関数はありますか?いくつかのアイデアや指針があれば素晴らしいでしょう。
お待ち頂きまして、ありがとうございます!
問題を再現できませんでした。最新バージョンのR、tm、RWekaなどを使用していますか?
require(tm)
a <- Corpus(DirSource("C:\\Downloads\\Only1965\\Only1965"))
summary(a)
a <- tm_map(a, removeNumbers)
a <- tm_map(a, removePunctuation)
a <- tm_map(a , stripWhitespace)
a <- tm_map(a, tolower)
a <- tm_map(a, removeWords, stopwords("english"))
# a <- tm_map(a, stemDocument, language = "english")
# I also got it to work with stemming, but it takes so long...
adtm <-DocumentTermMatrix(a)
adtm <- removeSparseTerms(adtm, 0.75)
inspect(adtm)
findFreqTerms(adtm, lowfreq=10) # find terms with a frequency higher than 10
findAssocs(adtm, "usa",.5) # just looking for some associations
findAssocs(adtm, "china",.5)
# Trigrams
require(RWeka)
TrigramTokenizer <- function(x) NGramTokenizer(x, Weka_control(min = 3, max = 3))
tdm <- TermDocumentMatrix(a, control = list(tokenize = TrigramTokenizer))
tdm <- removeSparseTerms(tdm, 0.75)
inspect(tdm[1:5,1:5])
そして、これが私が得るものです
A term-document matrix (5 terms, 5 documents)
Non-/sparse entries: 11/14
Sparsity : 56%
Maximal term length: 28
Weighting : term frequency (tf)
Docs
Terms PR1965-01.txt PR1965-02.txt PR1965-03.txt
†chinese press 0 0 0
†renmin ribao 0 1 1
— renmin ribao 2 5 2
“ chinese people 0 0 0
“renmin ribaoâ€\u009d editorial 0 1 0
etc.
ステップ2に関して、便利なスタートへのいくつかの指針があります。
http://quantifyingmemory.blogspot.com/2013/02/mapping-significant-textual-differences.htmlhttp://tedunderwood.com/2012/08/14/where- to-start-with-text-mining / そしてここに彼のコードがあります https://dl.dropboxusercontent.com/u/4713959/Neuchatel/NassrProgram.R
ステップ1に関して、Brian.kengはここで1つのライナー回避策を提供します https://stackoverflow.com/a/20251039/310792 =これはMacOSXでのこの問題を解決します-これは(Macでのマイナーな悪夢)Javaセットアップではなく、並列化に関連しているようです。
このような関数に明示的にアクセスすることをお勧めします
BigramTokenizer <- function(x) {
RWeka::NGramTokenizer(x, RWeka::Weka_control(min = 2, max = 3))
}
myTdmBi.d <- TermDocumentMatrix(
myCorpus.d,
control = list(tokenize = BigramTokenizer, weighting = weightTfIdf)
)
また、ランダムに出てきた他のいくつかのもの。
myCorpus.d <- tm_map(myCorpus.d, tolower) # This does not work anymore
代わりにこれを試してください
myCorpus.d <- tm_map(myCorpus.d, content_transformer(tolower)) # Make lowercase
RTextToolsパッケージでは、
create_matrix(as.vector(C $ V2)、ngramLength = 3)#ngramLengthはエラーメッセージをスローします。
ベンの答えに加えて、これも再現できませんでしたが、過去にplyrパッケージと競合する依存関係に問題がありました。 私の場合 Hmiscとddplyの間に競合がありました。問題のあるコード行の直前に次の行を追加してみてください。
tryCatch(detach("package:Hmisc"), error = function(e) NULL)
これがあなたの問題に完全に正接している場合はお詫びします!