Spaces:
Runtime error
Runtime error
""" | |
Transformation Abstract Class | |
============================================ | |
""" | |
from abc import ABC, abstractmethod | |
from textattack.shared.utils import ReprMixin | |
class Transformation(ReprMixin, ABC): | |
"""An abstract class for transforming a sequence of text to produce a | |
potential adversarial example.""" | |
def __call__( | |
self, | |
current_text, | |
pre_transformation_constraints=[], | |
indices_to_modify=None, | |
shifted_idxs=False, | |
return_indices=False, | |
): | |
"""Returns a list of all possible transformations for ``current_text``. | |
Applies the ``pre_transformation_constraints`` then calls | |
``_get_transformations``. | |
Args: | |
current_text: The ``AttackedText`` to transform. | |
pre_transformation_constraints: The ``PreTransformationConstraint`` to apply before | |
beginning the transformation. | |
indices_to_modify: Which word indices should be modified as dictated by the | |
``SearchMethod``. | |
shifted_idxs (bool): Whether indices could have been shifted from | |
their original position in the text. | |
return_indices (bool): Whether the function returns indices_to_modify | |
instead of the transformed_texts. | |
""" | |
if indices_to_modify is None: | |
indices_to_modify = set(range(len(current_text.words))) | |
# If we are modifying all indices, we don't care if some of the indices might have been shifted. | |
shifted_idxs = False | |
else: | |
indices_to_modify = set(indices_to_modify) | |
if shifted_idxs: | |
indices_to_modify = set( | |
current_text.convert_from_original_idxs(indices_to_modify) | |
) | |
for constraint in pre_transformation_constraints: | |
indices_to_modify = indices_to_modify & constraint(current_text, self) | |
if return_indices: | |
return indices_to_modify | |
transformed_texts = self._get_transformations(current_text, indices_to_modify) | |
for text in transformed_texts: | |
text.attack_attrs["last_transformation"] = self | |
return transformed_texts | |
def _get_transformations(self, current_text, indices_to_modify): | |
"""Returns a list of all possible transformations for ``current_text``, | |
only modifying ``indices_to_modify``. Must be overridden by specific | |
transformations. | |
Args: | |
current_text: The ``AttackedText`` to transform. | |
indicies_to_modify: Which word indices can be modified. | |
""" | |
raise NotImplementedError() | |
def deterministic(self): | |
return True | |