如何知道计算弦之间的Levenshtein距离所进行的运算?

时间:2019-06-30 20:17:46

标签: r string levenshtein-distance stringdist

使用函数stringdist,我可以计算字符串之间的Levenshtein距离:它计算将字符串转换为另一个字符串所需的删除,插入和替换的次数。例如,stringdist("abc abc","abcd abc") = 1是因为在第二个字符串中插入了“ d”。

是否可以知道为获取两个琴弦之间的Levenshtein距离而进行的操作?还是要知道两个字符串之间不同的字符(在此示例中,只有“ d”)? 谢谢。

library(stringdist)
stringdist("abc abc","abcde acc") = 3

我想知道:

    插入了
  • “ d”

  • 插入了
  • “ e”

  • “ b”替换为“ c”

或更简单地说,我想获得列表(“ d”,“ e”,“ c”)。

3 个答案:

答案 0 :(得分:10)

使用adist(),您可以检索以下操作:

drop(attr(adist("abc abc","abcde acc", count = TRUE), "counts"))

ins del sub 
  2   0   1 

来自?adist

  

如果counts为TRUE,则转换计数作为   此矩阵的“计数”属性,为3维数组,具有   对应于x元素,y元素和   转换类型(插入,删除和替换),   分别。

答案 1 :(得分:8)

这被称为Needleman–Wunsch algorithm。它可以计算两个字符串之间的距离以及所谓的 traceback ,从而可以重新构造对齐方式。

由于在比较生物学序列时该问题大多出现在生物学中,因此该算法(及相关算法)在R软件包{Biostrings}中实现,该软件包是Bioconductor的一部分。

由于此软件包实现的解决方案比简单的Levenshtein距离更通用,因此使用复杂得多,usage vignette也相应长。但是,您的基本用法如下:

app.controller('testController', function ($scope, $http) {
    $http({
        method: 'GET',
        url: 'https://jsonplaceholder.typicode.com/posts',
    }).then(function (response) {
        console.log(response.data[0])
        $scope.response = response.data[0];
        console.log($scope.response)
        //alert($scope.response);
    });
});

<body ng-app="myApp" class="text-center">
    <div id="foo" ng-controller="testController">
        {{response.title}}
    </div>
...
</body>

但是,这不会简单地为您提供列表Function Check-ADUser($Username){ $Properties = "whatever properties you want" Get-ADUser $username -Properties * | Select $Properties } ,因为该列表不能完全代表实际发生的情况。相反,它将在两个字符串之间返回 alignment 。这可以表示为具有替换和空白的序列:

library(Biostrings)

dist_mat = diag(27L)
colnames(dist_mat) = rownames(dist_mat) = c(letters, ' ')

result = pairwiseAlignment(
    "abc abc", "abcde acc",
    substitutionMatrix = dist_mat,
    gapOpening = 1, gapExtension = 1
)

-对于第二个字符串中的每个字符,它提供原始字符串中的相应字符,用c('b', 'c', 'c')替换插入的字符。基本上,这是将第一个字符串转换为第二个字符串的“食谱”。请注意,它将仅包含插入和替换,不包含删除。要获得这些,您需要以另一种方式进行对齐(即交换字符串参数)。

答案 2 :(得分:7)

根据tmfmnk的答案以及建议使用“ trafos”属性的建议,此函数将向您显示一个表格,其中包含所有插入或替换的字符以及插入和替换的字符数。如果您设置f <- function(x, y, all_actions = FALSE){ o <- adist(x, y, count = TRUE) cva <- list(char = strsplit(y, '')[[1]], action = strsplit(attr(o,"trafos"), '')[[1]]) if(!all_actions) cva <- lapply(cva, '[', cva$action %in% c('I', 'S')) do.call(table, cva) } f(x = "abc abc", y = "abcde acc") # action # char I S # c 0 1 # d 1 0 # e 1 0 f(x = "abc abc", y = "abcde acc", all_actions = T) # action # char I M S # 0 1 0 # a 0 2 0 # b 0 1 0 # c 0 2 1 # d 1 0 0 # e 1 0 0 ,它也会显示您的匹配项。

{{1}}