Как обнаружить и продублировать совпадение слов в предложении на Perl? - PullRequest
2 голосов
/ 30 ноября 2011

У меня есть набор слов, которые меня интересуют, чтобы найти дубликаты базы предложений по двум или более словам:

Пример:

Я хочу обнаружить в предложении слова «мальчик» или «мальчики» и «девочка» или «девочки», чтобы у меня были следующие наборы: (мальчик и девочка), (мальчик и девочки), (девушка и мальчики) ) и (мальчики и девочки).

Приговор:

мальчик идет в школу с девочкой , потому что мальчики как девочки так сильно.

Представление предложения:

WORD1 идет в школу с WORD2, потому что WORD3 так же, как WORD4.

Как я могу иметь четыре (4) разных формы предложения, чтобы оно выглядело так:

Выход:

The WORD1 is going to school with a WORD2, because the WORD like the WORD so much.
The WORD1 is going to school with a WORD, because the WORD like the WORD4 so much.
The WORD is going to school with a WORD2, because the WORD3 like the WORD so much.
The WORD is going to school with a WORD, because the WORD3 like the WORD4 so much.

NB.

Количество слов может быть динамическим от 2 или более; в этом примере у меня есть 4 слова.

Ответы [ 2 ]

1 голос
/ 30 ноября 2011

Хотя все еще требуется много доработок, вам следует начать и указать в правильном направлении:

#!/usr/bin/env perl

use strict;
use warnings;

use Algorithm::Permute;
use Lingua::EN::Tagger;
use Lingua::EN::Inflect::Number qw(to_S);

my $text = q{The boy is going to school with a girl, because the boys
like the girls so much.};

my $tagger = Lingua::EN::Tagger->new;

my $tagged_text = $tagger->add_tags( $text );

my %nouns = $tagger->get_nouns( $tagged_text );

my %normalized;
for my $noun (keys %nouns) {
    $normalized{ to_S($noun)}{ $noun } = undef;
}

for my $nouns (values %normalized) {
    my $p = Algorithm::Permute->new([ keys %$nouns ]);

    while (my @tuple = $p->next) {
        print join(', ', @tuple), "\n";
    }
}

Вывод:

boy, boys
boys, boy
school
girl, girls
girls, girl
1 голос
/ 30 ноября 2011

Использовать обратные ссылки:

if ($sentence =~ m/\b(\w+)\b.*\b\1/) {
  print "repeated use of the word $1\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...