Вместо того, чтобы обрабатывать имена файлов, я позволю Perl сделать это.
Это очень грубо на нескольких уровнях, и полная работа, несомненно, сложна.
предложение.pl
#!/usr/bin/env perl
use strict;
use warnings;
use Lingua::EN::Sentence qw(get_sentences);
sub normalize
{
my($str) = @_;
$str =~ s/\n/ /gm;
$str =~ s/\s\s+/ /gm;
return $str;
}
{
local $/ = "\n\n";
while (<>)
{
chomp;
print "Para: [[$_]]\n";
my @sentences = split m/(?<=[.!?])\s+/m, $_;
foreach my $sentence (@sentences)
{
$sentence = normalize $sentence;
print "Ad Hoc Sentence: $sentence\n";
}
my $sref = get_sentences($_);
foreach my $sentence (@$sref)
{
$sentence = normalize $sentence;
print "Lingua Sentence: $sentence\n";
}
}
}
Регулярное выражение split
ищет один или несколько пробелов, которым предшествует точка (точка), восклицательный или вопросительный знак, и сопоставляет несколько строк. Знак препинания (?<=[.!?])
означает, что в предложении сохранена пунктуация. Функция normalize
просто объединяет символы новой строки в пробелы и отображает несколько пробелов в один пробел. (Обратите внимание, что это не будет правильно распознавать предложение в скобках.) Это будет считаться частью предыдущего предложения, потому что за .
не следует пробел.
Пример ввода
This is a paragraph with more than one sentence in it. How many will be
determined later. Mr. A. P. McDowney has been rather busy. This
incomplete sentence will still be counted as one
This is the second paragraph. With three sentences in it, it is a lot
less exciting than the first paragraph, but the middle sentence extends
over multiple lines and there is some wonky spacing too.
But 'tis time to finish.
Пример вывода
Para: [[This is a paragraph with more than one sentence in it. How many will be
determined later. Mr. A. P. McDowney has been rather busy. This
incomplete sentence will still be counted as one]]
Ad Hoc Sentence: This is a paragraph with more than one sentence in it.
Ad Hoc Sentence: How many will be determined later.
Ad Hoc Sentence: Mr.
Ad Hoc Sentence: A.
Ad Hoc Sentence: P.
Ad Hoc Sentence: McDowney has been rather busy.
Ad Hoc Sentence: This incomplete sentence will still be counted as one
Lingua Sentence: This is a paragraph with more than one sentence in it.
Lingua Sentence: How many will be determined later.
Lingua Sentence: Mr. A. P. McDowney has been rather busy.
Lingua Sentence: This incomplete sentence will still be counted as one
Para: [[This is the second paragraph. With three sentences in it, it is a lot
less exciting than the first paragraph, but the middle sentence extends
over multiple lines and there is some wonky spacing too.
But 'tis time to finish.
]]
Ad Hoc Sentence: This is the second paragraph.
Ad Hoc Sentence: With three sentences in it, it is a lot less exciting than the first paragraph, but the middle sentence extends over multiple lines and there is some wonky spacing too.
Ad Hoc Sentence: But 'tis time to finish.
Lingua Sentence: This is the second paragraph.
Lingua Sentence: With three sentences in it, it is a lot less exciting than the first paragraph, but the middle sentence extends over multiple lines and there is some wonky spacing too.
Lingua Sentence: But 'tis time to finish.
Обратите внимание, как Lingua::EN::Sentence
удалось справиться с 'Mr. A. P. McDowney» лучше, чем простое регулярное выражение.
person
Jonathan Leffler
schedule
01.04.2013
use strict
иuse warnings
. - person squiguy   schedule 01.04.2013select
устанавливает поток вывода по умолчанию для именованного файла (OUTPUT
), поэтому неквалифицированный выводprint
направляется в этот файл; второй сбрасывает дефолт, но так как скрипт вот-вот выйдет лишним. - person Jonathan Leffler   schedule 01.04.2013print OUTPUT $_;
вместоselect
. - person ikegami   schedule 01.04.2013