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)
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)