11

私は 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 を作成したり、頻出単語や連想を見つけたり、ワード クラウドを作成したりするのに問題はありませんでした。しかし、 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 を特定したいと思います。たとえば、コーパスを大規模な標準英語コーパスと比較できます。または、相互に比較できるサブセットを作成します (たとえば、ソビエトと中国共産党の用語)。これを行うにはどうすればよいか、何か提案はありますか? 調べる必要があるスクリプト/関数はありますか? いくつかのアイデアや指針だけでも素晴らしいでしょう。

お待ち頂きまして、ありがとうございます!

4

4 に答える 4

7

問題を再現できませんでした。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.html http://tedunderwood.com/2012/08/14/where-to-start-with-text-mining/およびここに彼のコードがあります https://dl.dropboxusercontent.com/u/4713959/Neuchatel/NassrProgram.R

于 2013-10-31T06:44:19.447 に答える
1

このような関数に明示的にアクセスしたい場合があります

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 はエラー メッセージをスローします。

于 2014-08-22T19:13:13.033 に答える
0

ベンの答えに加えて、これも再現できませんでしたが、過去に plyr パッケージと競合する依存関係に問題がありました。私の場合、Hmisc と ddply の間に競合がありました。問題のあるコード行の直前に、次の行を追加してみてください。

tryCatch(detach("package:Hmisc"), error = function(e) NULL)

これがあなたの問題に完全に接している場合は申し訳ありません!

于 2013-11-23T20:02:27.700 に答える