Binary relations with element support
Change-Id: I2db566bf8f491119f2d431cef504c7a9a29f85ed
diff --git a/lib/KorAP/XML/Field/MultiTermTokenStream.pm b/lib/KorAP/XML/Field/MultiTermTokenStream.pm
index 0d8ae05..3b828d5 100644
--- a/lib/KorAP/XML/Field/MultiTermTokenStream.pm
+++ b/lib/KorAP/XML/Field/MultiTermTokenStream.pm
@@ -14,22 +14,48 @@
};
sub get_node {
- my ($self, $pos, $term) = @_;
- my $mtt = $self->pos($pos);
- my $node = $mtt->grep_mt($term);
+ my ($self, $unit, $term) = @_;
- # TODO: Check if term has PTI 128 - or what is wanted!
+ if ($unit->type eq 'token') {
+ my $mtt = $self->pos($unit->pos);
+ my $node = $mtt->grep_mt($term);
- # TODO: if the node has no TUI - add!
- return $node if $node;
+ # TODO: Check if term has PTI 128 - or what is wanted!
- my $tui = $self->tui($pos);
- return $mtt->add(
- term => $term,
- pti => 128,
- payload => '<s>' . $tui,
- tui => $tui
- );
+ # TODO: if the node has no TUI - add!
+ return $node if $node;
+
+ my $tui = $self->tui($unit->pos);
+ return $mtt->add(
+ term => $term,
+ pti => 128,
+ payload => '<s>' . $tui,
+ tui => $tui
+ );
+ }
+
+ # Is span
+ else {
+ my $mtt = $self->pos($unit->p_start);
+ my $node = $mtt->grep_mt('<>:' . $term);
+
+ # TODO: if the node has no TUI - add!
+ return $node if $node;
+
+ my $tui = $self->tui($unit->p_start);
+
+ return $mtt->add(
+ term => '<>:' . $term,
+ o_start => $unit->o_start,
+ o_end => $unit->o_end,
+ p_start => $unit->p_start,
+ p_end => $unit->p_end,
+ pti => 64,
+ payload => '<b>0<s>' . $tui,
+ tui => $tui
+ );
+
+ };
};
sub add_meta {
diff --git a/lib/KorAP/XML/Index/Mate/Dependency.pm b/lib/KorAP/XML/Index/Mate/Dependency.pm
index 92885c5..ff28d7f 100644
--- a/lib/KorAP/XML/Index/Mate/Dependency.pm
+++ b/lib/KorAP/XML/Index/Mate/Dependency.pm
@@ -10,6 +10,7 @@
# >>:xip/d:SUBJ<i>566<i>789
# Relation data
+ # Supports term-to-term and term-to-element only
$$self->add_tokendata(
foundry => 'mate',
layer => 'dependency',
@@ -37,15 +38,14 @@
# I have no clue, what -- should mean
# next if $_->{-label} eq '--';
- # Target is at the same position!
- my $pos = $source->pos;
-
-
# Get target node - not very elegant
my $target = $stream->get_node(
- $pos, 'mate/d:' . $NODE_LABEL
+ $source, 'mate/d:' . $NODE_LABEL
);
+ # Target is at the same position!
+ my $pos = $source->pos;
+
my %rel = (
pti => 32, # term-to-term relation
payload =>
@@ -72,24 +72,23 @@
my $from = $_->{span}->{-from};
my $to = $_->{span}->{-to};
+ # Get source node
+ my $source_term = $stream->get_node(
+ $source, 'mate/d:' . $NODE_LABEL
+ );
+
# Target
my $target = $tokens->token($from, $to);
+ # Relation is term-to-term with a found target!
if ($target) {
- # Relation is term-to-term with a found target!
-
- # Get source node
- my $source_term = $stream->get_node(
- $source->pos, 'mate/d:' . $NODE_LABEL
- );
# Get target node
my $target_term = $stream->get_node(
- $target->pos, 'mate/d:' . $NODE_LABEL
+ $target, 'mate/d:' . $NODE_LABEL
);
- $mtt->add(
- term => '>:mate/d:' . $label,
+ my %rel = (
pti => 32, # term-to-term relation
payload =>
'<i>' . $target->pos . # right part token position
@@ -97,36 +96,44 @@
'<s>' . $target_term->tui # right part tui
);
+ $mtt->add(
+ term => '>:mate/d:' . $label,
+ %rel
+ );
+
my $target_mtt = $stream->pos($target->pos);
$target_mtt->add(
term => '<:mate/d:' . $label,
- pti => 32, # term-to-term relation
- payload =>
- '<i>' . $target->pos . # right part token position (TODO: THIS IS PROBABLY WRONG!)
- '<s>' . $source_term->tui . # left part tui
- '<s>' . $target_term->tui # right part tui
-
+ %rel
);
}
- else {
- # TODO: SPANS not yet supported
- next;
+ # Relation is possibly term-to-element with a found target!
+ elsif ($target = $tokens->span($from, $to)) {
+
+ # Get target node
+ my $target_span = $stream->get_node(
+ $target, 'mate/d:' . $NODE_LABEL
+ );
+
+ my %rel = (
+ pti => 33, # term-to-element relation
+ payload =>
+ '<i>' . $target->p_start . # right part token position
+ '<s>' . $source_term->tui . # left part tui
+ '<s>' . $target_span->tui # right part tui
+ );
+
+ $mtt->add(
+ term => '>:mate/d:' . $label,
+ %rel
+ );
+
+ $mtt->add(
+ term => '<:mate/d:' . $label,
+ %rel
+ );
};
-
-
- # Temporary
- next;
-
- $mtt->add(
- term => '>:mate/d:' . $label,
- payload => '<i>' . $target->pos
- );
-
- $stream->pos($target->pos)->add(
- term => '<:mate/d:' . $label,
- payload => '<i>' . $source->pos
- );
};
};
}) or return;
diff --git a/lib/KorAP/XML/Tokenizer/Span.pm b/lib/KorAP/XML/Tokenizer/Span.pm
index 9e34aec..b359e14 100644
--- a/lib/KorAP/XML/Tokenizer/Span.pm
+++ b/lib/KorAP/XML/Tokenizer/Span.pm
@@ -7,6 +7,10 @@
bless [], shift;
};
+sub type {
+ 'span';
+};
+
sub o_start {
if (defined $_[1]) {
$_[0]->[0] = $_[1];
diff --git a/lib/KorAP/XML/Tokenizer/Token.pm b/lib/KorAP/XML/Tokenizer/Token.pm
index 36334db..815f9e8 100644
--- a/lib/KorAP/XML/Tokenizer/Token.pm
+++ b/lib/KorAP/XML/Tokenizer/Token.pm
@@ -7,6 +7,10 @@
bless [], shift;
};
+sub type {
+ 'token';
+};
+
# get or set token position
sub pos {
if (defined $_[1]) {