|
|
| 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) |