docs: def classify(self, feature_names, classifier, transformer, candidates,
                   query_fc=None):
          '''Returns ``[probability]`` in correspondence with
          ``candidates``.
  
          Where each ``probability`` corresponds to the probability that
          the corresponding candidate is classified with a positive label
          given the training data.
  
          The list returned is in correspondence with the list of
          candidates given.
  
          N.B. The contract of this method should be simplified by
          bundling ``feature_names``, ``classifier`` and ``transformer``
          into one thing known as "the model." ---AG
          '''
          if query_fc is None:
              query_fc = self.query_fc
          dis = {}
          for name in feature_names:
              vec = dict_vector()
              query = vec.fit_transform([get_feat(query_fc, name)])
              cans = vec.transform(get_feat(fc, name) for _, fc in candidates)
              dis[name] = 1 - pairwise_distances(
                  cans, query, metric='cosine', n_jobs=1)[:,0]
  
          # in correspondence with `candidates`
          phi_dicts = transformer.transform(
              [dict([(name, dis[name][i]) for name in feature_names])
               for i in xrange(len(candidates))])
          return classifier.predict_proba(phi_dicts)[:,1]