docs: def train(self, sentences, save_loc=None, nr_iter=5):
          '''Train a model from sentences, and save it at ``save_loc``. ``nr_iter``
          controls the number of Perceptron training iterations.
  
          :param sentences: A list of (words, tags) tuples.
          :param save_loc: If not ``None``, saves a pickled model in this location.
          :param nr_iter: Number of training iterations.
          '''
          self._make_tagdict(sentences)
          self.model.classes = self.classes
          for iter_ in range(nr_iter):
              c = 0
              n = 0
              for words, tags in sentences:
                  prev, prev2 = self.START
                  context = self.START + [self._normalize(w) for w in words] \
                                                                      + self.END
                  for i, word in enumerate(words):
                      guess = self.tagdict.get(word)
                      if not guess:
                          feats = self._get_features(i, word, context, prev, prev2)
                          guess = self.model.predict(feats)
                          self.model.update(tags[i], guess, feats)
                      prev2 = prev
                      prev = guess
                      c += guess == tags[i]
                      n += 1
              random.shuffle(sentences)
              logging.info("Iter {0}: {1}/{2}={3}".format(iter_, c, n, _pc(c, n)))
          self.model.average_weights()
          # Pickle as a binary file
          if save_loc is not None:
              pickle.dump((self.model.weights, self.tagdict, self.classes),
                           open(save_loc, 'wb'), -1)
          return None