Arrays 检查单词和同义词

Arrays 检查单词和同义词,arrays,perl,string-matching,synonym,Arrays,Perl,String Matching,Synonym,我有一个包含一些单词的数组,还有一个包含单词和同义词的数组。当我在第一个数组和第二个数组之间找到匹配词时,我想创建第三个数组。我试过使用grep,但我无法以正确的方式编写代码以获得我想要的。 问题是数组1中的元素可以在数组2中找到,在开始时也可以在结尾或中间找到。p> 举个例子也许更简单: @array1 = qw(chose, abstraction); @array2 = ( "inspirer respirer", "incapable", "abstraction", "abaxial"

我有一个包含一些单词的数组,还有一个包含单词和同义词的数组。当我在第一个数组和第二个数组之间找到匹配词时,我想创建第三个数组。我试过使用grep,但我无法以正确的方式编写代码以获得我想要的。 问题是数组1中的元素可以在数组2中找到,在开始时也可以在结尾或中间找到。p> 举个例子也许更简单:

@array1 = qw(chose, abstraction);
@array2 = (
"inspirer respirer",
"incapable",
"abstraction",
"abaxial",
"cause,chose,objet",
"ventral",
"chose,objet"
);
结果应该是这样的

@array3 = ("abstraction", "cause,chose,objet", "chose,objet");
使用“grep”正确吗? 我无法编写正确的语法来解决这个问题。。
谢谢

您可以从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;

我知道你有答案,但我想到了一个有趣的方法

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

将每组同义词组合成一个数组。然后获取该数组的每个元素,并将其作为键放入哈希表中,该值是对该数组的引用

#!/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);
编辑:
除了前面的答案之外,这个应该是完整的。

qw(select,abstraction)
(“select”,“abstraction”)
相同。你确定逗号在那儿吗?是的,我确定。。表达方式是“选择,抽象”。它是从一个文本文件中提取的,而这行实际上是“selected,abstraction”@Jurafsky:那么,如果
@array1
中的字符串应该是
select,
,你是说它应该匹配
原因,选择,objet
,来自
@array2
,但不是说,
原因,objet,选择了
,因为后面没有逗号?对不起!我犯了一个错误。数组1中的元素为1。选择2。抽象。数组2中的元素是:原因、选择、对象或选择、对象。因此,如果我在数组1中有像“select”这样的元素,我想匹配数组2中像“selected,objet”和“cause,selected,objet”这样的元素特殊字符所需的quotemeta。为什么要使用“|”?@Jurafsky:因为它在正则表达式中分隔了备选项。@Jurafsky如果这个答案是您问题的答案,请花点时间勾选它以结束问题。目前,您的10个问题都没有选定的答案。