【问题标题】:Check words and synonyms检查单词和同义词
【发布时间】:2014-07-06 18:01:10
【问题描述】:

我有一个包含一些单词的数组,以及另一个包含单词和同义词的数组。当我在第一个和第二个数组之间找到匹配词时,我想创建第三个数组。我尝试使用 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”是否正确? 我无法编写正确的语法来解决问题.. 谢谢

【问题讨论】:

  • qw(chose, abstraction)('chose,', 'abstraction') 相同。你确定有逗号吗?
  • 是的,我确定.. 表达式是“选择,抽象”。它取自一个文本文件,该行实际上是“选择,抽象”
  • @Jurafsky: 所以,如果@array1 中的字符串应该chose,,你是说它应该匹配cause,chose,objet,来自@array2 但是不是,比如说cause,objet,chose,因为它后面没有逗号?
  • 对不起!我做错了。数组 1 中的元素是 1. 选择 2. 抽象。数组 2 中的元素是:cause,choose,objet 或 selected,objet。因此,如果我在数组 1 中有像“选择”这样的元素,我想匹配数组 2 中的元素,例如“选择,对象”和“原因,选择,对象”。

标签: arrays perl string-matching synonym


【解决方案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;

【讨论】:

  • my $regex = join '|', map quotemeta $_, @array1; # 特殊字符需要quotemeta。你为什么用“|” ?
  • @Jurafsky:因为它在正则表达式中分隔了备选方案。
  • @Jurafsky 如果这个答案是您问题的解决方案,请花点时间给它打勾以结束问题。目前,您的 10 个问题都没有选定答案。
【解决方案2】:

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

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

您将每组同义词组合成一个数组。然后取出该数组的每个元素并将其作为键放入散列中,值作为对数组的引用。

#!/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);

编辑: 之前漏掉了一部分答案,这个应该是完整的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多