Разбивайте документы, состоящие из нескольких абзацев, на предложения с номерами абзацев.

У меня есть список хорошо проанализированных документов, состоящих из нескольких абзацев (все абзацы разделены \n\n, а предложения разделены знаком "."), которые я хотел бы разбить на предложения вместе с номер, указывающий номер абзаца в документе. Например, ввод (два абзаца):

First sentence of the 1st paragraph. Second sentence of the 1st paragraph. \n\n 

First sentence of the 2nd paragraph. Second sentence of the 2nd paragraph. \n\n

В идеале вывод должен быть:

1 First sentence of the 1st paragraph. 

1 Second sentence of the 1st paragraph. 

2 First sentence of the 2nd paragraph.

2 Second sentence of the 2nd paragraph.

Я знаком с пакетом Lingua::Sentences в Perl, который может разбивать документы на предложения. Однако это несовместимо с нумерацией абзацев. Поэтому мне интересно, есть ли альтернативный способ добиться вышеизложенного (документы не содержат сокращений). Любая помощь приветствуется. Спасибо!


person user735276    schedule 11.08.2013    source источник
comment
Разделяйте абзацы по очереди, затем добавляйте номер текущего абзаца перед каждым предложением.   -  person tripleee    schedule 11.08.2013


Ответы (2)


Как вы упомянули Lingua::Sentences, я думаю, что это возможность немного манипулировать исходным выводом из этого модуля, чтобы получить то, что вам нужно.

use Lingua::Sentence;

my @paragraphs = split /\n{2,}/, $splitter->split($text);

foreach my $index (0..$#paragraphs) {
    my $paragraph = join "\n\n", map { $index+1 . " $_" } 
        split /\n/, $paragraphs[$index];
    print "$paragraph\n\n";
}
person Alec    schedule 12.08.2013
comment
Спасибо! На самом деле каждый абзац в документе находится на одной строке, так есть ли способ вместо этого просто вывести номер строки? - person user735276; 12.08.2013
comment
Я не знаю, что вы имеете в виду номер строки. Этот фрагмент кода дает вам тот же результат, что и вы описали. - person Alec; 13.08.2013
comment
Работал нормально с небольшой доработкой. Спасибо! - person user735276; 14.08.2013

Если вы можете полагаться на то, что период . является разделителем, вы можете сделать это:

perl -00 -nlwe 'print qq($. $_) for split /(?<=\.)/' yourfile.txt

Объяснение:

  • -00 устанавливает разделитель входных записей на пустую строку, что является режимом абзаца.
  • -l устанавливает разделитель выходных записей на разделитель входных записей, что в данном случае преобразуется в две новые строки.

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

person TLP    schedule 11.08.2013
comment
Спасибо большое за вашу помощь! - person user735276; 12.08.2013