我正在尝试使用注释列表标记术语。我特别想要实现的是,如果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而不是整个术语淋巴细胞,淋巴细胞。
答案 0 :(得分: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
表示word boundary $&
表示最后一个正则表达式的完整匹配部分 [\w\-]
是一类字符:字母数字 + _
和-
gi
修饰符分别表示所有出现和不区分大小写 答案 1 :(得分: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>
请注意,这是一种非破坏性方法,因为拆分正则表达式中的parens将捕获并返回字符串的所有部分。
这个简单的代码将保留您的空白,但正如您所看到的,它会在您的标记中放入逗号和其他此类分隔符。这可以通过使用另一个字符类来修复,例如[^\s,.!?]+
(不是空格,逗号,句点,感叹号或问号)。
如果将<DATA>
替换为<>
,则可以将此脚本与重定向配合使用,并跳过有关打开输入和输出文件的代码。
perl script.pl input > output
我个人更喜欢这样的功能,而不是硬编码的文件路径,而且通常是* nix程序的工作方式。