2011-07-27 15 views
1
내 SQL 선택에서와보다 R로 텍스트 마이닝 SQL과 솔루션 및 R.

내가 함께 데이터 마이닝 물건을 할

우선 데이터 가져 오기에 일하고 있어요

R의 data.frames (텍스트 마이닝) 단어를 교체 그것. 나는

a[[1]][1:3] 

당신이 구조를 참조 할 경우

rawData = sqlQuery(dwhConnect,sqlString) 
a = data.frame(rawData$ENNOTE_NEU) 

: 여기

는 내가 가진 무엇을 좀 데이터와 청소를하고 싶은 이제

[1] lorem ipsum li ld ee wö wo di dd 
[2] la kdin di da dogs chicken 
[3] kd good i need some help 

을 내 자신의 사전. 예 리튬을 대체하는 것입니다KD뿐만 아니라 kdin

내 문제가 전체 데이터 프레임 동안 그 작업을 수행하는 방법이다 쿤데 와가 lorem ipsum의 와.

for(i in 1:(nrow(a))) 
    { 
     a[[1]][i]=gsub(" kd | kdin " , " kunde " ,a[[1]][i]) 
     a[[1]][i]=gsub(" li " , " lorem ipsum " ,a[[1]][i]) 
... 
    } 

그러나 많은 데이터에서 느립니다.

더 좋은 방법이 있습니까?


은 환호 당신은 루프를 필요가 없습니다 캡틴

+1

시도해 볼 수있는 옵션이 있습니까? SQL에서 직접 수행하거나 R에서 SQL 명령을 호출 할 수 있습니까? – daroczig

+0

SQL 및 gsub 아이디어는 지금까지는 훌륭했습니다. 속도가 중요한 경우 Rcpp에 사용자 지정 함수를 작성할 수도 있습니다. –

답변

4

gsub는 벡터화되어있다.

a[[1]] <- gsub(" kd | kdin " , " kunde " , a[[1]]) 

이 빠릅니다.


또한 정규식 안에 공백을 넣으시겠습니까? 이렇게하면 줄의 시작 또는 끝에있는 단어와 일치하지 않게됩니다.

+0

+1 깨끗한 벡터화 된 솔루션입니다.둘 이상의 열에 대해 적용하려면'apply (a, 2, function (x) gsub ("kd | kdin", "kunde", x))를 사용할 수 있습니다. –

+0

감사합니다. 'apply (a, 2, function (x) gsub ("kd | kdin", "kunde", x))'는 속임수를 사용했다. ** makd **와 같은 것이 ** makunde **로 변환 될 수 있기 때문에 정규 표현식의 공백이 필요합니다. 나는 거대한 코퍼스를 가지고있어서 문제는 엄청날 것이다. –

0

대체 방법 : 정규식을 모두 피하십시오. 첫 번째를 제외하고 텍스트 조작을 피할 수 있기 때문에 검색 할 단어가 많을 때 가장 효과적입니다.

a1 <- c("lorem ipsum li ld ee wö wo di dd","la kdin di da dogs chicken","kd good i need some help") 
x <- strsplit(a1, " ",fixed=TRUE) # fixed option avoids regexes which will be slower 

replfxn <- function(vec,word.in,word.out) { 
    vec[vec %in% word.in] <- word.out 
    vec 
} 

word.in <- "kdin" 
word.out <- "kunde" 

replfxn(x[[2]],word.in,word.out) 

lapply(x,replfxn,word.in=word.in,word.out=word.out) 
[[1]] 
[1] "lorem" "ipsum" "li" "ld" "ee" "wö" "wo" "di" "dd" 

[[2]] 
[1] "la"  "kunde" "di"  "da"  "dogs" "chicken" 

[[3]] 
[1] "kd" "good" "i" "need" "some" "help" 

많은 단어를 검색하려면 정규 표현식보다 빠릅니다. 병합이나 비슷한 기능을 작성하여 코드에 임베드하지 않고 파일에서 사전을 읽을 수 있기 때문에 데이터 코드 분리에 더욱 적합합니다.

원래 형식 (공백으로 구분 된 문자 벡터)으로 되돌릴 필요가있는 경우 paste을 결과에 적용 할 수 있습니다.

다음은 타이밍 결과입니다. 나는 정정됐다 : gsub가 더 빠를 것 같다!

library(microbenchmark) 
microbenchmark(
    gsub(word.in , word.out , a1) , 
    lapply(x,replfxn,word.in=word.in,word.out=word.out) , 
    times = 1000 
) 

                 expr min  lq 
1        gsub(word.in, word.out, a1) 42772 44484 
2 lapply(x, replfxn, word.in = word.in, word.out = word.out) 102653 106075 
    median  uq max 
1 47905 48761.0 691193 
2 109496 111635.5 970065 
+0

그 말이 맞습니다. 나는 실험적으로 실험을했으며 같은 경험을했습니다. 내 루프가 너무 시간이 많이 걸리는 것으로 밝혀졌습니다. –