code: def explain_weights_sklearn_crfsuite(crf,
                                       top=20,
                                       target_names=None,
                                       targets=None,
                                       feature_re=None,
                                       feature_filter=None):
      
      feature_names = np.array(crf.attributes_)
      state_coef = crf_state_coef(crf).todense().A
      transition_coef = crf_transition_coef(crf)
  
      if feature_filter is not None or feature_re is not None:
          state_feature_names, flt_indices = (
              FeatureNames(feature_names).handle_filter(feature_filter, feature_re))
          state_feature_names = np.array(state_feature_names.feature_names)
          state_coef = state_coef[:, flt_indices]
      else:
          state_feature_names = feature_names
  
      def _features(label_id):
          return get_top_features(state_feature_names, state_coef[label_id], top)
  
      if targets is None:
          targets = sorted_for_ner(crf.classes_)
  
      display_names = get_target_display_names(crf.classes_, target_names,
                                               targets)
      indices, names = zip(*display_names)
      transition_coef = filter_transition_coefs(transition_coef, indices)
  
      return Explanation(
          targets=[
              TargetExplanation(
                  target=label,
                  feature_weights=_features(label_id)
              )
              for label_id, label in zip(indices, names)
          ],
          transition_features=TransitionFeatureWeights(
              class_names=names,
              coef=transition_coef,
          ),
          estimator=repr(crf),
          method='CRF',
      )
docs: Explain sklearn_crfsuite.CRF weights.
  
      See :func:`eli5.explain_weights` for description of
      ``top``, ``target_names``, ``targets``,
      ``feature_re`` and ``feature_filter`` parameters.