我发现了优秀的包“string want”,现在我想使用它来计算字符串的距离。特别是我有一组单词,我想打印出近匹配,其中“近匹配”是通过一些算法,如Levenshtein距离。
我在shell脚本中有非常慢的工作代码,我能够在字符串中加载并生成一个带有度量的矩阵。现在,我想把这个矩阵简化为一个小的矩阵,它只有近匹配,例如,度量是非零的,但小于某个阈值。
kp <- c('leaflet','leafletr','lego','levenshtein-distance','logo')
kpm <- stringdistmatrix(kp,useNames="strings",method="lv")
> kpm
leaflet leafletr lego levenshtein-distance
leafletr 1
lego 5 6
levenshtein-distance 16 16 18
logo 6 7 1 19
m = as.matrix(kpm)
close = apply(m, 1, function(x) x>0 & x<5)
> close
leaflet leafletr lego levenshtein-distance logo
leaflet FALSE TRUE FALSE FALSE FALSE
leafletr TRUE FALSE FALSE FALSE FALSE
lego FALSE FALSE FALSE FALSE TRUE
levenshtein-distance FALSE FALSE FALSE FALSE FALSE
logo FALSE FALSE TRUE FALSE FALSE好的,现在我有了一个(大) dist,我如何将它还原为一个列表,其中的输出将类似于
leafletr,leaflet,1
logo,lego,1只适用于度量为非零且小于n=5的情况?我找到了让我做测试的“()”,现在我需要弄清楚如何使用它。
这个问题并不是针对字符串和字符串矩阵的,而是非常基本的R,但我还是被困住了。我怀疑答案涉及子集(),但我不知道如何将"dist“转换为其他东西。
发布于 2015-07-18 06:19:42
你可以这样做:
library(reshape2)
d <- unique(melt(m))
out <- subset(d, value > 0 & value < 5)在这里,melt将m带入长格式(两个列具有字符串名,一个列具有值)。然而,由于我们融化了一个对称矩阵,所以我们使用unique进行去复制。
另一种方法是使用dplyr (因为现在所有酷的孩子都在使用dplyr和管道):
library(dlpyr)
library(reshape2)
library(magrittr)
out <- melt(m) %>% distinct() %>% filter(value > 0 & value < 5)第二种选择可能更快,但我还没有真正计时。
发布于 2015-07-18 05:04:53
设置您的数据:
library('stringdist')
library('dplyr')
kp <- c('leaflet','leafletr','lego','levenshtein-distance','logo')
kpm <- stringdistmatrix(kp,useNames="strings",method="lv")在这里,我们可以将kpm转换为数据格式:
kpm <- data.frame(as.matrix(kpm))这是一种获取数据的方法,它有一个“1”来标记单词是否足够接近:
idx <- apply(kpm, 2, function(x) x >0 & x<5)
idx <- apply(idx, 1:2, function(x) if(isTRUE(x)) x<-1 else x<-NA)
#> idx
# leaflet leafletr lego levenshtein.distance logo
# leaflet NA 1 NA NA NA
# leafletr 1 NA NA NA NA
# lego NA NA NA NA 1
# levenshtein-distance NA NA NA NA NA
# logo NA NA 1 NA NA为了使事情变得简单,融化数据,过滤它,去掉最后一列:
final <- melt(idx) %>%
filter(value==1) %>%
select(Var1, Var2)别忘了把一切都变成角色,而不是因素!(有时就像R的破纪录.)
final[] <- lapply(final, as.character)
#> final
# Var1 Var2
# leafletr leaflet
# leaflet leafletr
# logo lego
# lego logo现在我们处理掉这些副本:
final <- final[!duplicated(data.frame(list(do.call(pmin,final),do.call(pmax,final)))),]记住一些好名字,你就可以走了。
names(final) <- c('string 1', 'string 2')
#> final
# string 1 string 2
# leafletr leaflet
# logo lego(虽然您请求了一个列表,但这是一个数据文件。从这里开始,根据你的需要很容易地转换成你想要的任何东西,例如,写信给csv等等。
https://stackoverflow.com/questions/31486913
复制相似问题