code: def recalculate_attributes(self, force=False):
          # type: (bool) -> None
          
          if not self._attributes_dirty and not force:
              return
          terms = [term for term, _ in self._term_counts.most_common()]
          if six.PY2:
              terms = np.array(terms, dtype=np.object)
          else:
              terms = np.array(terms)
          if len(terms):
              indices, signs = _get_indices_and_signs(self.hasher, terms)
          else:
              indices, signs = np.array([]), np.array([])
          self.terms_ = terms  # type: np.ndarray
          self.term_columns_ = indices
          self.term_signs_ = signs
          self.collisions_ = _get_collisions(indices)
          self.column_signs_ = self._get_column_signs()
          self._attributes_dirty = False
docs: Update all computed attributes. It is only needed if you need to access
          computed attributes after :meth:`patrial_fit` was called.