def attack(self, example, ground_truth_output): """Attack a single example. Args: example (:obj:`str`, :obj:`OrderedDict[str, str]` or :class:`~textattack.shared.AttackedText`): Example to attack. It can be a single string or an `OrderedDict` where keys represent the input fields (e.g. "premise", "hypothesis") and the values are the actual input textx. Also accepts :class:`~textattack.shared.AttackedText` that wraps around the input. ground_truth_output(:obj:`int`, :obj:`float` or :obj:`str`): Ground truth output of `example`. For classification tasks, it should be an integer representing the ground truth label. For regression tasks (e.g. STS), it should be the target value. For seq2seq tasks (e.g. translation), it should be the target string. Returns: :class:`~textattack.attack_results.AttackResult` that represents the result of the attack. """ assert isinstance( example, (str, OrderedDict, AttackedText) ), "`example` must either be `str`, `collections.OrderedDict`, `textattack.shared.AttackedText`." if isinstance(example, (str, OrderedDict)): example = AttackedText(example) assert isinstance( ground_truth_output, (int, str)), "`ground_truth_output` must either be `str` or `int`." goal_function_result, _ = self.goal_function.init_attack_example( example, ground_truth_output) if goal_function_result.goal_status == GoalFunctionResultStatus.SKIPPED: return SkippedAttackResult(goal_function_result) else: result = self._attack(goal_function_result) return result
def attack_dataset(self, dataset, num_examples=None, shuffle=False, attack_n=False): """ Runs an attack on the given dataset and outputs the results to the console and the output file. Args: dataset: An iterable of (text, ground_truth_output) pairs. num_examples: The number of samples to attack. shuffle (:obj:`bool`, optional): Whether to shuffle the data. Defaults to False. attack_n: Whether or not to attack ``num_examples`` examples. If false, will process ``num_examples`` examples including ones which are skipped due to the model mispredicting the original sample. """ examples = self._get_examples_from_dataset(dataset, num_examples=num_examples, shuffle=shuffle, attack_n=attack_n) for goal_function_result, was_skipped in examples: if was_skipped: yield SkippedAttackResult(goal_function_result) continue # Start query count at 1 since we made a single query to determine # that the prediction was correct. self.goal_function.num_queries = 1 result = self.attack_one(goal_function_result) result.num_queries = self.goal_function.num_queries yield result
def attack_dataset(self, dataset, num_examples=None, shuffle=False, attack_n=False): """ Runs an attack on the given dataset and outputs the results to the console and the output file. Args: dataset: An iterable of (text, ground_truth_output) pairs shuffle (:obj:`bool`, optional): Whether to shuffle the data. Defaults to False. """ examples = self._get_examples_from_dataset(dataset, num_examples=num_examples, shuffle=shuffle, attack_n=attack_n) for goal_function_result, was_skipped in examples: if was_skipped: yield SkippedAttackResult(goal_function_result) continue # Start query count at 1 since we made a single query to determine # that the prediction was correct. self.goal_function.num_queries = 1 result = self.attack_one( goal_function_result.tokenized_text, goal_function_result.output ) # @TODO attacks should take one initial goal function result as a parameter result.num_queries = self.goal_function.num_queries yield result
def attack_dataset(self, dataset, indices=None): """Runs an attack on the given dataset and outputs the results to the console and the output file. Args: dataset: An iterable of (text, ground_truth_output) pairs. indices: An iterable of indices of the dataset that we want to attack. If None, attack all samples in dataset. """ examples = self._get_examples_from_dataset(dataset, indices=indices) for goal_function_result in examples: if goal_function_result.goal_status == GoalFunctionResultStatus.SKIPPED: yield SkippedAttackResult(goal_function_result) else: result = self.attack_one(goal_function_result) yield result