Как мне перечислить несколько предложений, которые содержат одно и то же слово.Заголовок - это слово, содержащееся в этих предложениях. - PullRequest
0 голосов
/ 10 мая 2011

В настоящее время здесь печатаются все существительные с предложениями, в которых они находятся справа внизу.

#!/usr/bin/perl
use strict;
use warnings FATAL => "all";
my $search_key = "expend";    ## CHANGE "..." to <>

open(my $tag_corpus, '<', "ch13tagged.txt") or die $!;

my @sentences = <$tag_corpus>;    # This breaks up each line into list
my @words;
my %seens = ();
my %seenw = ();

for (my $i = 0; $i <= @sentences; $i++) {
    if (defined($sentences[$i]) and $sentences[$i] =~ /($search_key)_VB.*/i) {
        @words = split /\s/, $sentences[$i];    ## \s is a whitespace
        for (my $j = 0; $j <= @words; $j++) {
            #FILTER if word is noun, and therefore will end with _NN:
            if (defined($words[$j]) and $words[$j] =~ /_NN/) {
                #PRINT word (without _NN) and sentence (without any _ENDING):
                next if $seenw{$words[$j]}++;    ## How to include plural etc
                push @words, $words[$j];
                print "**", split(/_\S+/, $words[$j]), "**", "\n";
                ## next if $seens{ $sentences[$i] }++;
                ## push @sentences, $sentences[$i];
                print split(/_\S+/, $sentences[$i]), "\n"
                ## HOW PRINT bold or specifically word bold?
                #FILTER if word has been output, add sentence under that heading
            }
        }    ## put print sentences here to print each sentence after all the nouns inside
    }
}
close $tag_corpus || die "Can't close $tag_corpus: $!";

1 Ответ

1 голос
/ 10 мая 2011

Ваш оригинал:

#!/usr/bin/perl
use strict;
use warnings FATAL => "all";

Это хорошее начало ...

my $search_key = "expend";    ## CHANGE "..." to <>

Поскольку вы собираетесь использовать это в регулярном выражении в цикле, лучше скомпилировать прямо сейчас: my $verb_regex = qr/\bexpend_VB\b/i. Я ставлю границы слова в там, потому что кажется, что они вам нужны. «

open(my $tag_corpus, '<', "ch13tagged.txt") or die $!;

my @sentences = <$tag_corpus>;    # This breaks up each line into list
my @words;
my %seens = ();
my %seenw = ();

for (my $i = 0; $i <= @sentences; $i++) {

Это делает то же самое с меньшими накладными расходами :

while ( <$tag_corpus> ) { 
    ...

Вернуться к вашему:

    if (defined($sentences[$i]) and $sentences[$i] =~ /($search_key)_VB.*/i) {

Если строка содержит разделитель записей - и будет, если вы не chomp, вы всегда будете получение определенной строки до конца файла. Там нет необходимости проверять на определенные.

Кроме того, вам не нужно .* после поискового запроса и захвата $search_key здесь не действует.

        @words = split /\s/, $sentences[$i];    ## \s is a whitespace

Вы не хотите разделять на одно пространство для пробела. Вы должны использовать /\s+/, но еще лучше это: @words = split ' ', $sentences[$i];

Но тебе это даже не понадобится.

        for (my $j = 0; $j <= @words; $j++) {
            #FILTER if word is noun, and therefore will end with _NN:
            if (defined($words[$j]) and $words[$j] =~ /_NN/) {
                #PRINT word (without _NN) and sentence (without any _ENDING):

Но это все, что вам нужно: слова , оканчивающиеся в _NN. Кроме того, весь список из split будет определен - проверять не нужно.

                next if $seenw{$words[$j]}++;    ## How to include plural etc

Если вы не хотите сбрасывать %seenw после каждого предложения, вы будете обрабатывать только каждое _NN слово один раз за файл.

                push @words, $words[$j];

Я не понимаю, как эта push может служить любой возможной цели, добавляя существительные вернуться к списку слов. Конечно, у вас есть проверка уникальности, прежде чем сохранить вы из бесконечного цикла, если есть _NN слова, но это просто означает, что вы будете иметь все слова в предложении, за которыми следуют все «существительные». Не только это, но вы просто собираюсь проверить, что это существительное и ничего не делать с ним. Не говоря уже о том, что вы clobber список со следующим предложением.

                print "**", split(/_\S+/, $words[$j]), "**", "\n";

                ## next if $seens{ $sentences[$i] }++; 

Вы не хотите делать это в цикле слова

                ## push @sentences, $sentences[$i];

Опять же, я не думаю, что вы хотели бы сделать это, если бы это было без комментариев и за пределами цикла слова. Вроде бы все из 2 строк назад было бы после цикла слова.

                print split(/_\S+/, $sentences[$i]), "\n"
                ## HOW PRINT bold or specifically word bold?
                #FILTER if word has been output, add sentence under that heading
            }
        }    ## put print sentences here to print each sentence after all the nouns inside
    }
}
close $tag_corpus || die "Can't close $tag_corpus: $!";

Неа. Это не справится с плохой отдачей от близких. || или тоже "обязательный" наглухо. Вы закрываете либо $tag_corpus, либо вывод die. К счастью (или, возможно, к несчастью) кубик никогда не вызывается, потому что если мы зайдем так далеко, $tag_corpus должно быть истинное значение

Это своего рода исправленная версия того, что вы пытаетесь сделать - с части, в которых я могу разобраться.

my @sentences;
# We're processing a single line at a time.
while ( <$tag_corpus> ) { 
    # Test if we want to work with the line
    next unless m/$verb_regex/;
    # If we do, then test that we haven't dealt with it before
    # Although I suspect that this may not be needed as much if we're not 
    # pushing to a queue that we're reading from.
    next if    $seens{ $_ }++;

    # split -> split ' ', $_
    # pass through only those words that match _NN at the end and
    # are unique so far. We test on a substitution, because the result
    # still uniquely identifies a noun
    foreach my $noun ( grep { s/_NN$// && !$seenw{ $_ }++ } split ) { 
        print "**$noun**\n";
    }
    # This will omit any adjacent punctuation you have after the word--if 
    # that's a problem.
    print split( /_\S+/ ), "\n";
    # Here we save the sentence.
    push @sentences, $_;
}
close $tag_corpus or die "Can't close ch13tagged.txt: $!";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...