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 )