【问题标题】:String matching using 'stringdist' and 'amatch' in R在R中使用'stringdist'和'amatch'进行字符串匹配
【发布时间】:2014-04-17 17:59:49
【问题描述】:

这是任何熟悉“stringdist”包的人的问题。

我正在尝试编写一个执行以下操作的函数:

搜索很长的字符列表,例如(仅显示约 100 万个字符中的 16 个):

> stripList
[1] "AAAAAAAAAAAAAAAAAAAAAAAAAAAADAABAAADCDDAD" "BAAAABBBDACDBABAAADDCBDADBCCBDCDDCDBCDDBA"
[3] "BDDABDCCAAABABBAACADCBDADBCCBDCDDCDBCDDBA" "AADBBACDDDBABDCABAADBCADCBDDDCCC"         
[5] "BBCDBBDCCBABDBCABDBBDBDDDADCDDADDDCDDCDDD" "BDDCDACABDCCBACBADCDCBDADBCCBDCDDCDDCDDBA"
[7] "BCDBADCBBDDBBBBDCBDADBCCBDCDDCDBCDDDDAAAA" "DABDDCDACABDCCBACBADC"                    
[9] "CABABDDCCCCACDCCDCCDADCAAAAAAAAACADADDADA" "BAABCBBBDBCDCDDADDDDCDDADBCCBDCDD"        
[11] "BBDDDACDCABDDDBBACDCBDADBCCDDCDDCDDCDDBDD" "BDDABDCCAAABABBBACADCBDADBCCBDCDDCDBCDDBA"
[13] "BDDBBBBDDBDABBACDBDCBDADBCCBDCDD"          "BDDABDCCAAABABBBACADCBDADBCCBDCDDCDBCDDBA"
[15] "DABDDCDACABDCCBACBADC"                     "BBADBACDDBABAACABCABCDCBDADBCCBDCDDCDDDDD"

对于结构如下的查询序列列表的每个序列的实例。

例如:

SeqName1              # queryNames
BBCDBBDCCBABDBCA      # querySeqs

SeqName2              # queryNames
BBBDCCDCCCCDDDCAAACD  # querySeqs

我想查看查询序列在我的任何“stripList”中出现了多少次(如果有),并允许 1 次插入、1 次删除、1 次替换和 1 次转置,并得到如下输出:

>dt
 queryNames    TimesFound
 SeqName1           5
 seqName2          145

为此,我按以下方式使用“stringdist”包的“amatch”函数:

dt<-rapply(as.list(querySeqs), function(x) amatch(x, stripList, method = "osa", useBytes = TRUE, weight = c(d = 0.5, i = 0.5, s = 0.9, t = 0.9), maxDist=0.9))
dt<-data.frame(dt)
colnames(dt) <- "TimesFound"
dt<-cbind(queryNames,dt)

我有几个问题:

  1. 在'amatch'函数中,使用method = "osa"时,"weight"参数如何解释?例如,如果我要使用:

    method = "osa", weight = c(d = 0.5, i = 0.5, s = 0.9, t = 0.9), maxDist=0.9
    

    我是说我想要我的“querySeqs”的 90% 匹配吗?意思是,这些分数是否与“querySeqs”或我的表(stripList)有关?

  2. “maxDist”有什么功能? (是否也解释为百分比?)

  3. 有没有办法最大限度地提高上述代码的运行时效率(可能通过使用 data.table 等)?我之所以问,是因为我的实际数据集是通过约 1,000,000 个序列列表搜索的约 2000 个序列查询。

  4. 有没有比 'amatch' 更好的方法来查找整个序列(而不仅仅是像 'agrep' 那样的子串)?

如果这些是基本问题,我很抱歉,这方面的文档对我来说很模糊,坦率地说,我还在学习。

提前致谢。

【问题讨论】:

    标签: r string match string-matching stringdist


    【解决方案1】:

    这个问题似乎在这里有一段时间了,我才刚刚找到它。简而言之:

    (1) 权重是每个动作的惩罚。它允许你告诉匹配,例如删除或插入是可以的,但你认为换位应该受到更多的惩罚。从您的问题来看,您可能可以保持原样。

    (2) Maxdist 告诉 amatch,如果两个字符串的距离大于 maxDist,则它们永远不会被视为匹配。默认值为零,因此只允许完全匹配。它不是一个百分比。 maxDist 的相关值取决于使用的距离函数。我认为您可以使用 method='osa', maxDist=1 (允许单个转置,插入,删除或替换,但不能组合)或者如果您愿意允许最多四个编辑的组合,也可以使用 maxDist=4 .对于类似编辑的距离,距离受最大字符串中的字符数限制。有关所有支持距离的范围,请参阅 R 期刊论文。 http://journal.r-project.org/archive/2014-1/loo.pdf

    (3) 我一直在优化代码。 0.9 版将使用多线程。我看到你正在使用 rapply,你可以通过使用来避免这种情况

    amatch(querySeqs,stripList,method='osa',maxDist=4)
    

    (4) 目前,我认为 amatch 是 R 的最佳实现(但由于我是作者,我可能有偏见:))。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-01
      • 1970-01-01
      • 2015-10-07
      • 2016-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多