Treex-Unilang

 view release on metacpan or  search on metacpan

lib/Treex/Block/W2A/ParseMSTperl.pm  view on Meta::CPAN

    default => '0',
);

has parser => (
    is       => 'ro',
    isa      => 'Treex::Tool::Parser::MSTperl::Parser',
    init_arg => undef,
    builder  => '_build_parser',
    lazy     => 1,
);

has 'additional_model_from_share' => (
    is      => 'ro',
    isa     => 'Bool',
    default => '1',
);

sub _build_parser {
    my ($self) = @_;

    my $base_name = $self->model_dir . '/' . $self->model_name;

    my $config_file = (
        $self->model_from_share
        ?
            require_file_from_share( "$base_name.config", ref($self) )
        :
            "$base_name.config"
    );
    my $config = Treex::Tool::Parser::MSTperl::Config->new(
        config_file => $config_file,
        training    => 0,
        DEBUG => 0,
        lazyload => 1,
    );

    my $parser = Treex::Tool::Parser::MSTperl::Parser->new(
        config => $config
    );
    my $model_file_name = (
	$self->model_gz
	?
	"$base_name.model.gz"
	:
	"$base_name.model"
	);

    my $model_file = (
        $self->model_from_share
        ?
            require_file_from_share( $model_file_name, ref($self) )
        :
            $model_file_name
    );
    log_info "Loading MSTperl::Parser model $model_file";
    $parser->load_model($model_file);

    if ( $self->additional_model_from_share ) {
        if ( $config->use_pmi) {
            my $filename = $self->model_dir  . '/' . $config->pmi_model_file;
            my $loaded_filename = require_file_from_share( $filename, ref($self) );
            $config->pmi_model_file($loaded_filename);
        }
        if ( $config->use_cprob) {
            my $filename = $self->model_dir  . '/' . $config->cprob_model_file;
            my $loaded_filename = require_file_from_share( $filename, ref($self) );
            $config->cprob_model_file($loaded_filename);
        }
    }

    # filenames in config have been changed -- can now load
    $config->load();

    return $parser;
}

override 'process_start' => sub {
    my ($self) = @_;
    super();

    # enforce parser initialization
    $self->parser;

    return;
};

sub parse_chunk {
    my ( $self, @a_nodes ) = @_;

    # assumes that a_nodes are ordered correctly
    # (BaseChunkParser ensures that now)

    # get alignment mapping
    my $alignment_hash =
        $self->_get_alignment_hash( $a_nodes[0]->get_bundle() );

    # convert from treex data structures to parser data structures
    my $sentence = $self->_get_sentence( $alignment_hash, @a_nodes );

    # run the parser
    my @node_parents = @{ $self->parser->parse_sentence($sentence) };

    # set nodes' parents
    my @roots = ();
    foreach my $a_node (@a_nodes) {
        my $parent_index_1based = shift @node_parents;
        if ($parent_index_1based) {    # node's parent is a real node
            my $parent_index_0based = $parent_index_1based - 1;
            my $parent_node         = $a_nodes[$parent_index_0based];
            $a_node->set_parent($parent_node);
        } else {
            # == 0; node's parent is the technical root of the chunk
            # keep the original parent (the technical root of the sentence)
            push @roots, $a_node;
        }
    }

    # return roots of all parse subtrees
    return @roots;
}

# convert from treex data structures to parser data structures
sub _get_sentence {
    my ( $self, $alignment_hash, @a_nodes ) = @_;

    # create objects of class Treex::Tool::Parser::MSTperl::Node



( run in 3.335 seconds using v1.01-cache-2.11-cpan-75ffa21a3d4 )