-2

注釈のリストを使用して用語にタグを付けようとしています。私が具体的に達成しようとしているのは、Perl正規表現が文から用語を識別する場合、その用語にタグを付ける必要があるということです。

例えば:

This drug has adverse effect on Lymphocytes, Lymphnodes, Lymph and pre-lymphocytes. 

私のリストにはLymphという単語があり、次のスクリプトを試しています。

open IN, "clean_cells.txt" or die "import file absent";
@array=<IN>;
foreach $words(@array)  
{
    @cells=split/\t/,$words;
    $value=$cells[0];
    $replace=$cells[1];
    foreach my $fp (glob("$Directory/*.txt")) 
    {
        @id=split('/',$fp);
        $id[1]=~s/.txt//ig; 
        $Pub=$id[1];
        open FILE, "<",$fp or die "Can't open $fp: $!";
        open OUT, ">C:\\Users\\Desktop\\TM\\Files\\$Pub" or die "Check      output status";
        while(<FILE>)
        {
            chomp $_;
            $line=$_;
            s/\b[\w\-]*$value[\w\-]*\b/<$replace>$&<\\$replace>/gi;
            # $string[$i]=$line;
            # while(($string[$i]=~m/\Q$value\E/i)||                                      ($string[$i]=~m/\Q$value(\w+)\E/i)||($string[$i]=~m/\Q(\w+)$value\E/i))
            # # if ($string[$i] =~ m/\b\w*$value\w*\b/i)
            # {
                # $value=~s/$value/<$replace>$value<\$replace>/i;
            # }
            print OUT "$line\n";
        }
        last;

    }   
    last;
}

最後の文が次のようになることを願っています。

This drug has adverse effect on tag Lymphocytes tag, tag Lymphnodes tag, tag Lymph tag and tag pre-lymphocytes tag.

タグ:上記のスクリプトで$replaceを表します。

プログラムは、リンパ球、前リンパ球という用語全体ではなく、ベースワードlymohにタグを付けます。

4

2 に答える 2

1

これを試してみてください(スクリプトを書き直しました):

use strict; use warnings;

my $pub = "SOMETHING I HAVE TO CHANGE FOR THE SCRIPT TO WORK";
my $fp = "clean_cells.txt";
my $of = "C:\\Users\\Hrishi\\Desktop\\TM\\Files\\$Pub";
my $replace = 'tag';
my $word = "Lymph";

open FILE, "<", $fp or die "Can't open $fp: $!";
open OUT,  ">", $of or die "Check output status";

while (<FILE>) {
    chomp;
    s/\b[\w\-]*$word[\w\-]*\b/<$replace>$&<\\$replace>/gi;
    print OUT $_; print;
}

編集

  • \b単語の境界を意味します
  • $&最後の正規表現の完全に一致した部分を意味します
  • [\w\-]文字のクラスです:英数字+ _、および-
  • 最後のgi修飾子は、それぞれすべての発生と大文字と小文字を区別しないことを意味します
于 2012-10-22T20:01:01.777 に答える
1

あなたはあなたの言葉を一緒に保つ必要があります。それに関するトリッキーな部分は、どのキャラクターが単語を構成できるかを決定することです。より簡単なアプローチ(ただし、おそらくそれほど正確ではありません)は、区切り文字を構成するものを決定することです。たとえば、次のように使用\S+して、連続する空白以外の文字を照合できます。

use strict;
use warnings;

while (<DATA>) {
    for (split /(\S+)/) {    # The parens make the split keep the delimiters
        $_ = "<tag>$_</tag>" if /lymph/i;
        print;
    }
}

__DATA__
Lymphocytes, Lymphnodes, Lymph and pre-lymphocytes.

出力:

<tag>Lymphocytes,</tag> <tag>Lymphnodes,</tag> <tag>Lymph</tag> and <tag>pre-lymphocytes.</tag>

分割正規表現の親は文字列のすべての部分をキャプチャして返すため、これは非破壊的な方法であることに注意してください。

この単純なコードは空白を保持しますが、ご覧のとおり、タグ内にコンマやその他の区切り文字を配置します。[^\s,.!?]+これは、 (空白、コンマ、ピリオド、感嘆符、疑問符ではない)などの別の文字クラスを使用して修正できます。

に置き換える<DATA><>、このスクリプトをリダイレクトで使用し、入力ファイルと出力ファイルを開くことに関するコードをスキップできます。

perl script.pl input > output

私は個人的に、ハードコードされたファイルパスよりもそのような機能を好みます。そして、それはしばしば*nixプログラムが機能する方法です。

于 2012-10-22T20:32:35.473 に答える