2015-03-26 16 views
7

Tôi đang cố gắng tìm hiểu, nếu có cách tiếp cận nhanh hơn gsub hàm vectơ trong R. Tôi có khung dữ liệu sau đây với một số "câu" (đã gửi $ words) và sau đó tôi có các từ để loại bỏ khỏi các câu này (được lưu trữ trong biến từĐối với biến).Cách tiếp cận nhanh hơn gsub trong r

sent <- data.frame(words = 
        c("just right size and i love this notebook", "benefits great laptop", 
         "wouldnt bad notebook", "very good quality", "bad orgtop but great", 
         "great improvement for that bad product but overall is not good", 
         "notebook is not good but i love batterytop"), 
        user = c(1,2,3,4,5,6,7), 
        stringsAsFactors=F) 

wordsForRemoving <- c("great","improvement","love","great improvement","very good","good", 
         "right", "very","benefits", "extra","benefit","top","extraordinarily", 
         "extraordinary", "super","benefits super","good","benefits great", 
         "wouldnt bad") 

Sau đó tôi sẽ tạo ra "dữ liệu lớn" mô phỏng cho máy tính tiêu thụ thời gian ...

df.expanded <- as.data.frame(replicate(1000000,sent$words)) 
library(zoo) 
sent <- coredata(sent)[rep(seq(nrow(sent)),1000000),] 
rownames(sent) <- NULL 

Sử dụng các sau gsub phương pháp để loại bỏ từ (wordsForRemoving) từ gửi $ words mất 72,87 giây Tôi biết, đây không phải là mô phỏng tốt nhưng thực tế tôi đang sử dụng từ điển từ với hơn 3.000 từ cho 300.000 câu và quá trình xử lý tổng thể mất hơn 1,5 giờ.

pattern <- paste0("\\b(?:", paste(wordsForRemoving, collapse = "|"), ")\\b ?") 
res <- gsub(pattern, "", sent$words) 

# user system elapsed 
# 72.87 0.05 73.79 

Xin vui lòng, bất kỳ ai cũng có thể giúp tôi viết cách tiếp cận nhanh hơn cho công việc của mình. Bất kỳ trợ giúp hoặc lời khuyên nào đều được đánh giá rất cao. Cảm ơn rất nhiều về phía trước.

+1

Bạn sẽ nhận được một số cải thiện (60% trong ví dụ tôi đã thử, trong đó có một số lượng bản sao giảm) bằng cách sử dụng 'stringi :: stri_replace_all_regex (gửi $ words, pattern," ")' –

Trả lời

9

Như đã đề cập bởi Jason, stringi là lựa chọn tốt cho bạn ..

Sau đây là hiệu suất của stringi

system.time(res <- gsub(pattern, "", sent$words)) 
    user system elapsed 
66.229 0.000 66.199 

library(stringi) 
system.time(stri_replace_all_regex(sent$words, pattern, "")) 
    user system elapsed 
21.246 0.320 21.552 

Cập nhật (Cảm ơn Arun)

system.time(res <- gsub(pattern, "", sent$words, perl = TRUE)) 
    user system elapsed 
12.290 0.000 12.281 
+9

Thử cơ sở R 'gsub' với' perl = TRUE '. – Arun

Các vấn đề liên quan