-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.

tag:代表上面脚本中的$replace。

该程序标记基本词 lymoh 而不是整个术语 Lymphocytes, pre-lymphocytes。

4

2 回答 2

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 回答
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 回答