def parse(self, align, actions): state = State(align) for action in actions: if action[0] == 'SHIFT': state.shift() elif action[0] == 'DROP': state.drop() elif action[0] == 'REDUCE': state.reduce() elif action[0] == 'CACHE': state.cache() elif action[0] == 'MERGE': state.merge() elif action[0] == 'CONFIRM': if action[2] == '_UNK_': action[2] = state.buffer_[0].name state.confirm(action[2]) elif action[0] == 'ENTITY': state.entity(action[1], None) elif action[0] == 'LEFT': state.left(action[1]) elif action[0] == 'RIGHT': state.right(action[1]) elif action[0] == 'NEWNODE': state.add_newnode(ConceptNode(action[1], None, None)) state.newnode() else: assert False return state
def entity(self, concept, level, name_level=None): """ pre-condition: stack is not empty :param concept: :param level: :param name_level: :return: """ assert self.can_entity() if concept == 'date-entity': coverage = self.buffer_[0].get_coverage() new_node = ConceptNode(concept, coverage, level) if isinstance(self.buffer_[0], TokenNode): expression = self.buffer_[0].get_name() else: expression = ' '.join( [node.get_name() for node in self.buffer_[0].nodes]) entry, flags = parse_date(expression) for relation, flag in zip(['year', 'month', 'day'], flags): if flag: value = getattr(entry, relation) self.add_edge(new_node, relation, AttributeNode(str(value).decode('utf-8'))) self.buffer_[0] = new_node else: coverage = self.buffer_[0].get_coverage() if concept == 'name': name_concept = ConceptNode('name', coverage, level) else: name_concept = ConceptNode('name', coverage, name_level) if isinstance(self.buffer_[0], TokenNode): self.add_edge(name_concept, 'op1', self.buffer_[0]) elif isinstance(self.buffer_[0], EntityNode): for i, node in enumerate(self.buffer_[0].nodes): self.add_edge(name_concept, 'op{0}'.format(i + 1), node) elif len(nodes) == 1: pass else: assert false if concept == 'name': self.buffer_[0] = name_concept else: new_node = ConceptNode(concept, coverage, level) self.add_edge(new_node, 'name', name_concept) self.buffer_[0] = new_node
def confirm(self, concept, level=None): """ confirm is performed on buffer. :return: """ assert self.can_confirm() coverage = self.buffer_[0].get_coverage() self.buffer_[0] = ConceptNode(self.gao(concept), coverage, level)
def __init__(self, align): self.align = align self.stack_ = [] self.deque_ = [] self.root_ = ConceptNode('_ROOT_', '_ROOT_', '_ROOT_') self.buffer_ = [ TokenNode(tok, [i]) for i, tok in enumerate(align.tok) ] + [self.root_] self.arcs_ = EdgeSet(self.root_) self.newnode_ = []