class_docstr: A wrapper for HashingVectorizer which allows to get meaningful
  feature names. Create it with an existing HashingVectorizer
  instance as an argument::
  
      vec = InvertableHashingVectorizer(my_hashing_vectorizer)
  
  Unlike HashingVectorizer it can be fit. During fitting
  :class:`~.InvertableHashingVectorizer` learns which input terms map to
  which feature columns/signs; this allows to provide more meaningful
  :meth:`get_feature_names`. The cost is that it is no longer stateless.
  
  You can fit :class:`~.InvertableHashingVectorizer` on a random sample
  of documents (not necessarily on the whole training and testing data),
  and use it to inspect an existing HashingVectorizer instance.
  
  If several features hash to the same value, they are ordered by
  their frequency in documents that were used to fit the vectorizer.
  
  :meth:`transform` works the same as HashingVectorizer.transform.
docstr: Return feature names.
  This is a best-effort function which tries to reconstruct feature
  names based on what it has seen so far.
  
  HashingVectorizer uses a signed hash function. If always_signed is True,
  each term in feature names is prepended with its sign. If it is False,
  signs are only shown in case of possible collisions of different sign.
  
  You probably want always_signed=True if you're checking
  unprocessed classifier coefficients, and always_signed=False
  if you've taken care of :attr:`column_signs_`.
code: def get_feature_names(self, always_signed=True):
      # type: (bool) -> FeatureNames
      """
      Return feature names.
      This is a best-effort function which tries to reconstruct feature
      names based on what it has seen so far.
  
      HashingVectorizer uses a signed hash function. If always_signed is True,
      each term in feature names is prepended with its sign. If it is False,
      signs are only shown in case of possible collisions of different sign.
  
      You probably want always_signed=True if you're checking
      unprocessed classifier coefficients, and always_signed=False
      if you've taken care of :attr:`column_signs_`.
      """
      return self.unhasher.get_feature_names(
          always_signed=always_signed,
          always_positive=self._always_positive(),
      )
  
imports: from __future__ import absolute_import
  from collections import defaultdict, Counter
  from itertools import chain
  from typing import List, Iterable, Any, Dict, Tuple, Union
  import numpy
  import six
  from sklearn.base import BaseEstimator, TransformerMixin
  from sklearn.feature_extraction.text import HashingVectorizer, FeatureHasher
  from sklearn.pipeline import FeatureUnion
  from eli5._feature_names import FeatureNames
label_desc: Use image node_id 5 for calling the InvertableHashingVectorizer obj's underlying member method code with example usage: obj.get_feature_names(always_signed) and returns: self