Source code for udapi.block.transform.deproj

"""Block Deproj for deprojectivization of pseudo-projective trees à la Nivre & Nilsson (2005).

See ud.transform.Proj for details.
TODO: implement also path and head+path strategies.
"""
from udapi.core.block import Block


[docs] class Deproj(Block): """De-projectivize the trees à la Nivre & Nilsson (2005).""" def __init__(self, strategy='head', label='misc', **kwargs): """Create the Deproj block object.""" super().__init__(**kwargs) self.strategy = strategy self.label = label
[docs] def process_node(self, node): if self.label == 'misc': label = node.misc['pproj'] elif self.label == 'deprel': parts = node.sdeprel.split('+', 1) if len(parts) == 2: label = parts[1] node.deprel = node.udeprel + (':' + parts[0] if parts[0] else '') else: label = '' else: raise(ValueError('Unknown parameter label=%s' % self.label)) if label == '': return reconstructed_parent = self.head_strategy(node, label) if reconstructed_parent: node.parent = reconstructed_parent
[docs] def head_strategy(self, node, label): queue = [n for n in node.parent.children if n != node] # TODO deque while queue: adept = queue.pop(0) if adept.udeprel == label: return adept queue.extend(adept.children) return None