2011-07-27 2 views
1
私はSQLの選択からと比べてRへのテキストマイニングSQLでのソリューションとR.

は、私はデータマイニングものを行う

まずIデータのインポートに取り組んでいます

Rのdata.frames(テキストマイニング)内の単語を置き換えますそれ。ここで

は、私が得たものである:

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

私は

a[[1]][1:3] 

を行う場合は、構造を参照してください。

[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のイプサムを持ちます。

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? – 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

あなたはそれについて正しいです。私はラップで実験し、同じ経験をしました。私のループは時間がかかっていたことが判明しました。 –

関連する問題