检查单词和同义词

时间:2014-05-18 20:28:14

标签: arrays perl string-matching synonym

我有一个包含一些单词的数组,另一个包含单词和同义词的数组。当我在第一个和第二个数组之间找到匹配字时,我想创建第三个数组。我尝试使用grep但是我无法以正确的方式编写代码以获得我想要的内容。 问题是数组1中的元素可以在开头的数组2中找到,也可以在结尾或中间找到。

例如,使用例子可能会更容易:

@array1 = qw(chose, abstraction);
@array2 = (
"inspirer respirer",
"incapable",
"abstraction",
"abaxial",
"cause,chose,objet",
"ventral",
"chose,objet"
);

结果应该是

@array3 = ("abstraction", "cause,chose,objet", "chose,objet");

使用" grep"是否正确? 我无法编写正确的语法来解决问题。 谢谢

2 个答案:

答案 0 :(得分:1)

您可以从array1构造正则表达式,然后使用它过滤array2:

#!/usr/bin/perl
use warnings;
use strict;

my @array1 = qw(chose, abstraction);
my @array2 = (
              "inspirer respirer",
              "incapable",
              "abstraction",
              "abaxial",
              "cause,chose,objet",
              "ventral",
              "chose,objet"
             );

my $regex = join '|', map quotemeta $_, @array1; # quotemeta needed for special characters.
$regex = qr/$regex/;
my @array3 = grep /$regex/, @array2;
print "$_\n" for @array3;

答案 1 :(得分:1)

我知道你有答案,但这是我想到的一种有趣的方式。

所以,我猜它就像一个倒排索引。

您获取每组同义词并将它们组成一个数组。然后获取该数组的每个元素并将其作为键作为键,将值作为对数组的引用。

#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my @array1 = qw(chose abstraction);

my @array2 = ("inspirer respirer",
"incapable",
"abstraction",
"abaxial",
"cause,chose,objet",
"ventral",
"chose,objet"
);

my @array;
push @array, map { /,|\s/ ? [split(/,|\s/, $_)]:[$_] } @array2;

my %construct;


while(my $array_ref = shift(@array)){
    for(@{ $array_ref }){
        push @{ $construct{$_} }, $array_ref;
    }
}

my @array3 = map { s/,//; (@{ $construct{$_} }) } @array1;

print join(', ', @{ $_ }), "\n" for (@array3);

编辑: 之前错过了答案,这个应该是完整的。