From Code to Community: Sponsoring The Perl and Raku Conference 2025 Learn more

BEGIN {
$Treex::Core::Node::A::VERSION = '0.05222';
}
use Moose;
# _set_n_node is called only from Treex::Core::Node::N
# (automatically, when a new n-node is added to the n-tree).
has 'n_node' => ( is => 'ro', writer => '_set_n_node', );
# Original w-layer and m-layer attributes
has [qw(form lemma tag no_space_after)] => ( is => 'rw' );
# Original a-layer attributes
has [
qw(afun is_parenthesis_root conll_deprel
edge_to_collapse is_auxiliary)
] => ( is => 'rw' );
sub get_pml_type_name {
my ($self) = @_;
return $self->is_root() ? 'a-root.type' : 'a-node.type';
}
# the node is a root of a coordination/apposition construction
sub is_coap_root {
my ($self) = @_;
log_fatal('Incorrect number of arguments') if @_ != 1;
return defined $self->afun && $self->afun =~ /^(Coord|Apos)$/;
}
# -- linking to p-layer --
sub get_terminal_pnode {
my ($self) = @_;
my $document = $self->get_document();
if ( $self->get_attr('p/terminal.rf') ) {
return $document->get_node_by_id( $self->get_attr('p/terminal.rf') );
}
else {
log_fatal('SEnglishA node pointing to no SEnglishP node');
}
}
sub get_nonterminal_pnodes {
my ($self) = @_;
my $document = $self->get_document();
if ( $self->get_attr('p/nonterminals.rf') ) {
return grep {$_} map { $document->get_node_by_id($_) } @{ $self->get_attr('p/nonterminals.rf') };
}
else {
return ();
}
}
sub get_pnodes {
my ($self) = @_;
return ( $self->get_terminal_pnode, $self->get_nonterminal_pnodes );
}
# -- other --
# Used only for Czech, so far.
sub reset_morphcat {
my ($self) = @_;
foreach my $category (
qw(pos subpos gender number case possgender possnumber
person tense grade negation voice reserve1 reserve2)
)
{
my $old_value = $self->get_attr("morphcat/$category");
if ( !defined $old_value ) {
$self->set_attr( "morphcat/$category", '.' );
}
}
return;
}
# Used only for reading from PCEDT/PDT trees, so far.
sub get_subtree_string {
my ($self) = @_;
return join '', map { $_->form . ( $_->no_space_after ? '' : ' ' ) } $self->get_descendants( { ordered => 1 } );
}
1;
__END__
######## QUESTIONABLE / DEPRECATED METHODS ###########
# For backward compatibility with PDT-style
# TODO: This should be handled in format converters/Readers.
sub is_coap_member {
my ($self) = @_;
log_fatal("Incorrect number of arguments") if @_ != 1;
return (
$self->is_member
|| ( ( $self->afun || '' ) =~ /^Aux[CP]$/ && grep { $_->is_coap_member } $self->get_children )
)
? 1 : undef;
}
# deprecated, use get_coap_members
sub get_transitive_coap_members { # analogy of PML_T::ExpandCoord
my ($self) = @_;
log_fatal("Incorrect number of arguments") if @_ != 1;
if ( $self->is_coap_root ) {
return (
map { $_->is_coap_root ? $_->get_transitive_coap_members : ($_) }
grep { $_->is_coap_member } $self->get_children
);
}
else {
#log_warn("The node ".$self->get_attr('id')." is not root of a coordination/apposition construction\n");
return ($self);
}
}
# deprecated, get_coap_members({direct_only})
sub get_direct_coap_members {
my ($self) = @_;
log_fatal("Incorrect number of arguments") if @_ != 1;
if ( $self->is_coap_root ) {
return ( grep { $_->is_coap_member } $self->get_children );
}
else {
#log_warn("The node ".$self->get_attr('id')." is not root of a coordination/apposition construction\n");
return ($self);
}
}
# too easy to implement and too rarely used to be a part of API
sub get_transitive_coap_root { # analogy of PML_T::GetNearestNonMember
my ($self) = @_;
log_fatal("Incorrect number of arguments") if @_ != 1;
while ( $self->is_coap_member ) {
$self = $self->get_parent;
}
return $self;
}
=encoding utf-8
=head1 NAME
Treex::Core::Node::A
=head1 VERSION
version 0.05222
=head1 DESCRIPTION
a-layer (analytical) node
=head1 METHODS
=head2 Links from a-trees to phrase-structure trees
=over 4
=item $node->get_terminal_pnode
Returns a terminal node from the phrase-structure tree
that corresponds to the a-node.
=item $node->get_nonterminal_pnodes
Returns an array of non-terminal nodes from the phrase-structure tree
that correspond to the a-node.
=item $node->get_pnodes
Returns the corresponding terminal node and all non-terminal nodes.
=back
=head2 Other
=over 4
=item reset_morphcat
=item get_pml_type_name
Root and non-root nodes have different PML type in the pml schema
(a-root.type, a-node.type)
=item is_coap_root
Is this node a root (or head) of a coordination/apposition construction?
On a-layer this is decided based on C<afun =~ /^(Coord|Apos)$/>.
=item get_n_node()
If this a-node is a part of a named entity,
this method returns the corresponding n-node (L<Treex::Core::Node::N>).
If this node is a part of more than one named entities,
only the most nested one is returned.
For example: "Bank of China"
$n_node_for_china = $a_node_china->get_n_node();
print $n_node_for_china->get_attr('normalized_name'); # China
$n_node_for_bank_of_china = $n_node_for_china->get_parent();
print $n_node_for_bank_of_china->get_attr('normalized_name'); # Bank of China
=item $node->get_subtree_string
Return the string coresponding to a subtree rooted in C<$node>.
It's computed based on attributes C<form> and C<no_space_after>.
=back
=head1 AUTHOR
Zdeněk Žabokrtský <zabokrtsky@ufal.mff.cuni.cz>
Martin Popel <popel@ufal.mff.cuni.cz>
=head1 COPYRIGHT AND LICENSE
Copyright © 2011 by Institute of Formal and Applied Linguistics, Charles University in Prague
This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.