Beispiel #1
0
    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
Beispiel #2
0
    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
Beispiel #3
0
    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)
Beispiel #4
0
 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_ = []