Python: автоматически вводить небольшие опечатки в фразы? - PullRequest
1 голос
/ 05 июля 2019

У кого-нибудь есть идеи, как автоматически вводить общие опечатки в слова фразы?

Я нашел это Как ввести опечатку в строку? но я думаю, что это слишком обобщенно, потому что просто заменяет каждую n-ю букву случайным символом.

Я хотел бы представить "общие" опечатки.

Есть идеи, как это сделать?

1 Ответ

2 голосов
/ 06 июля 2019

В целях моего объяснения, давайте предположим, что у вас есть строковая переменная messages, в которую вы хотите ввести опечатки.Моя стратегия введения опечаток в messages, которые являются опечатками и распространенными, заключалась бы в замене случайных букв в messages другими буквами, находящимися рядом на клавиатуре (т.е. заменойa with s или d with f).Вот как это сделать:

import random # random typos

message = "The quick brown fox jumped over the big red dog."

# convert the message to a list of characters
message = list(message)

typo_prob = 0.1 # percent (out of 1.0) of characters to become typos

# the number of characters that will be typos
n_chars_to_flip = round(len(message) * typo_prob)
# is a letter capitalized?
capitalization = [False] * len(message)
# make all characters lowercase & record uppercase
for i in range(len(message)):
    capitalization[i] = message[i].isupper()
    message[i] = message[i].lower()

# list of characters that will be flipped
pos_to_flip = []
for i in range(n_chars_to_flip):
    pos_to_flip.append(random.randint(0, len(message) - 1))

# dictionary... for each letter list of letters
# nearby on the keyboard
nearbykeys = {
    'a': ['q','w','s','x','z'],
    'b': ['v','g','h','n'],
    'c': ['x','d','f','v'],
    'd': ['s','e','r','f','c','x'],
    'e': ['w','s','d','r'],
    'f': ['d','r','t','g','v','c'],
    'g': ['f','t','y','h','b','v'],
    'h': ['g','y','u','j','n','b'],
    'i': ['u','j','k','o'],
    'j': ['h','u','i','k','n','m'],
    'k': ['j','i','o','l','m'],
    'l': ['k','o','p'],
    'm': ['n','j','k','l'],
    'n': ['b','h','j','m'],
    'o': ['i','k','l','p'],
    'p': ['o','l'],
    'q': ['w','a','s'],
    'r': ['e','d','f','t'],
    's': ['w','e','d','x','z','a'],
    't': ['r','f','g','y'],
    'u': ['y','h','j','i'],
    'v': ['c','f','g','v','b'],
    'w': ['q','a','s','e'],
    'x': ['z','s','d','c'],
    'y': ['t','g','h','u'],
    'z': ['a','s','x'],
    ' ': ['c','v','b','n','m']
}

# insert typos
for pos in pos_to_flip:
    # try-except in case of special characters
    try:
        typo_arrays = nearbykeys[message[pos]]
        message[pos] = random.choice(typo_arrays)
    except:
        break

# reinsert capitalization
for i in range(len(message)):
    if (capitalization[i]):
        message[i] = message[i].upper()

# recombine the message into a string
message = ''.join(message)

# show the message in the console
print(message)
...