Example #1
0
 def train_sent(self, sent):
     # take sent from corpus and update weight vector
     # according to this example
     self.model.update_perceptron_counter()
     # init state
     sent = [ROOT] + sent
     init_state = get_state(sent)
     # build gold tree
     gold_tree = get_tree(sent)
     beam = Beam(self.model.beam_size)
     top_valid_state = None
     beam.add(init_state)
     # loop n-1 step
     step = 0
     # above check
     for i in xrange(len(sent) - 1):
         step += 1
         # extend current beam
         beam, top_valid_state = self.extend_beam_for_train(beam, gold_tree)
         try:
             if not beam.has_element(top_valid_state.top()):
                 self.update_paramaters(beam.top(), -1)
                 self.update_paramaters(top_valid_state.top(), 1)
                 break
         except Exception:
             raise
     if step == len(sent) - 1:
         top_beam = beam.top()
         predict_arcs = top_beam['arcs']
         if not compare_arcs(predict_arcs, gold_tree):
             self.update_paramaters(top_beam, -1)
             self.update_paramaters(top_valid_state.top(), 1)
Example #2
0
 def train(self, sent):
     # update paramaters with one sent
     # ROOT token at begining of pending
     sent = [ROOT] + sent
     # oracle object to check valid action
     oracle = Oracle(sent)
     # gold_deps for full update
     gold_deps = self._build_gold(sent)
     # create start state
     init_state = self._get_state(sent)
     # create beam
     beam = Beam(self.model.beam_size)
     # add state to beam
     beam.add(init_state)
     # correct action with highest score at one step
     valid_action = None
     for step in range(len(sent) - 1):
         beam, valid_action = self._extend_beam(beam, oracle)
         # if beam not contain valid action in it, update
         if not beam.has_element(valid_action):
             beam_top = beam.top()
             self.model.update(beam_top, valid_action)
             break
     else:
         beam_top = beam.top()
         beam_deps = beam_top['deps']
         # if final deps is not like gold_deps, do full update
         if not self._check_equal(gold_deps, beam_deps):
             self.model.update(beam_top, valid_action)