Skip to content

Latest commit

 

History

5 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Генератор русских парольных фраз

xkcd-936

xkcd #936: Password Strength

Идея: вместо случайного набора символов генерировать осмысленную русскую фразу из частотного словаря. Фраза запоминается легко, а энтропия остаётся высокой за счёт большого числа слов в каждой позиции.

Принцип работы

Берём шаблон:

Прил₁(им.п.) Сущ₁(им.п.) Нар Глагол(3 л. ед.ч.) Прил₂(вин.п.) Сущ₂(вин.п.)

Для каждой позиции случайно выбирается слово из соответствующего словаря. Прилагательное согласуется с существительным по роду (им.п.) и по роду + одушевлённости (вин.п.). Окончания берутся напрямую из словаря — без морфологического анализатора во время генерации.

Примеры

Неряшливый уролог поодиночке обнесёт голословную свирель
Случайный клык организованно вожмёт дипломный расплав
Теневыносливая сложность порядочно выручает осенний рюш
Ночная вилка преднамеренно различается суровую ось
Магическая заповедь лестно метнётся ироничный календарь

Энтропия

Словари составлены по пересечению частотного словаря Ляшевской–Шарова (только слова, реально встречавшиеся в НКРЯ) и морфологической базы OpenCorpora (все словоформы с разметкой).

Позиция Часть речи Слов Бит
Прил₁, Прил₂ прилагательные 10 000 13.3
Сущ₁, Сущ₂ существительные 20 000 14.3
Нар наречия 2 200 11.1
Глагол глаголы 12 300 13.6

Итого для шаблона Прил+Сущ+Нар+Гл+Прил+Сущ:

13.3 + 14.3 + 11.1 + 13.6 + 13.3 + 14.3 = 79.9 бит

Параметр --top K ограничивает словари K самыми частыми словами — фразы становятся проще и привычнее, энтропия снижается:

--top Бит Характер фраз
(все) 79.9 редкие слова встречаются
3000 68.9 уверенно узнаваемые слова
500 53.8 только самые общеупотребительные

Использование

# собрать словари (один раз, ~30 сек)
python3 build_dicts.py

# сгенерировать одну фразу
python3 gen.py

# несколько фраз
python3 gen.py -n 5

# только из самых частых слов + показать энтропию
python3 gen.py --top 3000 --entropy -n 3

Структура проекта

build_dicts.py        — сборка словарей из исходников
gen.py                — генератор фраз

data/
  raw/
    ruslang/          — частотный словарь Ляшевской–Шарова
    opencorpora/      — морфологическая база OpenCorpora
  dicts/
    nouns.json        — существительные: лемма, род, одушевлённость, им./вин. форма
    adjs.json         — прилагательные: лемма, все формы им./вин. по родам
    verbs.json        — глаголы: лемма, вид, форма 3 л. ед.ч.
    advs.json         — наречия: лемма
    meta.json         — размеры словарей, энтропия, дата сборки

Источники

  1. О. Н. Ляшевская, С. А. Шаров. Частотный словарь современного русского языка (на материалах Национального корпуса русского языка). М.: Азбуковник, 2009. — dict.ruslang.ru/freq.php

  2. OpenCorpora — открытый корпус русского языка с морфологической разметкой. — opencorpora.org/dict.php

About

XKCD-936 Password generator

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages