2016-12-08 8 views
3

シーケンスのグループから編集距離のパーセンテージを取得しようとしています。今のところ、これは私が持っているものです。配列からの編集距離の割合

#!/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および各シーケンスの長さに編集距離を取得することができています。印刷された場合には結果は以下の通りである:2つの行を比較するとき

@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を使用してください。したがって、2番目と3番目のシーケンスの間に編集距離がある場合は、パーセンテージを得るために13ではなく16の長さを使用します。私が考えているのは、@length配列の2つの要素だけを呼び出し、大きい方を選んでパーセンテージに入れて、おそらく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 

答えて

3

はこれを試してみてください。要約すると: 文字列のペアの編集距離を計算します。各ペアについて、距離の割合と最大文字数(A-Z)を決定したいと考えています。ペアの2つの項目の最大文字数が最大となります。

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 
+0

ニースの仕事。 Btw、regexの行に '#/'のようなコメントを追加すると、残りの投稿の構文強調が間違っています。正規表現の中にあるものに応じて、それを演奏しなければならないことがあります。ここでは '#/'がそれをやると思います。おかげさまで、 – zdim

+0

[like like](http://meta.stackexchange.com/questions/184108/what-is-syntax-highlighting-and-how-does-it-work)stackexchange.comは、[Googleのcode-prettify](https: //github.com/google/code-prettify)。もしあなたが好きなら、私たちはPerlの構文を使っていくつかの問題を修正しようとすることができます(私たちはJavascriptでパッチを書く必要があるようです:))ノルウェーの素敵なクリスマスをお過ごしください。 –

+0

よろしくお願い致します。私はオレゴン山脈でノルウェーを垣間見ることができたかもしれません。足元には雪が降り、日差しがたくさんあります。 (でも、20Fはあまりにも暖かいと思っていたと思っています)。 – zdim

関連する問題