Расширенный частотный анализ. Чтение из файла

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

Чтение из файла

Напомню, чтобы читать из файла нам понадобится макрос with-open-file. С помощью этого макроса мы упрощаем себе жизнь, поскольку нет необходимости закрывать файл. При любом раскладе файл закроется сам, это напоминает try with resource в java. Однако как прочитать все строки я ещё не упоминал. И тут есть небольшой секрет. Дело в том, что сама по себе функция read-line вызовет исключение, если натолкнётся на конец файла. Для того, чтобы этого избежать нужно её настроить:

(defun parse-file(filename &optional (n 2))
  (let ((frequency (make-hash-table :test 'equal)))
	(with-open-file (stream filename)
	  (loop
		 for line = (read-line stream nil :eof)
		 until (eq line :eof)
		 do (get-n-gramm line n frequency)))
	frequency))

Здесь я сразу привожу код всей функции, сейчас буду объяснять что к чему. Сначала мы создаём хэш-таблицу и задаём ей сравнение через функцию equal. Это важный момент, поскольку без этого каждая наша триграмма и биграмма будет уникальной, т.е. будет много визуально одинаковых ключей со значением 1. После создания таблицы мы открываем файл на чтение и построчно в цикле читаем.

В функцию read-line передано ещё 2 параметра, это nil — означающий, что при конце файла не нужно выбрасывать исключение и :eof — наше значение которое будет обозначать конец файла. После этого мы задаём условие завершения цикла — пока строка не равна :eof. На каждой итерации считаем n-граммы и храним их в одной хэш-таблице, созданной в самом начале. Последняя строка означает то, что мы возвращаем из функции эту хэш-таблицу с n-граммами. То есть не нужно забывать, что если в функции нет return или return-from, то возвращается значение последнего s-выражения, в данном случае это frequency.

Мотивация

После того как код готов нужно его применить для чего-то. И тут возникает вопрос — кому нужны эти триграммы. Отвечаю — есть наука криптография и её приложение — криптоанализ. Так вот при анализе шифров довольно часто требуется анализировать шифровки на частоту букв. Это позволяет оценить некоторые характеристики текстов, не зная шифра.

Конечно те шифры на практике уже давно не используются, потому что довольно просты и легко взламываются. Однако, они всё так же находят применение на олимпиадах и конкурсах. К тому же у меня есть личная причина интересоваться определённой шифровкой хотя бы потому, что мне однажды попалась одна такая задача. Аналог этой задачи я с лёгкостью нашёл в интернете, но он взламывался в разы легче. Моя же задача оказалась крепким орешком. В следующих заметках я познакомлю вас с ней и может быть покажу решение.

Расширенный частотный анализ. Чтение из файла: 2 комментария

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.