2010-04-19 2 views
0

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

Пример:

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

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

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

В приведенном выше примере ниже, должны быть удалены только:

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

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

Спасибо.

+1

Реально нет такой вещи, как регулярное выражение, которое соответствует "предложение". – hobbs

ответ

3

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

text = re.sub(r'(^|(?<=[.!?])\s+)[a-z].*?[.!?](?=\s|$)', r'\1', text) 
+0

У этого могут быть проблемы с предложением, которое содержит, скажем, «foo.com». – dreeves

+2

Обнаружение конца предложений надежно нелегко. Мы делаем все возможное, и часто это достаточно хорошо (например, это работает на примере в вопросе). Однако после метки периода/вопроса/восклицательного знака я добавил требование к пробелу/концу строки. –

0

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

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

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

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

Обратите внимание, что это совершенно в значительной степени AI-complete. См. Этот вопрос для примеров того, какие предложения вы никогда не добьетесь: LaTeX sometimes puts too much or too little space after periods.

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

+0

По иронии судьбы, это не будет работать с предложениями, содержащими периоды. –

+0

Не понимаю. Я тестировал его с предложениями, содержащими строки типа «abc.def», и он работает. Возможно, мой код делает неправильную вещь, когда предложение содержит «abc.Def». (Но, может быть, это зависит от того, будет ли это более вероятным для периода, связанного с внутрисловным или условным сроком.) Или вы имеете в виду предложения с такими периодами, как «Я люблю E.B. White»? Это тяжело. – dreeves

0

Почему бы не использовать такой модуль, как 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. 
Смежные вопросы