【问题标题】:Percentage edit distance from array与数组的百分比编辑距离
【发布时间】:2017-04-24 04:10:35
【问题描述】:

我试图从一组序列中获取一定百分比的编辑距离。到目前为止,这就是我所拥有的:

#!/usr/bin/perl -w
use strict;
use Text::Levenshtein qw(distance);

my @sequence = qw(CA--------W----------------------EKDRRTEAF---F------ 
CA--------W----------------------EKDRRTEAF---F------ 
CA--------S-------------------SLVFGQGDNIQY---F------  
RA--------S-------------------SLIYSP----LH---F------);


foreach my $list (@sequence){
    my @distance = distance($list, @sequence);
    my @length = $list =~ tr/[A-Z]///;
}

我可以根据@length 的字母获得@distance 的编辑距离和每个序列的长度。如果打印出来结果如下:

@distance

0 0 13 14
0 0 13 14
13 13 0 11 
14 14 11 0

@length

13
13
16
12

由于@length 的每一行相当于@sequence 的每一行,所以在比较两行时,我想使用最大的@length 来获得百分比。因此,当第二个和第三个序列之间有一个编辑距离时,它将使用 16 而不是 13 的长度来获得百分比。我认为需要做的是只调用 @length 数组的两个元素,然后选择较大的一个然后放入一个百分比中,可能使用 if 语句。

我知道这段代码是错误的,但这通常是我想要的想法:

foreach my  $list (@sequence){
        my @distance = distance($list, @sequence);      
        my @length = $list =~ tr/[A-Z]//;                # / syntax hilite fix

        foreach my $item(@distance){
                foreach @length {
                        my $num1 = if $length[0] >= $length[1];
                                 print "$item/$num1\n";
                        else my $num2 = $length[1] >= $length[0];
                                print "$item/$num2\n";
                }
        }
}

答案应该类似于以下内容:

0 0 .8125 1.0769 0 0 .8125 1.0769 .8125 .8125 0 .6875 1.0769 1.0769 .6875 0

【问题讨论】:

    标签: arrays perl loops bioinformatics edit-distance


    【解决方案1】:

    试试这个。总结一下:我们计算成对之间的编辑距离 字符串。对于每一对,我们要确定距离的分数和最大字符数 (A-Z)。最大字符数被视为该对中两个项目的最大值。

    use strict;
    use warnings;
    
    use Text::Levenshtein qw(distance);
    
    my @sequence = qw(
            CA--------W----------------------EKDRRTEAF---F------
            CA--------W----------------------EKDRRTEAF---F------
            CA--------S-------------------SLVFGQGDNIQY---F------
            RA--------S-------------------SLIYSP----LH---F------
    );
    
    my @length = map { tr/[A-Z]// } @sequence;
    
    for my $i (0..$#sequence) {
        my $list = $sequence[$i];
        my @distance = distance($list, @sequence);
        my $num1 = $length[$i];
        for my $j (0..$#distance) {
            my $item = $distance[$j];
            my $num2 = $length[$j];
            my $num = ( $num2 > $num1 ) ? $num2 : $num1;
            printf "%.4f ", $item/$num;
        }
        print "\n";
    }
    

    输出

    0.0000 0.0000 0.8125 1.0769 
    0.0000 0.0000 0.8125 1.0769 
    0.8125 0.8125 0.0000 0.6875 
    1.0769 1.0769 0.6875 0.0000 
    

    【讨论】:

    • 干得好。顺便说一句,在带有正则表达式的行添加# / 之类的评论将关闭帖子其余部分的错误语法突出显示。有时您必须使用它,这取决于正则表达式中的设置。在这里,我希望 # / 这样做。
    • @zdim 谢谢。 Seems likestackexchange.com 使用Google's code-prettify。如果您愿意,我们可以尝试修复一些在 SO 上突出显示 Perl 语法的问题(似乎我们需要用 Javascript 编写补丁 :))祝您在挪威过一个愉快的圣诞节。
    • 感谢您的祝福。我可能在俄勒冈州的一座山上瞥见了挪威,那里有数英尺的积雪和充足的阳光。 (但不知怎的,我觉得 20F 太暖和了?)希望你度过了一个愉快的假期。
    • 这是一个非常好的主意,可以真正解决问题! (我不知道是怎么做到的。)至于 JS,这将是我最终进入它的机会。
    • @zdim 你好 zdim。实际上,挪威的气候变化很大。我住在西海岸的卑尔根,这里不是很冷 :) 我从来没有去过俄勒冈州,但我 15 年前去过加利福尼亚……无论如何,我创建了谷歌代码美化 GitHub 存储库的一个分支。所以让我们继续讨论in it's issue tracker。再见。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多