2017-08-13 6 views
0

非常に大きなコーパスサンプルを扱うときにメモリスペースを節約するために、私は上位10個の1グラムを取り出し、それらを2から5グラムすべてと組み合わせて自然言語処理[nlp]予測に使用される私の単一のquanteda :: dfmSparseオブジェクトです。すべての1グラムを運ぶことは無意味です。なぜなら、私が使っているシンプルなバックオフモデルでは、トップ10(または20)しか使用されないからです。quanteda dfmに参加するすべてのdfm 2から5グラムで

私はquanteda :: dfm(corpusText、。。)パラメータを見つけることができませんでした。これは、先頭の##機能のみを返すように指示しています。だからパッケージの作者@KenBからのコメントに基づいて、私はdfm_select/remove関数を使ってトップ10の1グラムを抽出し、 "quanteda dfm join"検索結果に基づいて "concatenate dfm matrices in 'quanteda' package"にヒットしましたrbind.dfmSparseを使用していますか? ??それらの結果を結合する機能。

これまでのところすべてがわかるようになりました。私はこのゲームプランをSOコミュニティからやり直して、この結果に到着するためのより効率的なルートやこれまでに到着した解決策のいくつかの欠陥を見落としているかどうかを確認することを考えました。

corpusObject <- quanteda::corpus(paste("some corpus text of no consequence that in practice is going to be very large\n", 
    "and so one might expect a very large number of ngrams but for nlp purposes only care about top ten\n", 
    "adding some corpus text word repeats to ensure 1gram top ten selection approaches are working\n")) 
corpusObject$documents 
dfm1gramsSorted <- dfm_sort(dfm(corpusObject, tolower = T, stem = F, ngrams = 1)) 
dfm2to5grams <- quanteda::dfm(corpusObject, tolower = T, stem = F, ngrams = 2:5) 
dfm1gramsSorted; dfm2to5grams 
#featnames(dfm1gramsSorted); featnames(dfm2to5grams) 
#colSums(dfm1gramsSorted); colSums(dfm2to5grams) 

dfm1gramsSortedLen <- length(featnames(dfm1gramsSorted)) 
# option1 - select top 10 features from dfm1gramsSorted 
dfmTopTen1grams <- dfm_select(dfm1gramsSorted, pattern = featnames(dfm1gramsSorted)[1:10]) 
dfmTopTen1grams; featnames(dfmTopTen1grams) 
# option2 - drop all but top 10 features from dfm1gramsSorted 
dfmTopTen1grams <- dfm_remove(dfm1gramsSorted, pattern = featnames(dfm1gramsSorted)[11:dfm1gramsSortedLen]) 
dfmTopTen1grams; featnames(dfmTopTen1grams) 

dfmTopTen1gramsAndAll2to5grams <- rbind(dfmTopTen1grams, dfm2to5grams) 
dfmTopTen1gramsAndAll2to5grams; 
#featnames(dfmTopTen1gramsAndAll2to5grams); colSums(dfmTopTen1gramsAndAll2to5grams) 
data.table(ngram = featnames(dfmTopTen1gramsAndAll2to5grams)[1:50], frequency = colSums(dfmTopTen1gramsAndAll2to5grams)[1:50], 
keep.rownames = F, stringsAsFactors = F) 

/EOQ

答えて

1

トップ10ユニグラムを抽出するため、この戦略はうまく動作します:全体的な機能頻度の降順

  1. ソート(デフォルト)によってDFM、そのすでに完了していますが、最初の10個の列にステップtpスライスを追加します。

  2. cbind()rbind()ではない)を使用してこれを2〜5グラムのdfmと組み合わせる)。

    それを行う必要があります

:この質問には表示されませんが

dfmCombined <- cbind(dfm1gramsSorted[, 1:10], dfm2to5grams) 
head(dfmCombined, nfeat = 15) 
# Document-feature matrix of: 1 document, 195 features (0% sparse). 
# (showing first document and first 15 features) 
#  features 
# docs some corpus text of to very large top ten no some_corpus corpus_text text_of of_no no_consequence 
# text1 2  2 2 2 2 2  2 2 2 1   2   2  1  1    1 

あなたのコード例では、data.tableのいくつかの使用を含みます。詳細な応答のための

head(textstat_frequency(dfmCombined), 10) 
#  feature frequency rank docfreq 
# 1   some   2 1  1 
# 2  corpus   2 2  1 
# 3   text   2 3  1 
# 4   of   2 4  1 
# 5   to   2 5  1 
# 6   very   2 6  1 
# 7  large   2 7  1 
# 8   top   2 8  1 
# 9   ten   2 9  1 
# 10 some_corpus   2 10  1 
+1

ありがとう:v0.99では、私たちは役に立つかもしれませんdata.frameの周波数の「長い」/「整頓」形式を生成し、新しい機能textstat_frequency()を追加しました。 textstat_frequency()$ランク列は、同じフィーチャ長、すなわち1/2/3/n-gramsサイズ、同じ頻度のnグラムの場合には、何か興味深いことをしていますか? – myusrn

+0

私はランダムだと思う - それは 'data.table :: setorder()'を使う。 –

関連する問題