2016-07-12 1 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의 다른 것보다 사용해야합니까?

참고 :

  • 이미 병렬로 내 노트북의 4 개 개의 코어를 사용하려면, 그래서 내가 정말 필요한 것은 기본 덩어리 위에 빠르게 표시하는 것입니다.
  • 누군가가 스크립트를 제공하면 C의 C/C++/Fortran 코드를 호출하게되어 기쁩니다 (불행히도이 언어를 모른다는 사실을 알고 있습니다).
+0

'res'에서 얻은 결과는 무엇입니까? 200 x 100 크기의 예제에서 모두 0을 얻고 있습니다. 예제의 출력을 확인할 수 있습니까? –

+0

@PierreLafortune 새로운 R 세션을 시작하고 두 번 확인했습니다. 나는 여전히 같은 출력을 얻고 있습니다 : 즉,'6.23 0.00 6.32' – Antoine

+2

죄송합니다. 나는 명시해야한다. 나는 당신이'replicate' 함수를 시스템 시간으로 감쌀 때가되는 것을 알게되었습니다. 그러나'system.time' 래퍼를 제거하면 실제 함수가 작동하지 않는 것을 볼 수 있습니다. 그것은 모두 0을 생성합니다. –

답변

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 아마도 100 개 이상의 반복을 위해 초 R 이하를 사용하는 가장 효율적인 솔루션 중 하나 일 것입니다. – Jimbou