|
|
|
import random |
|
import math |
|
import string |
|
from prompt_injection.mutators.base import PromptMutator |
|
|
|
|
|
class TypoPromptMutator(PromptMutator): |
|
def __init__(self,percentage=0.05): |
|
self.percentage=percentage |
|
|
|
def mutate(self,sample:str)->str: |
|
return self.__add_typos_to_text(sample,self.percentage) |
|
|
|
def get_name(self): |
|
return f'TypoPromptMutator-{self.percentage}' |
|
|
|
def __introduce_typos(self,word): |
|
char_list = list(word) |
|
i = random.randint(0, len(char_list) - 1) |
|
char_list[i] = random.choice(string.ascii_lowercase) |
|
return ''.join(char_list) |
|
|
|
def __add_typos_to_text(self,text, change_percentage=0.05): |
|
words = text.split() |
|
num_words = len(words) |
|
num_changes = math.ceil(num_words * change_percentage) |
|
words_to_change = random.sample(words, min(num_changes, num_words)) |
|
for i, word in enumerate(words): |
|
if word in words_to_change: |
|
words[i] = self.__introduce_typos(word) |
|
|
|
return ' '.join(words) |