18+
реклама
18+
Бургер менюБургер меню

Александр Александров – Линия передачи (страница 6)

18

Катя коснулась его плеча и провела ладонью до локтя. Он накрыл её пальцы своими.

— Я сейчас дочитаю две страницы, — сказала она. — Потом ложусь.

На столе возле ноутбука лежала целая пачка распечаток. Марк посмотрел на неё.

— Две страницы, — повторила Катя. — Не начинай.

В половине одиннадцатого он сел проверить дневной прогон.

Дверь лоджии была открыта. Сервер шуршал ровно, без своего тяжёлого баса. За стеклом несколько окон соседнего дома горели синим. На подоконнике сушился Алисин бумажный дождь; одна полоса отклеилась и свернулась кольцом.

Марк открыл результат.

Выигрыш сохранился.

Он не улыбнулся. Увеличил учтённые расходы, добавил задержку, сделал условия хуже тех, на которые рассчитывал. Линия опустилась, местами почти легла на ноль, затем медленно пошла вверх.

Раньше на этом месте он начинал считать деньги. Сегодня первым делом открыл код чтения данных.

Ошибку надо было найти прежде, чем он в этот результат поверит. Поверив, искать перестанешь.

Он проверил порядок событий. Потом временные отметки. Потом тот участок, который уже проверял днём. Ничего не нашёл.

Это ещё ничего не значило. Он так и записал на свободном месте в тетради: «это ещё ничего не значит». И тут же на себя рассердился — тетрадь была рабочая, для чисел и настроек, а эта строчка была уговором с самим собой.

В соседней комнате Катя перевернула страницу.

Марк посмотрел на время. Если перейти к свежему потоку, проверить удастся хотя бы главное: программа не сможет подсматривать туда, чего он сам ещё не получил. Для этого не требовалось покупать или продавать. Только слушать.

Он открыл подключение к круглосуточной площадке. Оставил торговые команды отключёнными. Включил запись.

Слева возникали прогнозы, справа — события, с которыми они потом сравнивались. Событие всегда приходило позже прогноза, и между ними оставался небольшой промежуток времени. Иногда он был так короток, что Марк не успевал его заметить; иногда тянулся дольше.

Несколько прогнозов подряд не сбылись.

Марк почувствовал почти облегчение. Вот. На незнакомых данных всё и заканчивается.

Затем программа начала угадывать.

За отдельными совпадениями следили бы дети. Он смотрел на общую ошибку, на то, как она меняется по мере поступления данных. Прошла минута. Другая. Он поправил окно, чтобы видеть и неудачи, и совпадения. Проверил, что журнал действительно сохраняет прогноз раньше результата.

Сохранял.

Из спальни донёсся кашель. Марк машинально поднялся, налил воды и отнёс Кате. Она сидела на кровати в очках, придерживая пальцем страницу.

— Спасибо.

Он поставил стакан и задержался в дверях.

— Кать.

Она посмотрела на него поверх очков.

Он уже знал, что сейчас скажет. «Кажется, получилось». Потом придётся объяснять, насколько получилось, что именно, сколько ещё нужно времени. Она обрадуется, даже если постарается этого не показать. Он увидит, как она устала радоваться заранее.

— Я ещё немного посижу.

Катя сняла очки.

— Сколько?

— Полчаса.

— Правда полчаса?

— Поставлю будильник.

Она кивнула и потянулась к лампе.

Вернувшись, Марк поставил на телефоне таймер. На экране компьютера прибывали строки.

Он вдруг вспомнил руки из сна.

До этого ему казалось, что в мастерской он видел всё обычным образом, из самого себя, только этого себя звали как-то иначе. Теперь обнаружилось другое: он помнил мокрую ручку зонта у себя в ладони — её холод, воду, стекавшую по ней. Воспоминание было подробное и было своё. А принадлежать оно могло только тому, кто стоял у двери.

Он попытался восстановить последовательность. Может быть, сначала вошёл, затем сел за верстак. Может быть, сон перескочил, как это бывает, а утром он решил, что присутствовал в обоих местах одновременно.

Он закрыл глаза.

На миг вернулась мастерская — одно ожидание, без стен и без запаха масла. По обе стороны прилавка ждали, когда другой начнёт говорить.

Марк открыл глаза.

Программа продолжала работать.

Он взял тетрадь и на чистой странице записал: «У двери тоже я».

Некоторое время смотрел на строчку, затем дописал: «Сон. Понедельник, 6 октября».

Вместе с датой запись стала безобиднее. Он положил ручку поперёк страницы.

Слева возникло новое предсказание. Правая колонка на мгновение задержалась.

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

Правая колонка заполнилась.

Числа совпали.

Глава 2. Пять букв

Открытие случилось не там, где он его ждал.

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

Идея была простой до неприличия: взять большой корпус русскоязычных текстов и посчитать, как часто встречаются подряд идущие цепочки букв заданной длины.

Корпус он собрал без разбора — сотни тысяч книг, форумных тредов, инструкций к бытовой технике, судебных решений. Языку было всё равно, откуда он пришёл.

Как программист, Марк не называл то, чем пользовался, «окошком». Правильное слово было — оконная функция: скользящее окно заданной ширины, которое двигалось по тексту поступательно, символ за символом, а не скачками. На каждом шаге оно захватывало ровно одну новую букву впереди и отпускало одну позади. Такие последовательные срезы текста в математике называются N-граммами.

Ширина окна — это N. Пять букв — N=5. Семь — N=7. Всё просто, пока не начинаешь считать, что происходит с памятью.

При N=5 корпус в сотни тысяч книг умещался в два гигабайта. Марк прогнал через алгоритм весь массив за одну ночь на домашнем компьютере.

При N=7 шестьдесят четыре гигабайта заканчивались за считаные минуты, и процесс падал с ошибкой нехватки памяти.

Разница была не в объёме входных данных — корпус оставался тем же. Разница была в том, сколько разных пятибуквенных и семибуквенных цепочек в нём реально встречалось.

Теоретически, если считать по алфавиту из тридцати с небольшим букв, число возможных пятибуквенных комбинаций — величина восьмизначная. Семибуквенных — одиннадцатизначная.

Марк ожидал, что реальный текст будет использовать ничтожную долю этого пространства. Это было очевидно любому, кто хоть немного знаком с лингвистикой. Но то, что он увидел, было не просто «ничтожной долей». Он увидел нечто более странное.

При N=5 почти каждая встретившаяся цепочка встречалась ещё раз. И ещё. Редкие, разовые, случайные комбинации — те, что в статистике называют неустойчивыми, — были исчезающе редки.

При N=7 всё переворачивалось. Огромная часть цепочек, которые вообще появлялись в тексте, появлялись ровно один раз, и никогда больше. Каждая такая цепочка требовала отдельной ячейки памяти, а их были миллионы. Отсюда и рост в тридцать с лишним раз.

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