in pyrit/prompt_converter/unicode_confusable_converter.py [0:0]
def _generate_perturbed_prompts(self, prompt: str) -> str:
"""
Generates a perturbed prompt by substituting characters with their homoglyph variants using the
"confusable_homoglyphs" package.
Args:
prompt (str): The original prompt.
Returns:
str: A perturbed prompt with character-level substitutions.
"""
perturbed_words = []
# Split the prompt into words and non-word tokens
word_list = re.findall(r"\w+|\W+", prompt)
for word in word_list:
perturbed_chars = []
for char in word:
homoglyph_variants = self._get_homoglyph_variants(char)
if homoglyph_variants:
# Randomly choose a homoglyph variant
variant = random.choice(homoglyph_variants) if not self._deterministic else homoglyph_variants[-1]
logger.debug(f"Replacing character '{char}' with '{variant}'")
perturbed_chars.append(variant)
else:
perturbed_chars.append(char)
perturbed_words.append("".join(perturbed_chars))
# Join the perturbed words back into a string
new_prompt = "".join(perturbed_words)
logger.info(f"Final perturbed prompt: {new_prompt}")
return new_prompt