Он давно уже вышел за границы Lingvo, стал самостоятельным стандартом и форматом для других словарных оболочек, в том числе одной из самых известных в своём роде — Golden. Dict. Но сама по себе компания ABBYY не достигла бы таких успехов без помощи многочисленной армии энтузиастов- лексикографов, маниакально год за годом оцифровывавших бумажные словари и конвертировавших словари цифровые — от миниатюрных специальных до огромных общего назначения. Одна из самых известных и плодотворных групп давно уже работает на сайте forum. Со временем там накопилась как обширнейшая коллекция словарей, так и основательнейшая база знаний и инструментов в помощь их создателям и редакторам.
Было написано множество скриптов и программ, набор которых отражает историю и изменения популярности языков программирования, более или менее приспособленных для обработки текста. Тут и Perl с Python, и языки пакетных файлов для оболочек, и макросы MS Word и Excel, и компилируемые программы на языках общего назначения. Однако до последнего времени один из языков почти не был представлен в данной сфере. Образец Плана Мероприятий По Пожарной Безопасности подробнее.
Хотелось бы восполнить этот пробел и отдать должное стремительному росту мощности, функциональности и популярности языка Java. Script. Думается, он может оказать большую помощь современным программистам- лексикографам, особенно на границе сетевой и локальной лексикографии. Создание локальной копии сетевого словаря проходит обычно несколько стадий: сохранение HTML- страничек при помощи программ вроде Teleport, очистка их от тегов при помощи регулярных выражений (в текстовых редакторах, макросами или скриптами), окончательная разметка их языком DSL. Java. Script в его Node. WEB и умеет оперировать сетевыми данными, не опускаясь до шаткого и изменчивого уровня кода и регулярных выражений, но работая на уровне элементов DOM.
Я попробую проиллюстрировать возможности языка и некоторых его библиотек на примере создания локальной копии одного из самых богатых и популярных толковых английских словарей, родившихся в сети: Urban Dictionary. Плоды недавних стараний можно оценить по этим раздачам на популярных трекерах: rutracker. Если же вы пока не планируете сохранять какой- то сетевой словарь, можете заглянуть сразу в третью часть статьи: там собраны примеры других частых задач при работе с электронными словарями, которые можно решить при помощи Node. Впрочем, необходимо заметить, что программирование для меня всего лишь хобби. Это одновременно и предупреждение о непрофессиональности дальнейших примеров, и ободрение для тех, кто, как и я, имеет только гуманитарное образование. Подразумевается, что читатель знает Java. Script в его чистом и прикладном вариантах и самостоятельно разобрался в основах Node.
Если это не так, придётся начинать с азов или восполнять пробелы: Java. Script, DOM и Node. В этой статье мы ограничимся обработкой статических страниц (под этим мы будем понимать страницы, ключевое содержимое которых не изменяется при отключении Java. Script) консольными скриптами. Во последующей части мы разберём сохранение динамических сайтов (ключевое содержимое которых формируется скриптами) и коснёмся программ с GUI. Поскольку мы будем запускать скрипты только на своих компьютерах и при этом использовать новые возможности языка, рекомендуется установка последней версии Node.
I. Предварительный этап: получение списка адресов словарных статей. Возможны как минимум три алгоритма создания локальной копии сетевого словаря.
Первый словарь на языке DSL Давайте создадим простой DSL словарь. Наш словарь будет. Поддерживаются исходные файлы словарей -.dsl, вместе с сокращениями. Опционально .
Карточки DSL-словаря, могут быть максимально похожи по структуре на карточки системных словарей Lingvo. Карточки могут содержать все . Обратите внимание, что оцифрованные словари (электронные копии бумажных версий), такие как словарь. DSL (Lingvo), скачать.
В самом худшем случае словарь не предоставляет никакого надёжного механизма для перебора всех статей. Тогда приходится анализировать шаблон адресов и подставлять в него подряд слова из какого- нибудь более- менее полного списка лексем данного языка (можно позаимствовать набор вокабул из самого большого оцифрованного толкового словаря), отбраковывая неудачные запросы. Некоторые словари позволяют идти по цепочке от первой вокабулы до последней (через ссылку «следующее слово» или набор ссылок на ближайшие вокабулы). Это самый простой способ, но не самый наглядный: трудно будет предварительно оценить общее количество вокабул, а затем следить за прогрессом копирования. Поэтому, хотя тот же Urban Dictionary предоставляет эту возможность (на страничке каждого слова есть столбец ссылок на ближайшие предыдущие и последующие статьи), мы будем пользоваться третьим способом. Если словарь имеет отдельный список ссылок на все словарные статьи, мы предварительно копируем весь набор этих ссылок в файл. Так мы получаем представление о предстоящем объёме запросов и возможность следить за процентом сделанного.
Например, в Urban Dictionary по ссылкам типа www. A, www. urbandictionary. A& page=2 и т. В начальной части скрипта мы загружаем необходимые библиотечные модули (или сразу необходимые методы из них, если они будут вызываться часто). Почти все модули встроенные, устанавливающиеся вместе с инсталляцией Node. Из внешних нам понадобится только модуль jsdom: сам по себе Node.
HTML- страницы и превращать их в DOM- дерево, и эту способность нам обеспечит упомянутый модуль (установка модулей проста, ведь вместе с Node. Во второй части мы устанавливаем обработчики для двух событий: для любого окончания работы скрипта (там мы закрываем все файлы и вызываем функцию, которая звуком привлекает внимание пользователя к любому важному событию) и для команды пользователя прервать работу программы (вызывается нажатием клавиш Ctrl+C и переключает флаг прерывания, который проверяется перед каждым новым сетевым запросом). В третьей части мы запускаем цикл запросов, в котором будем получать и сохранять списки адресов словарных статей. Часть делится на два логических блока. Если файл отчёта об уже обработанных страницах пуст, значит, скрипт начинает работу с самого начала, а не после аварийного завершения или пользовательского прерывания.
В этом случае мы выводим в окно консоли и в её заголовок первую букву алфавита, извлекаем её же из алфавитного массива и вызываем функцию получения страницы с построенным по шаблону URL. Если файл не пустой, значит, скрипт уже работал. Нужно извлечь из файла последний обработанный адрес, чтобы сформировать запрос к следующему по очереди. Поскольку файл отчёта может быть большой, мы не будем загружать его в память целиком, но воспользуемся модулем, позволяющим прочитать файл строка за строкой (на всякий случай игнорируя пустые строки).
Дойдя до конца, мы будем иметь нужный адрес в переменной. Проанализировав этот адрес, мы получим букву алфавита, которую последней обрабатывал скрипт, а также определим страницу списка адресов, следующую за сохранённой перед завершением работы программы. Исходя из этих данных, мы сократим алфавитный массив по нужную букву включительно, выведем в консоль новое начало обработки и вызовем функцию получения следующей страницы с шаблоном, учитывающим нужную букву и нужную страницу. На этом процедурная часть скрипта завершается. Далее следуют три функции: одна служебная и две основные, вызывающие друг друга по очереди в цикле запросов.
Для звуковой сигнализации в служебной функции play. Alert() я выбрал консольный кросс- платформенный плеер из библиотеки ffmpeg (ключи запуска см. Звук тоже можно выбрать любой другой. Функция get. Doc(url) отправляет запрос на получение очередной страницы со списком адресов словарных статей. Сперва она проверяет, не требовал ли пользователь прервать работу скрипта (скрипт работает несколько часов, поэтому может возникнуть необходимость в перерыве). Затем функция обновляет переменные прошлого и предстоящего запроса.
Все словари для ABBYY Lingvo. Все права защищены.