我正在研究一个使用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
现在我想用我自己的字典做一些数据清理。例如,将li替换为lorem ipsum,将kd,将kdin替换为kunde
我的问题是如何为整个数据框架做到这一点。
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])
...
}
可以工作,但是对于大量数据来说速度很慢。
有更好的方法吗?
cheers
gsub
是矢量化的,所以不需要循环。
a[[1]] <- gsub( " kd | kdin " , " kunde " , a[[1]])
更快一些。
另外,您确定要在正则表达式中使用空格吗?这样就不会匹配行首或行尾的单词。
另一种方法:完全避免正则表达式。当你有很多不同的单词要搜索时,这是最有效的,因为你将避免文本操作,除了第一次。
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"
对于要搜索的大量单词,我猜这比正则表达式快。它也更适合于数据-代码分离,因为它适合于编写merge或类似的函数来从文件中读取字典,而不是将其嵌入到代码中。
如果您确实需要它恢复为原始格式(作为空格分隔的字符向量),您可以对结果应用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