2017-01-09 10 views
0

Rプログラミング環境で「quanteda」パッケージを使用して、大きな(1GB)テキストファイルからトリグラムとバイグラムを作成しようとしています。私のコードを一度に実行しようとすると(以下のように)Rがハングします(3行目 - myCorpus < -toLower(...))。小さなデータセット< 1MBでコードを正常に使用したので、ファイルが大きすぎると思います。おそらく、「チャンク」にテキストをロードし、その後にバイグラムとトリグラムの結果の周波数を組み合わせる必要があることがわかります。しかし、私はどのように扱いやすい 'チャンク(chunks)'でテキストをロードして処理するのかを考えることはできません。この問題へのアプローチに関するアドバイスは大歓迎です。私のコードは下に貼り付けられます。私のコードを改善するための他のアプローチの提案も歓迎するでしょう。多くの頭痛の後Rで大きなテキストファイルを使ってnグラムを作成する

folder.dataset.english <- 'final/corpus' 


myCorpus <- corpus(x=textfile(list.files(path = folder.dataset.english, pattern = "\\.txt$", full.names = TRUE, recursive = FALSE))) # build the corpus 

myCorpus<-toLower(myCorpus, keepAcronyms = TRUE) 

#bigrams 
bigrams<-dfm(myCorpus, ngrams = 2,verbose = TRUE, toLower = TRUE, 
      removeNumbers = TRUE, removePunct = TRUE, removeSeparators = TRUE,removeTwitter = TRUE, stem = FALSE) 
bigrams_freq<-sort(colSums(bigrams),decreasing=T) 
bigrams<-data.frame(names=names(bigrams_freq),freq=bigrams_freq,stringsAsFactors =FALSE) 
bigrams$first<- sapply(strsplit(bigrams$names, "_"), "[[", 1) 
bigrams$last<- sapply(strsplit(bigrams$names, "_"), "[[", 2) 
rownames(bigrams)<-NULL 
bigrams.freq.freq<-table(bigrams$freq) 
saveRDS(bigrams,"dictionaries/bigrams.rds") 

#trigrams 
trigrams<-dfm(myCorpus, ngrams = 3,verbose = TRUE, toLower = TRUE, 
       removeNumbers = TRUE, removePunct = TRUE, removeSeparators = TRUE, 
       removeTwitter = TRUE, stem = FALSE) 
trigrams_freq<-sort(colSums(trigrams),decreasing=T) 
trigrams<-data.frame(names=names(trigrams_freq),freq=trigrams_freq,stringsAsFactors =FALSE) 

trigrams$first<-paste(sapply(strsplit(trigrams$names, "_"), "[[", 1),sapply(strsplit(trigrams$names, "_"), "[[", 2),sep="_") 
trigrams$last<-sapply(strsplit(trigrams$names, "_"), "[[", 3) 
rownames(trigrams)<-NULL 
saveRDS(trigrams,"dictionaries/trigrams.rds") 
+1

どの時点でコードがハングしますか? – emilliman5

+0

myCorpusでハングします<-toLower(myCorpus、keepAcronyms = TRUE) – AndyC

+0

小規模なデータセットでコードが正常に実行されますか? – emilliman5

答えて

0

、私は一種の私はおよそ少し恥ずかしい思います非常に強引なやり方で、これを自分で解決するが、私はとにかくそれを表示します!よりエレガントで効率的な方法があると確信しています(私に教えてください)。私はこのテキストを一度処理すればよいので、面白い解決法はそれほど重要ではないと思います。

「tm」パッケージV.Corpusオブジェクトに変換されました。これは3つの大きなテキストファイルで構成され、3つのテキストファイルを繰り返して、一度に各チャンクを処理するコーパスを手動でスライスしました。ここでは理解を明確にするために、上記の処理コードを挿入したりplumbしたりしていません。私はちょうど私はそれをステッチする必要があることを示した。私はちょうど各チャンクからの結果を蓄積するためにいくつかのコードを追加する必要があります。

library(tm) 

folder.dataset.english <- 'final/corpus' 
    corpus <- VCorpus(DirSource(directory=folder.dataset.english, encoding = "UTF-8",recursive=FALSE), 
         readerControl = list(language = "en")) 
    chunk.size<-100000 


    for(t in 1:3){ 
     l=1 
     h=chunk.size 
     stp=0 
     corp.size<-length(corpus[[t]]$content) 
      repeat{ 
      if(stp==2)break 
      corpus.chunk<-corpus[[t]]$content[l:h] 
      l<-h+1 
      h<-h+chunk.size 
    ####Processing code in here 


    #####Processing code ends here 
      if(h>corp.size){ 
      h<-corp.size 
      stp<-stp+1  } 
        } 
       } 
+0

'text2vec :: create_vocabulary'を使用してください。 –

+0

OK!このパッケージに出くわしていないと、私はそれをチェックアウトする – AndyC

関連する問題