docstr: Tests if Citrus LIME matches the original implementation.
docstr_tok: ["Tests","if","Citrus","LIME","matches","the","original","implementation","."]
code: def test_explain_matches_original_lime(
      self, sentence, num_samples, num_classes, class_to_explain
  ):
      """Tests if Citrus LIME matches the original implementation."""
      list("abcdefghijklmnopqrstuvwxyz")
      # Assign some weight to each token a-z.
      # Each token contributes positively/negatively to the prediction.
      rs = np.random.RandomState(seed=0)
      token_weights = {token: rs.normal() for token in sentence.split()}
      token_weights[lime.DEFAULT_MASK_TOKEN] = 0.0
  
      def _predict_fn(sentences):
          """Mock prediction function."""
          rs = np.random.RandomState(seed=0)
          predictions = []
          for sentence in sentences:
              probs = rs.normal(0.0, 0.1, size=num_classes)
              # To check if LIME finds the right positive/negative correlations.
              for token in sentence.split():
                  probs[class_to_explain] += token_weights[token]
              predictions.append(probs)
          return np.stack(predictions, axis=0)
  
      # Explain the prediction using Citrus LIME.
      explanation = lime.explain(
          sentence,
          _predict_fn,
          class_to_explain=class_to_explain,
          num_samples=num_samples,
          tokenizer=str.split,
          mask_token=lime.DEFAULT_MASK_TOKEN,
          kernel=functools.partial(
              lime.exponential_kernel,
              kernel_width=lime.DEFAULT_KERNEL_WIDTH,
          ),
      )
      scores = explanation.feature_importance  # <float32>[seq_len]
      scores = utils.normalize_scores(scores, make_positive=False)
  
      # Explain the prediction using original LIME.
      original_lime_explainer = original_lime.LimeTextExplainer(
          class_names=map(str, np.arange(num_classes)),
          mask_string=lime.DEFAULT_MASK_TOKEN,
          kernel_width=lime.DEFAULT_KERNEL_WIDTH,
          split_expression=str.split,
          bow=False,
      )
      num_features = len(sentence.split())
      original_explanation = original_lime_explainer.explain_instance(
          sentence,
          _predict_fn,
          labels=(class_to_explain,),
          num_features=num_features,
          num_samples=num_samples,
      )
  
      # original_explanation.local_exp is a dict that has a key class_to_explain,
      # which gives a sequence of (index, score) pairs.
      # We convert it to an array <float32>[seq_len] with a score per position.
      original_scores = np.zeros(num_features)
      for index, score in original_explanation.local_exp[
          class_to_explain
      ]:
          original_scores[index] = score
      original_scores = utils.normalize_scores(
          original_scores, make_positive=False
      )
  
      # Test that Citrus LIME and original LIME match.
      np.testing.assert_allclose(scores, original_scores, atol=0.01)
  
imports: import collections
  import functools
  from absl.testing import absltest
  from absl.testing import parameterized
  from lime import lime_text
  from lit_nlp.components.citrus import lime
  from lit_nlp.components.citrus import utils
  import numpy
  from scipy import special
  from scipy import stats
label_desc: Use image node_id 12 for calling the LimeTest obj's underlying member method code with example usage: obj.test_explain_matches_original_lime(sentence, num_samples, num_classes, class_to_explain) and returns: np