私は(1)文のセット、(2)キーワードのセット、(3)各キーワードのスコア(実数)を持っています。私は、文章のスコア= sum_over_keywords(文章*キーワードスコア内のキーワード数)である文章にスコアを割り当てる必要があります。R:複数の文字列に対して複数のパターン数を最適化する方法は?
再現例:今すぐ
library(stringi)
# generate 200 synthetic sentences containing 15 5-character words each
set.seed(7122016)
sentences_splitted = lapply(1:200, function(x) stri_rand_strings(15, 5))
# randomly select some words from the sentences as our keywords
set.seed(7122016)
keywords = unlist(lapply(sentences_splitted, function(x) if(sample(c(TRUE,FALSE),size=1,prob=c(0.2,0.8))) x[1]))
len_keywords = length(keywords)
# assign scores to keywords
set.seed(7122016)
my_scores = round(runif(len_keywords),4)
、文章を得点:
res = system.time(replicate(100,
unlist(lapply(sentences_splitted, function (x)
sum(unlist(lapply(1:len_keywords, function(y)
length(grep(paste0("\\<",keywords[y],"\\>"),x))*my_scores[y]
)))))))
私は私ができる限り多くのコードを最適化しようとしたが、それはまだ非常に遅いです:
user system elapsed
11.81 0.01 11.89
これ以上の操作を繰り返す必要があります200,000回... length(grep(paste0("\\<",keywords[y],"\\>"),x))
より速いものはありますか? lapply
のネストされたもの以外のものを使うべきですか?
NOTES:
- 私はすでに並列に私のラップトップの4つのコアを使用する予定なので、私は本当に必要なもの は上記より速く示す基本チャンクを作ることです。
- 誰かが スクリプトを提供していれば、RのC/C++/Fortranコードを呼び出すのはうれしいです(残念ながら、これらの言語はわかりません)。
「res」からどのような結果が得られますか?私はあなたの例から200 x 100の次元ですべてゼロを得ています。この例の出力を確認できますか? –
@PierreLafortune私は新しいRセッションを開始し、ダブルチェックしました。私はまだ同じ出力を得ています:つまり、 '6.23 0.00 6.32' – Antoine
すみません。私は指定する必要があります。私はあなたが 'replicate'関数をシステム時刻で囲むときに時間がかかることを知ります。しかし、 'system.time'ラッパーを削除すると、実際の関数が動作していないことがわかります。それはすべてのゼロを生成しています。 –