Частотный анализ текста. Пример написания калькулятора
Немного о частотном анализе текста и рассказ о создании калькулятора.
Этот материал распространяется на условиях лицензии Creative Commons Attribution/Share-Alike License 3.0 (Unported). Это означает, что вы можете размещать этот контент на своем сайте или создавать на его основе собственный (в том числе и в коммерческих целях), при условии сохранения оригинального лицензионного соглашения. Кроме того, Вы должны отметить автора этой работы, путем размещения HTML ссылки на оригинал работы https://planetcalc.ru/733/. Пожалуйста оставьте без изменения все ссылки на других авторов данной работы или работы, на основе которой создана данная работа (если таковые имеются в спроводительном тексте).
В общем, есть такая тема — частотный анализ текста. Утверждается, что для данного языка частота встречаемости отдельных букв в осмысленном тексте есть устойчивая величина. Устойчивыми также являются комбинации двух, трех (биграммы, триграммы) и четырех букв.
Этот факт, в частности, использовался в криптографии для вскрытия шифров.
Я в криптографии не очень, и единственное, что приходит на ум, это вскрытие шифра прямой замены. Надо сказать, наиболее примитивного шифра, когда символы исходного алфавита, используемого в сообщении, преобразуются в другие символы по определенному правилу. Такие шифры, кстати сказать, можно было вскрывать и без применения статистического анализа (где для уменьшения погрешности, очевидно, требуется наличие довольно больших кусков текста), а просто догадываясь о некоторых словах — см. рассказ «Пляшущие человечки».
Вот тут, впрочем, интересная статья про историю криптографии.
На самом деле частота встречаемости букв также зависит от типа текста. Калькулятор ниже рассчитывает частоты букв для введенного пользователем текста и выводит для сравнения теоретические частоты букв для художественного русского текста. В качестве значения по умолчанию взят научный текст (начало определения дифференциального уравнения из Википедии), и сразу видно, как, например, различается частота встречаемости буквы Ф в художественном и научном текстах.
Частоты букв для художественного текста я взял отсюда, ну а по указанному адресу утверждают, что взяли их из книги «Яглом А. М., Яглом И. М., Вероятость и информация, М.: Наука, 1973».
Этот калькулятор был создан как пример, для того чтобы продолжить рассказ о том, как создавать калькуляторы на этом сайте, начатый здесь — Площадь четырехугольника. Пример написания калькулятора. В данном случае на примере этого калькулятора я расскажу о том, как писать калькуляторы, выводящие таблицы и строящие графики. Как обычно, все что нужно от автора — некоторое знание Javascript, ну или вообще любого алгоритмического языка программирования. Интересующиеся смотрят текст после самого калькулятора.
Как я уже писал, этот сайт — движок по созданию онлайн-калькуляторов на Javascript. Продолжим срывать покровы таинственности с этого процесса.
Создавать калькуляторы могут зарегистрированные пользователи. После регистрации надо зайти в раздел "Мои калькуляторы" и выбрать пункт меню «Создать...» -> «Калькулятор».
Откроется форма, которая заполняется примерно так:
Далее нужно добавить поле ввода — для получения анализируемого текста от пользователя. Делаем это, нажимая на кнопку in, помеченную красной рамкой на рисунке выше. Открывшийся диалог заполняем следующим образом:
Следующий шаг — создать выходную таблицу, колонки которой должны содержать соответственно букву, частоту ее встречаемости в тексте, выраженную в процентах, и теоретическую частоту ее встречаемости в художественном русском тексте, тоже выраженную в процентах. Итого три колонки. Сразу замечу, что данные таблицы в нашем движке является исходными данными для графика, поэтому, описывая таблицу, мы одновременно будем описывать и график.
Для добавления таблицы нажимаем на кнопочку tbl, отмеченную красной рамкой
Открывается диалог формирования таблицы. Верхняя часть диалога используется для общих свойств, нижняя — для создания колонок. Заполняем форму как указано и нажимаем кнопку «Добавить» для создания первой колонки.
Обратите внимание на то, что в поле «Отображение столбца» выбрано значение «Отображать на графике». Первая колонка с таким значением автоматически становится осью Х графика (ну так сделано). В данном случае по оси Х мы будем откладывать буквы, а по оси Y — частоты.
Добавляем второй столбец (первая серия по оси Y)
Добавляем третий столбец (вторая серия по оси Y)
Таблица и график готовы — закрываем диалог, нажав на «ОК».
Входные и выходные параметры готовы, можно приступать к написанию кода функции Calculate, производящей непосредственные вычисления.
Для начала зададим справочные теоретические значения частот букв в художественном русском тексте. Для того, чтобы не усложнять пример, опишем их простым массивом:
Далее напишем цикл, считающий вхождения букв и помещающий эти данные в массив freqarr, а также считающий общее число букв в тексте и помещающий его в переменную total. Обратите внимание на то, что все не-буквы пропускаются и не участвуют в подсчете, а также на то, что буквы Е и Ё, а также Ь и Ъ объединены. Переменная text это то название, которое мы задали для входного параметра в поле «Переменная» (см. вторую картинку).
Далее мы отсортируем полученные результаты:
И наконец перейдем к созданию таблицы.
В функции Calculate таблица представлена параметром freqreport (так, как мы написали в поле «Переменная» в диалоге создания таблицы). Это объект с единственным методом AddNewRecord. Метод AddNewRecord также возвращает объект, который представляет собой индивидуальную строчку в таблице. У данного объекта есть свойства, которые доступны через имена переменных, заданных нами для столбцов таблицы, а именно letter, freq и theory. Собственно, вся задача теперь сводится к созданию строк и заполнению этих свойств у каждой строки, что и сделано ниже.
Итого, полный код функции:
После написания функции Calculate надо нажать на кнопку «Просмотр» и посмотреть, что получилось. Вообще эта кнопка — аналог кнопки «Сохранить», поэтому жать ее надо периодически, даже если калькулятор не дописан — вдруг разорвется соединение, тогда все пропадет. Я предупредил.
Если в Javascript нет синтаксических ошибок, то после нажатия кнопки «Просмотр» откроется форма просмотра калькулятора, где можно попробовать, как он работает.
Остается последний шаг — опубликовать калькулятор. После его публикации он получит постоянную ссылку на сайте, ну и, собственно, посетители сайта смогут им пользоваться. Для этого нажимаем на кнопку «Опубликовать», и после публикации внизу страницы появится сообщение вида
Текущая версия была опубликована. Результат доступен по адресу www.planetcalc.ru/732
И последний штрих (необязательный). Иногда (пока практически всегда) калькулятор требуется снабдить описанием — что за параметры, по каким формулам считает, и вообще, зачем это все — прямо как я сейчас делаю. Для этого пишется статья, и калькулятор вставляется прямо в статью. Чтобы написать статью, выбираем на главной странице раздела «Мои калькуляторы» пункт меню «Создать...» -> «Статью» и начинаем писать. Чтобы вставить калькулятор, нажимаем кнопку с большой подчеркнутой буквой А, и выбираем в открывшемся диалоге только что созданный калькулятор.
Комментарии