首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R:生成一个具有字符串和字符串矩阵的近匹配列表。

R:生成一个具有字符串和字符串矩阵的近匹配列表。
EN

Stack Overflow用户
提问于 2015-07-18 01:34:04
回答 2查看 9.1K关注 0票数 9

我发现了优秀的包“string want”,现在我想使用它来计算字符串的距离。特别是我有一组单词,我想打印出近匹配,其中“近匹配”是通过一些算法,如Levenshtein距离。

我在shell脚本中有非常慢的工作代码,我能够在字符串中加载并生成一个带有度量的矩阵。现在,我想把这个矩阵简化为一个小的矩阵,它只有近匹配,例如,度量是非零的,但小于某个阈值。

代码语言:javascript
复制
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,我如何将它还原为一个列表,其中的输出将类似于

代码语言:javascript
复制
leafletr,leaflet,1
logo,lego,1

只适用于度量为非零且小于n=5的情况?我找到了让我做测试的“()”,现在我需要弄清楚如何使用它。

这个问题并不是针对字符串和字符串矩阵的,而是非常基本的R,但我还是被困住了。我怀疑答案涉及子集(),但我不知道如何将"dist“转换为其他东西。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-18 06:19:42

你可以这样做:

代码语言:javascript
复制
library(reshape2)
d <- unique(melt(m))
out <- subset(d, value > 0 & value < 5)

在这里,meltm带入长格式(两个列具有字符串名,一个列具有值)。然而,由于我们融化了一个对称矩阵,所以我们使用unique进行去复制。

另一种方法是使用dplyr (因为现在所有酷的孩子都在使用dplyr和管道):

代码语言:javascript
复制
library(dlpyr)
library(reshape2)
library(magrittr)

out <- melt(m) %>% distinct() %>% filter(value > 0 & value < 5)

第二种选择可能更快,但我还没有真正计时。

票数 6
EN

Stack Overflow用户

发布于 2015-07-18 05:04:53

设置您的数据:

代码语言:javascript
复制
library('stringdist')
library('dplyr')
kp <-  c('leaflet','leafletr','lego','levenshtein-distance','logo')
kpm <- stringdistmatrix(kp,useNames="strings",method="lv")

在这里,我们可以将kpm转换为数据格式:

代码语言:javascript
复制
kpm <- data.frame(as.matrix(kpm))

这是一种获取数据的方法,它有一个“1”来标记单词是否足够接近:

代码语言:javascript
复制
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

为了使事情变得简单,融化数据,过滤它,去掉最后一列:

代码语言:javascript
复制
final <- melt(idx) %>%
        filter(value==1) %>%
        select(Var1, Var2)

别忘了把一切都变成角色,而不是因素!(有时就像R的破纪录.)

代码语言:javascript
复制
final[] <- lapply(final, as.character)
#> final
#      Var1     Var2
#  leafletr  leaflet
#   leaflet leafletr
#      logo     lego
#      lego     logo

现在我们处理掉这些副本:

代码语言:javascript
复制
final <- final[!duplicated(data.frame(list(do.call(pmin,final),do.call(pmax,final)))),]

记住一些好名字,你就可以走了。

代码语言:javascript
复制
names(final) <- c('string 1', 'string 2')
#> final
# string 1 string 2
# leafletr  leaflet
#     logo     lego

(虽然您请求了一个列表,但这是一个数据文件。从这里开始,根据你的需要很容易地转换成你想要的任何东西,例如,写信给csv等等。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31486913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档