2

私はSQLとRを使用したテキストマイニングソリューションに取り組んでいます。

まず、SQL選択からRにデータをインポートし、それを使用してデータマイニングを行います。

これが私が得たものです:

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 

今、私は自分の辞書を使ってデータクリーニングをしたいと思っています。例として、 lilorem ipsumkdに置き換え、kdinkundeに置き換えます。

私の問題は、データフレーム全体に対してそれをどのように行うかです。

 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])
...
    }

動作しますが、大量のデータに対しては低速です。

それを行うためのより良い方法はありますか?


キャプテンを応援します

4

2 に答える 2

4

gsubはベクトル化されているため、ループは必要ありません。

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

より速いです。


また、正規表現内にスペースが必要ですか?そうすれば、行の先頭または末尾の単語が一致しなくなります。

于 2011-07-27T14:00:30.033 に答える
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
于 2011-07-27T17:43:44.107 に答える