2016-07-12 11 views
-1

私は(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コードを呼び出すのはうれしいです(残念ながら、これらの言語はわかりません)。
+0

「res」からどのような結果が得られますか?私はあなたの例から200 x 100の次元ですべてゼロを得ています。この例の出力を確認できますか? –

+0

@PierreLafortune私は新しいRセッションを開始し、ダブルチェックしました。私はまだ同じ出力を得ています:つまり、 '6.23 0.00 6.32' – Antoine

+2

すみません。私は指定する必要があります。私はあなたが 'replicate'関数をシステム時刻で囲むときに時間がかかることを知ります。しかし、 'system.time'ラッパーを削除すると、実際の関数が動作していないことがわかります。それはすべてのゼロを生成しています。 –

答えて

3

キーワードはmy_scoresという名前で表すことができます。覚えておきますが、Rは名前でサブセット化することができます。一致する言葉を得ることができれば、得点も得られます:

names(my_scores) <- keywords 
res <- sapply(sentences_splitted, function(x) sum(my_scores[x[x %in% keywords]])) 

これはすべて必要です。小さなテスト可能な例でテストすることができます:

#Create sentences 
sentences_splitted <- list(c("abc", "def", "ghi", "abc"), c("xyz", "abc", "mno", "xyz")) 
keywords <- c("abc", "xyz") 
my_scores <- c(10,20) 

#We should expect 
10 * 2 #first sentence 
10 * 1 and 20 * 2 #second sentence 
#Expected result 
[1] 20 50 

#Check that function works as expected 
names(my_scores) <- keywords 
sapply(sentences_splitted, function(x) sum(my_scores[x[x %in% keywords]])) 
[1] 20 50 
+0

ありがとうございますが、私の質問は効率性についてです。私の機能は期待どおりに機能します(自分の質問に編集を参照)。 – Antoine

+5

私はあきらめます。このサイトには何が起こったのですか? –

+0

@Antoineこれはおそらく、ベースRを使用する最も効率的なソリューションの1つです。 – Jimbou

関連する問題