Приближается главный праздник года, по крайней мере по версии всевозможных торговых предприятий, которые начинают готовиться к нему за два месяца. И по этому поводу поделюсь с вами рождественско-новогодней музыкой. Все эти песни весьма известны и любимы.
Итак, отличный кавер на песню Леонарда Коэна.
Или вот прекрасная песня в исполнении ещё молодого и красивого Девида Боуи и уже не такого молодого, но ещё красивого Бинга Кросби. Те, кому не интересно слушать их рождественскую болтовню, могут сразу перематывать на 1:47, где начинается сама песня.
Ещё кавер.
На YouTube новогодне-рождественских песен столько, что выбрать среди них что-то очень сложно. Поэтому остановлюсь ещё на одной песне, о которой я уже как-то писал. На этот раз в бодром исполнении Trans-Siberian Orchestra.
Редакция блога желает всем отличного нового года. Спасибо, что вы нас читаете и даже иногда комментируете. Увидимся в следующем году.
Я продолжаю разбираться со словарём словоформ (морфологический словарь, spellcheck). Полтора года лежал и всё было замечательно, а тут столько всего и сразу.
Разбирательство началось с того, что в результирующем файле я не обнаружил слова «ниже», а закончилось перечитыванием документации по формату файлов hunspell и переписыванием ядра конвертера.
Словарь прирос на 4,5 Мб и ≈166000 словоформ. Можно скачивать, он определённо стал лучше, и теперь в нём есть слова «ниже» и «пониже».
- Скачать russian.diс.tar.bz2 (6 Мб)
- Скачать russian.dic.zip (6,7 Мб)
Ну и вкратце расскажу про сам формат hunspell. Рассказывать буду на примере того, как выглядит словарь, который мне пришлось разбирать, т. к. вообще-то могут быть некоторые девиации. У меня не было цели написать полный конвертер для всех языков и словарей.
Словарь hunspell состоит из двух файлов: словаря (.dic
) и аффиксов, т. е. префиксов или суффиксов (.aff
). В собственно словаре (.dic
) содержатся слова в начальной форме и список правил для аффиксов, которые к этому слову применяются. Например:
низкий/CCCDCo
Тут у нас три двухбуквенных аффикса: CC
, CD
и Co
. Дальше смотрим в файл аффиксов, чтобы понять, что все это значит. Тут я приведу только кусочек, связанный с нашим словом «низкий».
SFX CC ий ого [гкх]ий #низкий --> низкого (е.ч.м.р.р.п.)
SFX CC ий ому/Ss [гкх]ий #низкий --> низкому (е.ч.м.р.д.п.)
SFX CC ий им ий #низкий --> низким (е.ч.м.р.т.п. и мн.ч.о.р.д.п.)
SFX CC ий ом [гкх]ий #низкий --> низком (е.ч.м.р.п.п.)
SFX CC ий ая [гкхжчшщ]ий #низкий --> низкая (е.ч.ж.р.и.п.)
SFX CC ий ой [гкх]ий #низкий --> низкой (е.ч.ж.р.р.п.+д.п.+т1.п.+п.п.)
SFX CC ий ую [гкхжчшщ]ий #низкий --> низкую (е.ч.ж.р.в.п.)
SFX CC ий ою [гкх]ий #низкий --> низкою (е.ч.ж.р.т2.п.)
SFX CC ий ое [гкх]ий #низкий --> низкое (е.ч.с.р.и.п.)
SFX CC ий ие ий #низкий --> низкие (мн.ч.о.р.и.п.)
SFX CC ий их ий #низкий --> низких (мн.ч.о.р.р.п.+п.п.)
SFX CC ий ими ий #низкий --> низкми (мн.ч.о.р.т.п.)
SFX CD кий ок [^аеиоуыэюяжчшщйь]кий #низкий --> низок (кр.ф.е.ч.м.р.)
SFX CD ий а [^нраеиоуыэюя]ий #низкий --> низка (кр.ф.е.ч.ж.р.)
SFX CD ий о [^нржчшщаеиоуыэюя]ий #низкий --> низко (кр.ф.е.ч.с.р.)
SFX CD ий и ий #низкий --> низки (кр.ф.мн.ч.о.р.)
SFX Co зкий же/Sr низкий #низкий --> ниже (ср.ст)
Итак, у нас есть много строчек с правилами, которые нужно применить. Блоки в правиле разделяются пробелами. Список блоков:
- SFX для суффикса и PFX для префикса.
- Имя аффикса.
- Что искать.
- На что заменять.
- Условие в виде регулярного выражения, когда можно применить это правило.
- (Опционально)
#
+ комментарий
Т. е. мы просто проходимся по всем правилам, проверяем условия и заменяем одну подстроку на другую.
Иногда в четвёртом блоке может встречаться ещё названия аффиксов. Это означает, что эти аффиксы тоже можно применить. В нашем случае это:
PFX Ss 0 по- . #приставка "по-" для наречий
PFX Sr 0 по . #приставка "по"
0
означает, что ничего удалять не надо, будем только добавлять.
Ликбез завершён. Возможно потом, если будет желание или потребность, добавлю поддержку других опций, которыми изобилуют файлы аффиксов для проверки других языков. Ну и буду продолжать поддерживать словарь русского языка, пока в этом есть необходимость.
UPD 22 декабря 2013: Словарь обновлён.
Прошло полтора года с момента публикации предыдущей версии словаря. Но я про него не забыл: попробуй забыть одну из самых популярных записей, если судить по Google Analytics. И периодически я поглядывал на страницу проекта hunspell-ru в надежде увидеть там обновления, а их всё не было.
Но недавно новая версия таки была выпущена. Плюс к этому я переписал старый код конвертера из Hunspell в plain text. Старый код был написан на PHP в незапамятные времена. Разве можно было пройти мимо и оставить его таким как есть, а не переписать на каком-нибудь новом модном языке, например на Dart?
Нажимаем на одну из ссылок ниже и скачиваем архив. В архиве лежит единственный текстовый файл russian.dic
, в котором перечислено большое количество русских слов во всех возможных формах, по одному слову в каждой строчке. Общее количество слов — 173975, словоформ — 2376434.
- Скачать russian.diс.tar.bz2 (6 Мб)
- Скачать russian.dic.zip (6,7 Мб)
Дальше используете файл на своё усмотрение. Например, можно подключить его в качестве словаря в PhpStorm, IntelliJ IDEA или Eclipse.
Знаю-знаю, писать комментарии к коду на русском языке не комильфо. Но ведь в IDE можно писать не только код. Я, например, пишу тексты для этого блога в PhpStorm (исходники блога на GitHub). Да и мало ли может быть применений! Но должен предупредить: файл словаря имеет размер 53 Мб, что не слишком благоприятно сказывается на объёме используемой IDE памяти.
Надеюсь, файл будет вам полезен. Если вы используете словарь в каких-то других целях, пожалуйста, напишите об этом в комментариях. Мне будет приятно знать, что мои усилия не пропали даром.
UPD 18 декабря 2013: Словарь обновлён.
UPD 22 декабря 2013: Словарь обновлён.
Очередной эксперимент. В этот раз я решил переписать весь JavaScript-код этого блога на новомодном Dart. И если результат я не выложу в итоге на рабочий сервер, это всё равно неплохая возможность взглянуть на новый язык. Почему именно Dart? Даже и не знаю. Мне подход с написанием языка с нуля нравится больше, чем попытки исправить недостатки JavaScript с помощью всяких надстроек, как в случае TypeScript или CoffeeScript. Я не говорю, что это плохие языки, просто они пытаются обойтись «малой кровью», а Google, создатель Dart, играет по крупному.
Итак, я обратил внимание на более лаконичный способ записи функций. Ну ведь правда, зачем писать каждый раз function
, если можно без этого обойтись.
var sum = (a, b) {
return a + b;
};
Или даже ещё короче:
var sum = (a, b) => a + b;
Но это мелочи. Гораздо интереснее исправленные области видимости. Например, переменная, объявленная внутри цикла for
, не видна вне его. Очень понравилось, как в Dart переделали всю структуру DOM-объектов. Например, у элементов свойство textContent
превратилось в text
, а childNodes
в nodes
. Наконец-то attributes
— это явный ассоциативный массив, а не NamedNodeMap
плюс набор методов вроде getAttribute
и setAttribute
. И classes
— это множество, а не строка. Красота!
События тоже претерпели сильные изменения. Нет больше element.onclick
и element.addEventListener
(attachEvent
в старых IE). Теперь события представляют собой потоки, на которые можно подписываться. Теперь нужно писать:
button.onClick.listen((event) {
// do something
});
А если нужно, чтобы обработчик сработал только один раз:
button.onClick.first.then((event) {
// do something
});
Свойство first
в примере выше является Future, что по сути то же, что и Promise. Я, кстати, не знаю, в чём разница между Futures и Promises, буду рад, если кто-нибудь объяснит.
Конечно, вся эта красота не приходит просто так. И если текущая сжатая версия скриптов для блога на языке Dart занимает 13 кб (по большей части из-за подключённой библиотеки интернационализации), то она же, но скомпилированная в JavaScript, все 134.
Текущая версия скриптов тут. Комментарии не возбраняются, а очень даже приветствуются.
Сегодня мы будем слушать IDM. Это расшифровывается как Intelligent Dance Music. Не знаю, что в этой музыке Intelligent, а тем более Dance, но так этот стиль называется.
Вот эта композиция — одна из моих любимых, и она первая приходит на ум, когда речь заходит об IDM. Приятного прослушивания.