我正在研究将句子分成单个单词的代码,然后根据哈希键搜索单词以确定它们的存在。我的代码返回100%相同的术语,匹配后我将句子中的单词标记为与匹配键对应的值。问题是代码标签术语,但随机值不符合我的预期。此外,在某些情况下,术语和散列键相似但不是100%相同, 如何编写正则表达式以使我的条款与键匹配。 注意:我已经将哈希键限制为其根表单。 我提供了一些例子:如果句子中的术语是Synergistic或反协同,我的哈希键是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
答案 0 :(得分:1)
我发现两个阻碍代码工作的大问题:
$Sentence
中的条款相同。因此,大写单词来自
$Sentence
永远不会匹配。\Q...\E
修饰符会禁用正则表达式元字符。虽然在插入变量时执行此操作通常很好,但您不能在其中使用(\w+)
之类的表达式 - 这将查找文字字符(\w+)
。这些正则表达式需要像这样重写:m/\b\Q$keys\E(\w+)\b/
。您的代码还存在其他设计问题:
my
声明所有变量。始终打开use strict; use warnings;
,这会强制您正确执行此操作。Tie::IxHash
似乎没有任何理由导致您的哈希值被排序。您不要在代码中以任何方式使用此排序。输出按@list
排序。我会废除这个不必要的模块。if/elsif
语句是多余的。 if($term=~m/\b\Q(\w*)$keys(\w*)\E\b/)
将完成与所有这些相结合的事情。请注意,我将\w+
替换为\w*
。这允许前后组匹配零个或多个字符而不是一个或多个字符。 注意:我没有用Tie::IxHash
进行测试,因为我没有那个模块,看起来没必要。使用此模块可能还会在代码中引入其他问题。