преобразовать абзац в предложение с помощью Perl

Я занимаюсь программированием на Perl. Мне нужно прочитать абзац и распечатать каждое предложение в виде строки.

Кто-нибудь знает, как это сделать?

Ниже мой код:

#! /C:/Perl64/bin/perl.exe

use utf8;

if (! open(INPUT, '< text1.txt')){
die "cannot open input file: $!";
}

if (! open(OUTPUT, '> output.txt')){
die "cannot open input file: $!";
}

select OUTPUT;

while (<INPUT>){
print "$_";
}

close INPUT;
close OUTPUT;
select STDOUT;

person new    schedule 01.04.2013    source источник
comment
Вы должны use strict и use warnings.   -  person squiguy    schedule 01.04.2013
comment
Что вы подразумеваете под «превратить абзац в предложение»? Вы имеете в виду «разбить абзац на отдельные предложения», а затем распечатать каждое предложение в отдельной строке. Сколько предложений в «Кажется, мистер А. П. Макдауни был довольно занят!»   -  person Jonathan Leffler    schedule 01.04.2013
comment
@squiguy: первый select устанавливает поток вывода по умолчанию для именованного файла (OUTPUT), поэтому неквалифицированный вывод print направляется в этот файл; второй сбрасывает дефолт, но так как скрипт вот-вот выйдет лишним.   -  person Jonathan Leffler    schedule 01.04.2013
comment
@JonathanLeffler Хорошо, это небольшой ярлык для записи в файл. Спасибо.   -  person squiguy    schedule 01.04.2013
comment
ага, раздели абзац на предложение   -  person new    schedule 01.04.2013
comment
Используйте print OUTPUT $_; вместо select.   -  person ikegami    schedule 01.04.2013


Ответы (3)


Если вам дан абзац в виде строки, вы можете разделить() его на символы, которые отметить конец предложения.

Например:

my @sentences = split /[.?!]/, $paragraph;
person Bitwise    schedule 01.04.2013
comment
Ой! Это так не правильно! Как узнать, стоит ли знак в конце предложения? Например, он не может правильно обработать этот комментарий. - person ikegami; 01.04.2013
comment
@ikegami ОП не определил, что он имеет в виду под предложением. Для многих целей предложение можно рассматривать как последовательность слов, оканчивающуюся определенным знаком препинания. Я считаю, что это то, к чему стремился ОП, учитывая его текущий код. - person Bitwise; 01.04.2013
comment
Как вы думаете, в каком мире доктор Но сказал «да». можно считать два предложения? Если вы собираетесь составить свои собственные определения, вы должны их сформулировать. - person ikegami; 01.04.2013
comment
Его код не показывает каких-либо попыток идентифицировать предложения, так как же вы можете утверждать с невозмутимым видом, что знаете, чего он хочет, основываясь на коде, который он еще даже не придумал! Я не -1, но это заявление заставило меня хотеть. - person ikegami; 01.04.2013
comment
О, еще одна проблема: вы фактически удаляете знаки препинания. - person ikegami; 01.04.2013
comment
@ikegami, видите ли, это именно то, чего он хотел. Не нужно быть негативным. ;) спасибо за редактирование. - person Bitwise; 01.04.2013

Вместо того, чтобы обрабатывать имена файлов, я позволю 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

Идентификация предложений очень сложна и зависит от языка. Вам понадобится помощь. Возможно, Lingua::EN::Sentence — правильный путь ?

person ikegami    schedule 01.04.2013