0

私は文を個々の単語に分割するコードに取り組んでいます。次に、単語はハッシュキーに対して検索されて存在します。私のコードは100%同一の用語を返します。一致した後、一致するキーに対応する値で文の単語にタグを付けます。問題は、コードタグの用語ですが、ランダムな値では、私が期待するものではありません。また、用語とハッシュキーが類似しているが、100%同一ではない場合があります。用語をキーと一致させるために、正規表現を作成するにはどうすればよいですか。注:ハッシュキーをルート形式にステム処理しました。私はいくつかの例を提供します:文の用語が相乗的または反相乗的であり、私のハッシュキーがSynergである場合、上記の用語をSynergとどのように一致させることができますか。

私のコードは次のとおりです。

    open IN, "C:\\Users\\Desktop\\TM\\clean_cells.txt" or die "import file absent";
    my %hash=();
    use Tie::IxHash;
    tie %hash => "Tie::IxHash";
    while(<IN>)
    {
    chomp $_;
    $line=lc $_;
    @Organs=split/\t/, $line;
    $hash{$Organs[0]}=$Organs[1];
    }

    $Sentence="Lymphoma is Lymph Heart and Lung";
     @list=split/ /,$Sentence;

     @array=();
 foreach $term(@list)
 {
 chomp $term;
    for $keys(keys %hash)
     {
    if($hash{$term})
     {
     $cell="<$hash{$keys}>$term<\/$hash{$keys}>";
     push(@array, $cell);
    }
    elsif($term=~m/\b\Q$keys(\w+)\E\b/)
    {
    $cell="<$hash{$keys}>$term<\/$hash{$keys}>";
     push(@array, $cell);        
    }
    elsif($term=~m/\b\Q(\w+)$keys\E\b/)
    {
    $cell="<$hash{$keys}>$term<\/$hash{$keys}>";
     push(@array, $cell);        
    }
    elsif($term=~m/\b\Q(\w+)$keys(\w+)\E\b/)
    {
    $cell="<$hash{$keys}>$term<\/$hash{$keys}>";
     push(@array, $cell);        
     }
}
}
print @array;

 for example: hash looks like this: %hash={
                                      TF1    => Lymph
                                Thoracic_duct =>    Lymph
                                    SK-MEL-1 => Lymph
                                       Brain => Brain
                                     Cerebellum =>  Brain
                                         };
   So if the term TF1 is found it should be substituted to Lymph TF1 /Lymph 
4

1 に答える 1

1

コードの動作を妨げている 2 つの大きな問題が見つかりました。

  • ハッシュのキーを小文字にしていますが、 の用語については同じことをしていません$Sentence。したがって、大文字の単語 from $Sentenceは決して一致しません。
  • 修飾子は、正規表現の\Q...\Eメタ文字を無効にします。多くの場合、変数を補間するときにこれを行うのは良いことですが、そこのような式を使用することはできません(\w+)--それはリテラル文字を探します(\w+). これらの正規表現は次のように書き直す必要があります: m/\b\Q$keys\E(\w+)\b/.

コードには他にも設計上の問題があります。

  1. 宣言されていないグローバル変数をいたるところで使用しています。ですべての変数を宣言する必要がありますmy。常にオンにしuse strict; use warnings;てください。これにより、これを正しく行うことが強制されます。
  2. の理由はないTie::IxHashようです。これにより、ハッシュが順序付けられます。コード内でこの順序を使用することはありません。出力の順序は@listです。この不要なモジュールを廃止します。
  3. あなたのif/elsif発言は冗長です。 if($term=~m/\b\Q(\w*)$keys(\w*)\E\b/)それらすべてを組み合わせたものと同じことを達成します。に置き換えたことに注意して\w+ください\w*。これにより、前後のグループが 1 つ以上の文字ではなく 0 個以上の文字と一致するようになります。

注:Tie::IxHash私はそのモジュールを持っておらず、不要に見えるので、わざわざテストしませんでした。このモジュールを使用すると、コードに他の問題が発生する可能性もあります。

于 2012-10-24T10:46:30.300 に答える