我有一个很大的字符串向量,如下所示:
d <- c("herb", "market", "merchandise", "fun", "casket93", "old", "herbb", "basket", "bottle", "plastic", "baskket", "markket", "pasword", "plastik", "oldg", "mahagony", "mahaagoni", "sim23", "asket", "trump" )
我不想从同一个向量 d 中为每个字符串获取相似的字符串。
我这样做是通过
1. 根据某些规则为每个字符串计算与所有其他字符串字符串的编辑距离,例如,如果存在任何数字或字母字符数小于 5,则强制精确匹配。
2. 将其放入数据框 dist 和字符串。
3. 基于距离 < 3 的子集 dist。
4. 折叠相似的字符串并将其添加到原始数据框中作为新列。
我正在使用stringr
和stringdist
包
d <-as.data.frame(d)
M <- nrow(d)
Dist <- data.frame(matrix(nrow=M, ncol=2))
colnames(Dist) <- c("string" ,"dist")
Dist$string <- d$d
d$sim <- character(length=M)
require(stringr)
require(stringdist)
for (i in 1:M){
# if string has digits or is of short size (<5) do exact matching
if (grepl("[[:digit:]]", d[i, "d"], ignore.case=TRUE) == TRUE || str_count(d[i, "d"], "[[:alpha:]]") < 5){
Dist$dist <- stringdist(d[i, "d"], d$d, method="lv", maxDist=0.000001) # maxDist as fraction to force exact matching
# otherwise do approximate matching
} else {
Dist$dist <- stringdist(d[i, "d"], d$d, method="lv", maxDist=3)
}
# subset similar strings (with edit distance <3)
subDist <- subset(Dist, dist < 3 )
# add to original data.frame d
d[i, "sim"] <- paste(as.character(unlist(subDist$string)), collapse=", ")
}
是否可以对过程进行矢量化而不是使用循环?我有一个非常大的字符串向量,因此stringdistmatrix
由于内存限制,无法使用整个向量计算距离矩阵。该循环适用于大数据,但速度很慢。