2017-12-23 28 views
1

をR:ドキュメント期の行列は、例えば、私は文書長期行列DTMを持って

dtm 
    <<DocumentTermMatrix (documents: 50, terms: 50)>> 
    Non-/sparse entries: 220/2497 
    Sparsity   : 100% 
    Maximal term length: 7 
    Weighting   : term frequency (tf) 

今、私は、各文書を表し、行列のリストにそれを転送します。そう、一度、各行を

[[1]] 
     [,1] [,2] [,3] [,4] 
    [1,] 23 33 42 117 
    [2,] 2 1 3  1 

    [[2]] 
     [,1] [,2] [,3] [,4] 
    [1,] 2 19 93 168 
    [2,] 2 2 1  1 

私はDTMからすべての非ゼロのエントリを見つけることを考えていますし、行列にそれらを生成します:これは、パッケージSTMの正式な要件を満たすためにある

mat = matrix() 
    dtm.to.mat = function(x){ 
     mat[1,] = x[x != 0] 
     mat[2,] = colnames(x[x != 0]) 
     return(mat) 
    } 
    matrix = list(apply(dtm, 1, dtm.to.mat)) 

しかし、

 x[x != 0] 

だけでは動作しません。エラーメッセージ:

$ operator is invalid for atomic vectors 

私はこのような場合が考えられました。あらかじめxを行列に変更すると、このエラーが出ることはありません。しかし、私は実際に約2,500,000行のdtmを持っています。私はこれが非常に非効率的であることを恐れる。

答えて

1

もう一度!

データが特に異常でない限り、stmパッケージの入力としてdtmを使用しません。関数stm::textProcessorを使用してください。任意の長さの文字ベクトルから、未処理のテキストとしてドキュメントを指定することができます。

は、あなたの共変量である、あなたの生のテキストとdf$metaあるdf$documentsと呼ばれる列を持つデータフレームdfがあるとします:

processed <- textProcessor(df$documents, metadata = df$meta, lowercase = TRUE, 
    removestopwords = TRUE, removenumbers = TRUE, removepunctuation = TRUE, 
    stem = TRUE, wordLengths = c(3, Inf)) 

stm_50 <- stm(documents = processed$documents, vocab = processed$vocab, 
    K = 50, prevalence = ~ meta, init.type = "Spectral", seed = 57468) 

これは50のトピックを実行しますあなたが望むように、あなたはまた、メタデータを指定することができますSTM。

textProcessorは、空のドキュメントとそれに関連するメタデータを処理します。

編集:stm::textProcessorは、技術的にはtmパッケージのラッパーです。しかし、関連する共変量を処理しながら、問題の文書を削除するように設計されています。

複数の共変量がある場合は、メタデータ引数にデータフレームが使用できます。その場合、2番目の方程式で流行の引数を変更する必要があります。

+0

こんにちはJamie!どうもありがとうございました。私がdtm入力を使用した理由は、私が中国語のテキストを扱っていることです。 textProcessorの処理された$ vocabは私にガーバブルだけを与えました。私は関数内にエンコーディングパラメータを見ないし、 "language ="パラメータもうまくいきません。 – user7453767

1

このような問題がある場合は、quantedaパッケージに変換します。stmに変換されます。 tmを貼りたい場合はstm::convertCorpusを使用してオブジェクトをリスト構造に変更しようとしましたstmが必要ですか?