Source code for textattack.transformations.word_swaps.word_swap

"""
Word Swap
-------------------------------
Word swap transformations act by replacing some words in the input. Subclasses can implement the abstract ``WordSwap`` class by overriding ``self._get_replacement_words``

"""

import random
import string

from textattack.transformations import Transformation


[docs]class WordSwap(Transformation): """An abstract class that takes a sentence and transforms it by replacing some of its words. letters_to_insert (string): letters allowed for insertion into words (used by some char-based transformations) """ def __init__(self, letters_to_insert=None): self.letters_to_insert = letters_to_insert if not self.letters_to_insert: self.letters_to_insert = string.ascii_letters def _get_replacement_words(self, word): """Returns a set of replacements given an input word. Must be overriden by specific word swap transformations. Args: word: The input word to find replacements for. """ raise NotImplementedError() def _get_random_letter(self): """Helper function that returns a random single letter from the English alphabet that could be lowercase or uppercase.""" return random.choice(self.letters_to_insert) def _get_transformations(self, current_text, indices_to_modify): words = current_text.words transformed_texts = [] for i in indices_to_modify: word_to_replace = words[i] replacement_words = self._get_replacement_words(word_to_replace) transformed_texts_idx = [] for r in replacement_words: if r == word_to_replace: continue transformed_texts_idx.append(current_text.replace_word_at_index(i, r)) transformed_texts.extend(transformed_texts_idx) return transformed_texts