Source code for textattack.transformations.word_insertions.word_insertion_random_synonym

"""

WordInsertionRandomSynonym Class
------------------------------------
random synonym insertation Transformation
"""

import random

from nltk.corpus import wordnet

from .word_insertion import WordInsertion


[docs]class WordInsertionRandomSynonym(WordInsertion): """Transformation that inserts synonyms of words that are already in the sequence.""" def _get_synonyms(self, word): synonyms = set() for syn in wordnet.synsets(word): for lemma in syn.lemmas(): if lemma.name() != word and check_if_one_word(lemma.name()): synonyms.add(lemma.name()) return list(synonyms) def _get_transformations(self, current_text, indices_to_modify): transformed_texts = [] for idx in indices_to_modify: synonyms = [] # try to find a word with synonyms, and deal with edge case where there aren't any for attempt in range(7): synonyms = self._get_synonyms(random.choice(current_text.words)) if synonyms: break elif attempt == 6: return [current_text] random_synonym = random.choice(synonyms) transformed_texts.append( current_text.insert_text_before_word_index(idx, random_synonym) ) return transformed_texts @property def deterministic(self): return False
[docs]def check_if_one_word(word): for c in word: if not c.isalpha(): return False return True