Ваш оригинал:
#!/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: $!";