About

Все публикации с тегом “jabberdict”

Обновления Jabberdict

Jabberdict переехал с Appengine на свой родной сервер. В процессе переезда веб часть была переписана с использованием розовых пони, а XMPP часть превратилась в настоящий сервер на базе wokkel. Wokkel — эта такая штука, чтобы писать XMPP-сервера с использованием twisted; а twisted в свою очередь — это такая событийно ориентированная (сетевая) библиотека для python. Часто источником вдохновения служил xmppforum. Пользуясь случаем благодарю hoverhell за xmppforum и ценные советы.

Из положительных приобретений переезда стоит отметить значительную экономию дискового пространства (словари занимают ~120Мб, а не ~1Гб). Боты успешно перенесены на собственный домен (jabberdict.ru), а ещё у них появились vCard и ники.

XMPP оказался загадочным и существенно различным у разных клиентов. Но если внимательно читать документацию (и смириться в с тем, что Google Talk — это не совсем стандартный и весьма урезанный XMPP), то все встает на свои места.

Appengine вас ограничивает

Начну с нескольких пожеланий, которые мне пришли от пользователей.

  • Екатерина Волкова: если статья не найдена, найти похожие слова и выдать варианты.
  • Ged Korshunov.ru: придумать ботам более нормальные ники, т.е. заполнить vcard.
  • Rain: а чего для словарных ботов не использовать тот же домен, что и для сайта проекта — jabberdict.ru?

Похожие варианты

Классическим (в понимании компьютерных лингвистов) является расстояние Левенштейна, которое предложила Екатерина. Проблема в том, что при запросе вычислять это расстояние для миллиона (или даже ста тысяч слов) дело неблагодарное, а провести вычисления заранее невозможно.

Мне видятся два подхода: вычислять что-нибудь типа soundex для слова или использовать модель ошибок.

Soundex — это способ представления слова в соответствии с его звучанием. Первая буква слова сохраняется, остальные заменяются кодами в соответствии с таблицей; результирующий код имеет длину четыре символа (буква и три цифры). Для русского языка soundex не работает, но есть неплохие попытки адаптации (что-то сейчас хабр умер, но оживет, думаю).

Главная проблема такого подхода: он ловит неправильное написание (ошибочная замена гласных и т.п.), но не ловит опечатки. То есть, если перепутать пару согласных или написать слово в неправильной раскладке, то soundex уже не поможет.

С точки зрения Appengine такой подход влечет за собой распухание базы данных, а как вы все помните, бесплатный лимит уже почти исчерпан.

Второй способ довольно любопытен, а главное крайне лаконичен (21 строка на Python). Основная идея такова: мы вводим некую модель изменения слова (удаления, вставки и прочее), потом перебираем все варианты (на среднестатистическое слово их несколько сотен). Затем просто ищем по словарю все варианты «исправлений». Не сработало? Давайте сделаем две итерации.

Не лучший вариант с точки зрения производительности (~10 слов в секунду в худшем случае), но зато не нужно ничего хранить. Ну и потом мы же помним, что Datastore медленно пишет, но зато быстро читает?

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

vCard

Логичная просьба. Видеть в ростере бота с именем «Словарь Ожегова» куда приятнее, чем ozhegov@jabberdict.appspotchat.com. Но, увы, в Appengine этого нет.

Никаких способов обойти это ограничение самостоятельно не существует. Если уж мы завязаны на Appengine, то надо сидеть и ждать, пока разработчики Google решат, что данная проблема достойна внимания.

Домен

Не получился красивый ник, так давайте сделаем хотя бы красивый адрес. Например ozhegov@jabberdict.ru.

Мы все помним, что есть такая прекрасная штука, как Google Apps for Domain. Там и почта на своем домене, и сайти, и Google Talk. И XMPP адреса, наверное, тоже можно перенести на свой домен, правда?

Нет. «The use of Google Apps domains in XMPP addresses is not yet supported for apps».

Вместо заключения

Если вы хотите сделать форум, или сайт-визитку, то GAE отлично подходит. Я, конечно, лукавлю, есть масса относительно сложных штук, которые можно теперь делать в Appengine (так или иначе), но если вы делаете что-то нестандартное, то будьте готовы к тому, что вы упретесь в потолок. Не потолок бесплатного аккаунта, а потолок возможностей самой платформы.

А я буду обдумывать перенос сервера на другую платформу.

Jabberdict

Запустил новый проект Jabberdict. Это такой бот-словарь для Jabber/XMPP. Написан на Google App Engine.

До того момента у меня был простой бот-словарь с несколькими тысячами пользователей. Бот жил на сервере JB (спасибо, JB!). К сожалению, старый сервер JB каким-то образом заменили на новый с 256 Мб ОЗУ, а в такой ситуации не до ботов.

Я не хотел бросать словарь, в частности потому, что сам им пользуюсь. Чтобы не перегружать сервер xkcd.ru, я решил переписать словарь на App Engine. Для небольших нагрузок App Engine бесплатен. Стоит заметить, что ограничения по XMPP в бесплатной версии App Engine очень либеральные.

При переезде самой сложной частью оказался, как ни странно, процесс переноса словарей в Datastore. Главная проблема в том, что это довольно долгий процесс. В силу распределенности Datastore запись происходит намного медленнее чтения.

Грубо говоря, процесс был таким: StarDict → слегка модифицированный PyStarDict → csv → Datastore. Конец истории хороший, но более 85% бесплатной квоты (1 Гб) уже израсходовано, хотя все словари в формате csv занимали не более 400 Мб; и это при том, что от части словарей пришлось отказаться. Datastore хранилище универсальное, а значит имеет большой оверхед (нужно хранить названия и типы полей каждой записи, а не только их значения).

Следующим этапом была рассылка сообщений старым пользователям. Логично было бы сделать из старого бота простой автоответчик, но новый ejabberd забыл все подписки. В этом случае все видят бота офлайн (даже рассылка presence вручную не до конца решает проблему). Поэтому пришлось активно рассылать сообщения. Собственно говоря, на данный момент процесс рассылки все ещё не закончен (и не закончится ещё как минимум неделю).

Всех интересующихся приглашаю пользоваться. Отзывы отправляются командой «!feedback» любому из словарей.