1

如何匹配同一个单词的不同实例。

例如:如果字符串是协同的。如何将它与协同作用、协同作用、协同作用、协同作用相匹配。我可以写以下内容:

    while(<IN>)
 {
chomp $_;
my $line= $_;
$word="Synergy";
if($line=~m/$word(\w+)/i)
{
     $line=~s/$word/<Effect>$word<\/Effect>/ig;
}
 }
4

3 回答 3

3

您可能想要做的事情称为词干提取。但是,要使此功能起作用,您必须将文本中的所有单词加上您搜索的单词进行词干化。希望您列出的所有单词都产生相同的词干。我还没有测试过。

use Lingua::Stem;
my $stemmer = Lingua::Stem->new( -locale => 'EN-UK' );

# first convert text to list of words
my @words;
while(<IN>) {
    push @words, split(/\b/, $_); # you can do better here
}
# now stem all words.
my $stemmed_words = $stemmer->stem(@words);
# results in an array ref of stems in the same order as the words have been.

# now stem your search
my $stemmed_search = $stemmer->stem($word);

# and do the search from above inside stemmed array.

现在这取决于你想要什么。如果您想用某些东西交换所有这些单词,您必须获取匹配(词干)单词的索引并在文本中的相同位置进行替换。

于 2012-05-23T07:41:15.800 回答
0

您可能想查看 Text::Soundex。例如,

use Text::Soundex;

# The following all return S562
print soundex("synergizes"), "\n";
print soundex("synergism"), "\n";
print soundex("synergically"), "\n";
print soundex("synergistic"), "\n";

进一步阅读:Perldoc Text::Soundex

于 2012-05-22T21:53:03.050 回答
0

您将要使用正则表达式。目前尚不清楚您想要匹配的确切标准,但在您的示例中,所有单词都以“synergi”开头,因此if($string =~ \bsynergi\w*\b)会在其中的任何位置找到包含“synergi”的所有行。

于 2012-05-22T21:45:40.440 回答