Если вы действительно ищете что-то "лучше, чем я могу придумать" и
"произносимый", тогда, возможно, просто используйте random.sample()
, чтобы вытащить из списка
согласные-гласные-согласные псевдослоги:
import string
import itertools
import random
initial_consonants = (set(string.ascii_lowercase) - set('aeiou')
# remove those easily confused with others
- set('qxc')
# add some crunchy clusters
| set(['bl', 'br', 'cl', 'cr', 'dr', 'fl',
'fr', 'gl', 'gr', 'pl', 'pr', 'sk',
'sl', 'sm', 'sn', 'sp', 'st', 'str',
'sw', 'tr'])
)
final_consonants = (set(string.ascii_lowercase) - set('aeiou')
# confusable
- set('qxcsj')
# crunchy clusters
| set(['ct', 'ft', 'mp', 'nd', 'ng', 'nk', 'nt',
'pt', 'sk', 'sp', 'ss', 'st'])
)
vowels = 'aeiou' # we'll keep this simple
# each syllable is consonant-vowel-consonant "pronounceable"
syllables = map(''.join, itertools.product(initial_consonants,
vowels,
final_consonants))
# you could trow in number combinations, maybe capitalized versions...
def gibberish(wordcount, wordlist=syllables):
return ' '.join(random.sample(wordlist, wordcount))
Тогда вы просто выбираете достаточно большое количество "слов":
>>> len(syllables)
5320
>>> gibberish(4)
'nong fromp glosk zunt'
>>> gibberish(5)
'samp nuv fog blew grig'
>>> gibberish(10)
'strot fray hag sting skask stim grun prug spaf mond'
Моя статистика немного нечеткая, но этого может быть достаточно для не-АНБ
цели. Обратите внимание, что random.sample()
работает без замены. Я также должен отметить, что если злоумышленник узнает, что вы используете этот метод, он будет уязвим для атаки по словарю. Щепотка соли поможет с этим.
Обновление : Для тех, кто заинтересован, доступна обновленная и разветвленная версия по адресу https://github.com/greghaskins/gibberish.