2016-08-15 9 views
3

기계 학습을위한 데이터 세트를 준비하려고합니다. 이 과정에서 나는 거의 발생하지 않는 단어를 제거 (중지)하고 싶습니다 (종종 나쁜 OCR 수치와 관련이 있습니다). 현재 나는 제거하고 싶은 약 1 개의 단어들을 포함하는 단어 목록을 가지고 있습니다.두 개의 큰 문자열 벡터를 비교하는 데 시간이 오래 걸림 (중지 단어 제거)

그러나이 설정으로 내 데이터 집합을 처리하는 데 오랜 시간이 걸립니다.

library(stringi) 
#generate the stopword list 
b <- stri_rand_strings(1000000, 4, pattern = "[A-Za-z0-9]") 

#remove stopstopwords form the dataset 
system.time({ 
    a <- stri_rand_strings(10, 4, pattern = "[A-Za-z0-9]") 
    c <- a[!(a %in% b)] 
    c 
}) 

user system elapsed 
0.14 0.00 0.14 

'% a % b'은 (멀리 떨어져있는) O (N)와 같지 않습니다. 프로세스가 몇 시간 내에 완료되지 않으면 전체 데이터 세트에서이 작업을 실행할 수 없습니다.

R에서 두 벡터를 비교하는 효율적인 방법이 있습니까?

조회가 매우 빠르다 고 생각합니다. 나는 C# 사전을 사용하여 몇 분 안에 완료 한 테스트를 수행했다.

+0

data.table' 빨리 즉해야'에서'%의 턱 %'로보십시오'system.time ({C <- A [(A %의 턱 % b)]}) # user system elapsed 0.01 0.00 0.02''% in % '에 기반한'0.13 ' – akrun

답변

0

stringistri_detect_fixed과 같은 검색 기능이 % 연산자 %보다 빠릅니다. 어쩌면이 당신을 도울 것입니다 :

  1. 이 단어는 포함하지 않는 몇 가지 구분 기호를 사용하여 모든 중지 단어를 붙여 ->이 하나 개의 긴 문자열이 긴 문자열

이을에 stri_detect_fixed

  • 사용을 만듭니다 스톱 워드 벡터를 한 번 붙여서 다시 사용하면 솔루션이 2 배나 빨라지거나 심지어 20 배 더 빠릅니다.

    벤치 마크 일부 코드 예제 :!

    library(stringi) 
    require(microbenchmark) 
    #generate the stopword list 
    b <- stri_rand_strings(1000000, 4, pattern = "[A-Za-z0-9]") 
    a <- stri_rand_strings(10, 4, pattern = "[A-Za-z0-9]") 
    
    #base R solution 
    f1 <- function(a,b){ 
        a[!(a %in% b)] 
    } 
    
    # paste inside function 
    f2 <- function(a,b){ 
        c <- stri_paste(b, collapse = ";") 
        a[stri_detect_fixed(c, a)] 
    } 
    
    # paste before and use it later 
    c <- stri_paste(b, collapse = ";") 
    f3 <- function(a, c){ 
        a[stri_detect_fixed(c, a)] 
    } 
    
    microbenchmark(f1(a,b), f2(a,b), f3(a,c)) 
    # Unit: milliseconds 
    #  expr  min  lq  mean  median   uq  max neval 
    # f1(a, b) 63.36563 67.931506 102.725257 116.128525 129.665107 208.46003 100 
    # f2(a, b) 52.95146 53.983946 58.490224 55.860070 59.863900 89.41197 100 
    # f3(a, c) 3.70709 3.831064 4.364609 4.023057 4.310221 10.77031 100