Как сопоставить последовательные слова в предложении, используя Perl? - PullRequest
1 голос
/ 13 декабря 2011

Есть ли лучший способ сопоставить слова, отличные от этого метода, я пытаюсь найти слово в массиве, встречающееся в любом из предложений.

 my $count = 0;
 my @strings = (
    "i'm going to find the occurrence of two words going if possible",
    "i'm going to find the occurrence of two words if impossible",
    "to find a solution to this problem",
    "i will try my best for a way to match this problem"
 );
 @neurot = qw(going match possible);

 my $com_neu = '\b'.join('\b|\b', @neurot).'\b';

 foreach my $sentence (@string){

 @l = $sentence =~ /($com_neu)/gi; 

 foreach my $list (@l){ 
    if($list =~ m/\w['\w-]*/){
          print $list;
      $count++;
    }   
 }

 print $count;
 }

Выход:

String 1: going going possible
String 2: going 
String 3:
String 4: match

Пожалуйста, помогите мне быстрее.

Спасибо.

Ответы [ 3 ]

1 голос
/ 13 декабря 2011

а как насчет оператора smart-match?

foreach my $elem (@neurot){ if(/$elem/i ~~ @strings){ print "Found $elem\n"; } }

1 голос
/ 13 декабря 2011

Другим подходом может быть использование хеша для сопоставления слов:

my %neurot_hash = map { lc($_) => 1 } qw(going match possible);

for my $sentence (@strings) {
    for my $found (grep { $neurot_hash{ lc($_) } } $sentence =~ /\w['\w-]*/gi) {
        print $found, " ";
    }
    print "\n";
}

Для предоставленных вами данных этот метод работает на ~ 7% быстрее. Но имейте в виду, что набор данных очень мал, поэтому YMMV.

0 голосов
/ 13 декабря 2011

То же, что и bvr-ответ, но, возможно, чище

my %neurot_hash = map { lc($_) => 1 } qw(going match possible);

for my $sentence (@strings) {
    my @words = split /[^\w']/, $sentence; 
            #I am not sure if you want to take "i'm" as a separate word. 
            #Apparently, stackoverflow does not like '.

    my @found = grep { exists $neurot_hash{ lc($_) } } @words;
    print join (" ",  @found);
    print "\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...