Как удалить предложения, начинающиеся со строчной буквы? - PullRequest
0 голосов
/ 19 апреля 2010

В приведенном ниже примере следующее регулярное выражение (". *?") Использовалось для удаления всего диалога первым. Следующим шагом является удаление всех оставшихся предложений, начинающихся со строчной буквы. Должны остаться только предложения, начинающиеся с заглавной буквы.

Пример:

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

- спросил Арко, его голос звучал немного неуверенно с подавленным волнением.

ответил Мори, не отворачиваясь от своего поста у окна. Теперь под ними, Менее чем в полумиле вниз по лоскутному одеялу долины Нила стояли люди, глядя вверх, собираясь в маленькие группы, жестикулируя к странной вещи которые материализовались в воздухе над ними.

В приведенном выше примере следует удалить только следующее:

воскликнул Уэйд.
- спросил Арко, его голос звучал немного неуверенно с подавленным волнением.
ответил Мори, не отворачиваясь от своей станции у окна.

Полезное регулярное выражение или простой код на Perl или python приветствуются. Я использую версию 7 Textpipe.

Спасибо.

Ответы [ 3 ]

3 голосов
/ 19 апреля 2010

Это должно работать для приведенного вами примера:

text = re.sub(r'(^|(?<=[.!?])\s+)[a-z].*?[.!?](?=\s|$)', r'\1', text)
0 голосов
/ 15 мая 2010

Почему бы не использовать такой модуль, как Lingua :: EN :: Sentence ? Это позволяет легко получить довольно хорошие предложения из произвольного английского текста.

#!perl

use strict;
use warnings;

use Lingua::EN::Sentence qw( get_sentences );

my $text = <<END;

exclaimed Wade. Indeed, below them were villages, of crude huts made of timber and stone and mud. Rubble work walls, for they needed little shelter here, and the people were but savages.

asked Arcot, his voice a bit unsteady with suppressed excitement.

replied Morey without turning from his station at the window. Below them now, less than half a mile down on the patchwork of the Nile valley, men were standing, staring up, collecting in little groups, gesticulating toward the strange thing that had materialized in the air above them.
END


my $sentences = matching_sentences( qr/^[^a-z]/, $text );

print map "$_\n", @$sentences;

sub matching_sentences {
    my $re   = shift;
    my $text = shift;

    my $s = get_sentences( $text );

    @$s = grep /$re/, @$s;

    return $s;
}

Результаты:

Indeed, below them were villages, of crude huts made of timber and stone and mud.
Rubble work walls, for they needed little shelter here, and the people were but savages.
Below them now, less than half a mile down on the patchwork of the Nile valley, men were standing, staring up, collecting in little groups, gesticulating toward the strange thing that had materialized in the air above them.
0 голосов
/ 19 апреля 2010

Это работает для меня в Perl на вашем примере:

$s = "exclaimed Wade. Indeed, ...";

do {
  $prev = $s;
  $s =~ s/(^\s*|[.!?]\s+)[a-z][^.!?]*[.!?]\s*/$1/gs;
} until ($s eq $prev);

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

Обратите внимание, что делать это идеально - в значительной степени AI-complete . Посмотрите на этот вопрос примеры предложений, которые вы никогда не получите правильно: LaTeX иногда оставляет слишком много или слишком мало места после периодов .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...