Как дошёл я до жизни такой, спросите вы? Что ж, придётся начать издалека.
Дело в том, что по воле обстоятельств на протяжении последних нескольких лет я вынужден был заниматься разбором электронных копий заполняемых клиентами бумажных анкет с внесением их результатов в соответствующие базы данных. Работа изначально кропотливая и неблагодарная, которая могла бы свести с ума любого, если бы не одно обстоятельство…
В какой-то момент процесс изучения повторяющихся, типовых частей в различных образцах анкет сподвиг меня на попытку создания системы, способной самостоятельно извлекать пользовательские данные из этой мешанины разнообразных символов. Ну, не совсем на полном «автомате», но всяко лучше, чем вручную разбирать и впечатывать данные, согласитесь же.
Первая такая программка за моим авторством была ещё исключительно самописной и кустарной – и я, честно говоря, до сих пор толком не берусь объяснить, почему же она в большинстве случаев всё же справлялась со своей задачей. Затем я случайно нашёл на необозримых просторах Интернета подходящий мне фреймворк – ну, то бишь, библиотеку из подпрограмм для выполнения всех нужных операций. В основе использования данного фреймворка лежали давно привычные всем компьютерщикам регулярные выражения, которые позволяли создавать здесь основанные на них шаблоны и, наконец, готовые определения требуемых по тексту экстрактов, то есть тех областей этого самого текста, из которых следовало извлечь значения для уже описанных шаблонов, заменяя их на конкретный текст.
Как бы это попроще сформулировать? Ну, многие из вас, наверное, видели так называемые log-файлы отчётов, выглядящие как-то вот так:
127.0.0.1 – – [10/Jun/2009:10:00:00 +0000] "GET /example.html HTTP/1.1" 200 – "http://example.com" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)"
Даже неискушённому пользователю может быть вполне очевидно, что здесь по какому-то сетевому адресу (в данном случае, локальному) в определённый момент времени происходит обращение к внешнему ресурсу с целью извлечения каких-то там данных с использованием определённого вида браузера и операционной системы. Так ведь? И подобные строчки, из которых можно выделить чёткую структуру, поддающуюся декомпозиции (разделению на отдельные смысловые структуры), могут повторяться в файле отчётов сколь угодно много раз. Технический специалист изучает их, извлекает полезную информацию и делает на её основе нужные выводы о работе конкретных программ, системы, действий пользователя и т.д.
Собственно, в природе существует необозримое множество средств для синтаксической декомпозиции подобных структур. Подгоняя один из подобных фреймворков под свои нужды, я лишь немного расширил для себя его функционал, чтобы позволить выделять из произвольного текста такие вот упорядоченные структуры неограниченное число раз. А промежутки между ними могут быть заполнены какими угодно символами, с точки зрения программы представляющими собой простой мусор.
Кстати, про себя я ещё удивился тогда, почему настолько простая идея мало где использовалась раньше – ну, по крайней мере, я не смог найти упоминаний о такого рода деятельности, да и отзывов на мою разработку почти что совсем не было. Попался, правда, один какой-то странный парень, приславший мне электронное письмо с благодарностями и уверявший, что отныне в его библиотеке все теперь могут разбирать оглавления книг с помощью такой вот фиговины. Про себя я лишь удивился столь необычной сфере применения моего метода, и стал думать дальше над тем, что бы с этим ещё можно было сделать.
Новая идея казалась уже чем-то более безумным – я начал разрабатывать средство, которое бы уже способно было самостоятельно определять все упорядоченные и повторяющиеся структуры в произвольном тексте. Здесь, конечно, готового стандартного решения проблемы ещё не существовало – пришлось подключать нейронные сети, которые в общих чертах представляют собой приближённые модели работы нашего собственного мозга. Ну, до человеческих мозгов во всём многообразии их качеств нам всем ещё далеко, конечно, – в лучшем случае, на данный момент мы можем подобным образом имитировать осмысленную деятельность какого-нибудь таракана, не более того. Но, как говорится, и на том спасибо.
И тут в процессе работы меня вдруг осенила новая догадка: а что, если развитие самой нашей жизни проходило примерно по такому же сценарию? Ну, то есть существовала где-то изначально вот такая же программка, которая в определённый момент смогла выделить осмысленные последовательности ДНК-кода будущих первоорганизмов из первичного хаотичного набора символов, а затем организовать их в нужные структуры? Затем, в процессе усложнения собственного функционала, эта программка упорядочивала исходный код во всё более организованные структуры, пока не появился… я, сумевший наглядно объяснить, как всё это работает.