The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Lingua::JA::Summarize::Extract::ResultSet;

use strict;
use base qw( Class::Accessor::Fast );
__PACKAGE__->mk_accessors(qw/ length summary sentences /);

use overload (
    q("") => \&as_string,
    fallback => 1,
);

sub new {
    my $class = shift;
    my $self = $class->SUPER::new(@_);
    $self->{length} ||= 255;
    $self->init;
    $self;
}

sub init {
    my $self = shift;

    my @ranking = ();
    for my $line (@{ $self->sentences }) {
        next unless $line;
        my $score = 0;
        for my $term (@{ $self->summary }) {
            my @words = split /\s/, $term->{term};
            my %tmp;
            my $tmp_score = 0;
            for my $word (@words) {
                for ($line->{text} =~ /(\Q$word\E)/) {
                    $tmp_score += $term->{score};
                    $tmp{$word} = 1;
                }
            }
            $score += $tmp_score if scalar(@words) == scalar(keys %tmp);
        }
        push @ranking, +{ %{ $line }, score => $score, A => 'II' };
    }
    @ranking = sort { $b->{score} <=> $a->{score} } @ranking;
    $self->sentences(\@ranking);
}

sub as_string {
    my $self = shift;

    my $text;
    my @result;
    for my $line (@{ $self->sentences }) {
        push @result, $line;
        $text .= "$line->{text}\n";
        last if length $text > $self->length;
    }

    if ($self->{sort} ne 'score') {
        $text = '';
        for my $line (sort { $a->{line} <=> $b->{line} } @result) {
            $text .= "$line->{text}\n";
        }
    }

    my $len = $self->length;
    $text =~ s/^(.{$len}).*$/$1\n/s;
    $text;
}

1;