— Синоним к слову «своенравный»? — раздался голос жены из соседней комнаты.

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

— Дык посмотри у этого… как его…
— Да-да, я тоже забыла. Ну так что, скажешь мне синоним?

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



— Так это долго! Я думала, ты быстрее вспомнишь…

Кот, буридановым ослом метавшийся между мной и женой, в конце концов выбрал меня в качестве бОльшего добра (интересно — по весу или по каким-то другим параметрам?) и мне не оставалось ничего делать, как пойти на кухню покормить несчастную животинку. Попутно размышляя о том, как довести до жены тот факт, что “закладки" в браузере предназначены не для повального сохранения всех ее френдов из Вкантактика, а для запоминания действительно нужных ссылок. Все предыдущие попытки научить ее пользоваться закладками заканчивались сохранением если не френдов, то выложенную френдами музыку; но те ссылки, которые сохранил для нее я, оказывались окончательно погребены под этими завалами.

Но если она научилась пользоваться Вкантактиком и Телеграмом, значит… значит она уже умеет пользоваться Телеграмом и Вкантактиком! Эврика!

Кто-то говорил, что боты для Telegram это просто? А вот cейчас возьмем и попробуем…

Как регистрировать пользовательскую часть нового бота, вы скорее всего уже знаете. Если нет — просто добавьте @BotFather в Telegram и начните с ним разговор.

@BotFather — официальный интерфейс управления ботами. Кроме него по запросам о создании ботов прогугливаются Manybot, YourBot, и еще несколько. Судя по описанию, это какие-то прокладки, т.к. при работе с ними все равно придется обращаться к @BotFather. Я не разбирался с ними и буду благодарен за разъяснение пользы от них.

Первая проблема, с которой пришлось столкнуться при создании синоним-бота — поиск словаря синонимов.

Большинство нагугленных словарей пестрят грозными надписями и подписями с перечислением ужасных кар, которые непременно свалятся на голову несчастного, осмелившегося использовать “не по назначению” творение авторов. У которых, судя по количеству смачно расписанных угроз, имеется “копирайт на русский язык” целиком, полностью и безо всяких исключений. Причем “назначение” на таких ресурсах порой не определено нигде и никак, а объемы их словарей как правило составляют жалкие 5000…40 000 слов.

Часть словарей представляют собой алфавитные списки: первая страница со словами на букву “а”, вторая на “б” и так далее. Здесь не то что парсинг, даже загрузка адовой портянки превращается в отдельно стоящую проблему.

И, разумеется, ни о каком API нет даже и речи.

В конце концов мне удалось найти адекватный словарь объемом, как сказано в описании “591 тыс. слов и фразеологизмов и 2166 тыс. синонимических связей”, который к тому же свободно распространяется. Единственным его недостатком оказалось полное отсуствие API, что компенсировалось возможностью легально скачать сам словарь (правда в ужасном формате) и стабильно работающей онлайн-версией.

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

В который раз убеждаюсь, что у хорошего продукта как правило ужасная упаковка, а за красивыми “ле-ендингами” с большими кнопками и воздушными полями прячется обыкновенное фуфло.

На этом месте уже сытый кот оторвался от вылизывания своих теплых аналоговых идентификаторов и утвердительно мявкнул как бы подтверждая, что он не собирается изменять классическому “мяу”, несмотря на то, что кто-то может заявить, что это “некруто” или “отстой”.

Вторая проблема — скорее всего подходящие вам имена ботов будут заняты. Я перепробовал целую кучу благозвучных коротких имен и все они оказались занятыми и — тадааам — ожидаемо мертвыми. В результате пришлось регистировать длинное и трудное для запоминания имя @synonim_bot: по какой-то причине сквоттеры до него не добрались и оно оказалось свободным.


Если вкратце, вся схема работает так:

0. Вы устанавливаете вебхук — сообщаете API Telegram адрес скрипта на своем сервере (HTTPS!), к которому он будет обращаться, когда юзер что-нибудь напишет вашему боту.


И далее реализуете свою логику. На схеме — урезанный вариант логики бота Синоним.



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

Теперь текстом:

1. Юзер пишет вашему боту что-нибудь — команду или слово.

2. API Telegram дергает ваш скрипт (он уже знает его урл из п.0) и передает ему примерно следующее:

{
	"update_id":12345678,
	"message": 
	{
		"message_id":1234,
		"from": 
		{
			"id":0123456789,
			"first_name":"Vasya",
			"username":"vapupkin"
		},
		"chat":
		{
			"id":1234567890,
			"first_name":"Vasya",
			"username":"vapupkin",
			"type":"private"
		},
		"date": 1451606400,
		"text":"preved"
    }
} 

3. Далее ваш скрипт должен разобраться что ему прислали и выдать ответ:

https://api.telegram.org/bot123456789:boLshoiogRomnIycOLlaideR/sendMessage?chat_id=1234567890&text=Taki%20Preved

Наверное правильнее будет переписать это в POST дабы иметь запас по размеру отправляемого текста, но в моем случае вполне хватает и этого: все-таки мессенджеры не предназначены для лонгридов.

4. API Telegram пришлет в ответ нечто подобное:

{
    "ok":true,
    "result":
    {
        "message_id”:1234,
        "from":
        {
            "id”:9876543210,
            "first_name":"Бот",
            "username":"my_bot"
        },
        "chat":
        {
            "id": 0123456789,
            "first_name":"Vasya",
            "username":"vapupkin",
            "type":"private"
        },
        "date": 1451606500,
        "text":"Taki Preved"
    }
}

Я понял так, что с этим ответом я могу поступать как заблагорассудится (если неверно — поправьте). Теоретически на его основе можно собирать статистику, но я собираю ее на более раннем этапе: мне так удобнее.

Пара слов об отличиях присылаемых юзером команд от, сорри за каламбур, слов.
Вы можете заготовить стандартные ответы бота на стандартные вопросы юзера, оформив это хозяйство в виде команд с помощью @BotFather — они будут видны юзеру если тот начнет строку со слэша. В скрипте бота будет достаточно отловить эти команды (API Telegram их так и передает, со слэшем спереди), выдать ответ и тут же прекратить дальнейшее выполнение скрипта.



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


…а также случай, когда юзер вводил целую фразу — ведь словарь этого не умеет:


Третья проблема поджидала меня, когда ботом начали пользоваться реальные люди:


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

С робкой надеждой я сразу же кинулся к любимой Dadata, но обломался: она прекрасно выполняет свои задачи и не замахивается на весь языковой корпус. Гугление, как ни странно, не принесло никакого адекватного результата и я по-быстрому прикрутил Яндекс.Спеллер как временный вариант. Теоретически, пока он не стал платным и не потребовал нотариально заверенной копии паспорта, им тоже можно как-то пользоваться.

Буду благодарен за подсказку: требуется бесплатный сервис проверки орфографии в русском языке с API.

Здесь обнаружилась четвертая проблема: если слово набрано без ошибок, Яндекс.Спеллер не выдает ничегошеньки. Просто молчит как партизан, что немного затрудняет ведение статистики.

Было бы неплохо как-то обозначить исправление пользовательского ввода, не крича об этом во всю ивановскую. Из-за скудного html-инструментария бота я выбрал вот такой вариант оповещения (возможно, в будущем подкорректирую):


Посадил жену тестировать, попросил раздать по сети коллегам. Если бот окажется кому-то нужным, буду его развивать.

P.S.: При написании бота кот Юникс (реальный персонаж) не голодал. А также ни до, ни после.

Пруф




Ссылки:
Бот Синоним: telegram.me/synonim_bot
Словарь синонимов Тришина: www.trishin.ru/left/dictionary
API Telegram: tlgrm.ru/docs/bots/api#authorizing-your-bot
Поделиться с друзьями
-->

Комментарии (43)


  1. k12th
    17.10.2016 14:58
    +3

    О, наконец-то реально полезный бот:)


    1. gluck59
      19.10.2016 12:52

      Спасибо, буду рад если он кому-то поможет.


  1. telhin
    17.10.2016 15:00
    +1

    Почему ограничено число синонимов? Слово «провод» выдает 13 результатов и многоточие. Узнать что скрыто за многоточием невозможно.


    1. gluck59
      17.10.2016 15:02
      +2

      Там GET, у него есть ограничение на длину запроса.

      Наверное правильнее будет переписать это в POST дабы иметь запас по размеру отправляемого текста, но в моем случае вполне хватает и этого: все-таки мессенджеры не предназначены для лонгридов.

      Переделаю, если бот окажется востробованным.


      1. beaverBox
        17.10.2016 17:24

        Вестимо, он станет более востребованным когда переделаете.


  1. mihmig
    17.10.2016 16:43

    Пользуясь случаем спрошу:
    Каковы лимиты отправки сообщений ботами? В официальной документации сказано
    https://core.telegram.org/bots/faq#my-bot-is-hitting-limits-how-do-i-avoid-this
    что:
    1. Скорость отправки particular chat (юзер или группа?) — не более 1 сообщения/сек. С небольшим burst.
    2. При массовой рассылке — не более 30 сообщений/сек.
    3. При отправке в группу — не более 20 сообщений/мин. — не не понятно 20 сообщений за календарную минуту или «скользящее среднее»?

    Пишу свой игровой бот и иногда, при активной игре бот упирается в лимиты…


  1. DenimTornado
    17.10.2016 16:55
    +5

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


    1. beaverBox
      17.10.2016 17:29
      +1

      Щас к бумажной газете аналоговые идентификаторы попросят припостить… =)


  1. Cuthbertnogood
    17.10.2016 17:39
    +2

    На слово привет — выдает синоним — водка.

    Напомните, у нас была водка *привет*? Не помню такой.


    1. k12th
      17.10.2016 21:31
      +2

      А как же! 30 рублей стоила в 1999. Продавщиц очень радовало, когда просовывается в окошко этакая личность и празднично произносит «Привет!».


  1. TimsTims
    17.10.2016 17:40

    > 0. Вы устанавливаете вебхук
    Дам небольшое предостережение от вебхуков:
    1) Если телеграм до вашего сервера не сможет достучаться, то после нескольких (сотен?) попыток в течение довольно короткого вебхук отключается. Ваш бот будет *мёртв*.
    2) Не достучаться может по разным причинам — истёк сертификат, либо сервер недоступен. Либо ваш бот затупил и не смог подключиться к перегруженной общей базе данных. Это всё относится к тем ботам, которые хостятся на слабеньких или простеньких хостингах.
    3) Из этого следует, что более-менее правильный вариант — писать Long-pooling бота, с запуском через Cron, избавляющий сразу от большой головной боли.


    1. gluck59
      17.10.2016 17:56
      +1

      «Long-polling» скорее.
      У меня есть небольшой проектик, получающий апдейты по этой технологии… таки я скажу вам шо это кошмар и я мечтаю переселить его на вебхуки или SSE. Пока не придумал как — там есть одна весьма толстая тонкость.

      Кстати если хостинг пробудет все время этих нескольких (сотен?) попыток в дауне — ожидает ли бота та же участь?

      Крон можно использовать и сейчас. Если вдруг вебхук отключится, он будет поднимать его снова.


  1. Saffron
    17.10.2016 17:54
    -5

    Не надоело ещё переизобретать dictd и dict протокол?


  1. 4eyes
    17.10.2016 18:28
    +4

    В качестве замены бесплатного сервиса проверки орфографии могу предложить NaturalNode/spellcheck. Он инициализируется словарем любого языка, работает хорошо и более-менее шустро

    Пример на github


    1. gluck59
      18.10.2016 00:02
      +1

      Вах, боюсь что это слишком сложно для чайника-самоучки…


      1. 4eyes
        18.10.2016 13:48
        +1

        Реализация по-моему насколько интересная, настолько же и сложная, да.
        Но в использовании всё просто, у меня она используется так, например:

        var natural = require('natural'), 
            dictionary = require('./single-words-354984.json'),  // нагугленный словарь, вручную перекованный на ["слово1", "слово2", ... ]
            spellcheck = new natural.Spellcheck(dictionary);
        
        var topic = "swapign";
        if (!spellcheck.isCorrect(topic))
        {
            // исправление
            var MAX_DISTANCE = 1;
            var corrections = spellcheck.getCorrections(topic, MAX_DISTANCE);
            if (corrections.length > 0)
                topic = corrections[0];
        }
        
        // topic == "swaping"
        
        
        


        1. gluck59
          18.10.2016 16:13

          Любопытства ради: а сколько (примерно) весит этот ваш jsonчик?


          1. 4eyes
            18.10.2016 18:47

            В районе 6 мегабайт.


            1. gluck59
              18.10.2016 18:48

              Понял, сохранил, мерсибо!


    1. svboobnov
      18.10.2016 00:50

      Ух ты!!! Классная библиотека! Но сложная очень.


  1. svboobnov
    17.10.2016 23:22
    +1

    На:

    Буду благодарен за подсказку: требуется бесплатный сервис проверки орфографии в русском языке с API.

    Скажите, плиз, а почему Вас не устраивают Aspell или Hunspell?


    1. gluck59
      18.10.2016 00:01

      Нельзя сказать — устраивают или нет, я не видел их раньше…
      У них ведь заточка под английский язык, верно?


      1. svboobnov
        18.10.2016 00:46
        +1

        Aspell недавно переточили под сложные (флективные) языки (русский и другие), а hunspell изначально написан румыном (hungarian spell checker), сейчас его спонсирует датская компания. В общем, hunspell изначально ковался под сложные языки. И для обоих чекеров есть русскоязычные словари.


        1. gluck59
          18.10.2016 01:36

          Мерси, почитаю о них обязательно.


  1. svboobnov
    17.10.2016 23:27

    И вот ещё накопал: Академик.
    Предлагают бесплатно установить на свой сайт. Если есть APi для PHP, значит и в Вашем языке можно будет что-то сварганить.


  1. mihmig
    18.10.2016 08:40

    А не видел ли кто сервисов/словарей переносов?
    У меня есть задача сформировать изображения из текста, хотелось бы форматировать с переносами…


    1. svboobnov
      18.10.2016 10:09

      Думаю, надо покопаться во внутренностях OpenOffice / LibreOffice, они же как-то ставят переносы.


    1. k12th
      18.10.2016 11:24

      Есть такой алгоритм: http://xpoint.ru/know-how/VebAlgoritmyi/RabotaSTekstami/RasstanovkaPerenosov
      Но мне кто-то говорил, что в каком-то граничном кейсе там есть ошибка.


      1. kdenisk
        18.10.2016 12:15

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


  1. Tenqz
    18.10.2016 10:37

    Не знаю как насчет синонимов, но заметил тенденции на афоризмы. Как вариант ты боту слово, а он тебе 5 :)
    Мне кажется чтобы этот продукт стал массовым, ему надо больше функционала. Вот несколько идей, которые можно включить в базу…

    1. Правила русского языка.
    2. Подбор рифм на слово.
    3. Синонимы (и так уже есть)
    4. Антонимы.
    5. Омонимы.
    6. Умное слово на каждый день.

    И так далее. Тогда такой продукт станет сильнее.


    1. gluck59
      18.10.2016 10:45

      Это уже будет комбайн с настройками на два экрана и UX ниже плинтуса.
      А вот рифмы отдельным ботом — это прикольно. Мерси за идею, надо подумать как их искать. И главное где.


  1. webdiez
    19.10.2016 12:50

    Хороший бот, ждем бота еще с описанием слов по словарю Ожегова.


    1. gluck59
      19.10.2016 12:51

      Спасибо.
      Не думаю, что читать словарные статьи (они бывают довольно объемны) на экранчике смартфона это хорошая идея.


  1. gluck59
    19.10.2016 12:51

    -


  1. kuyantus
    19.10.2016 15:19
    +1

    Вещь интересная. У меня другая мечта была, запилить бота, который бы делал проверки на правильность слов (брал данные с gramota.ru, например). Но, так как я не программист, это так и осталось мечтой.


    1. kdenisk
      19.10.2016 15:38

      Расскажите про идею, если не жалко. Мы занимаемся смежными областями, будет интересно послушать.


      1. svboobnov
        20.10.2016 10:29

        Дык явно же спеллчекер, тот же hunspell с большим словарём прикрутить — и порядок.


        1. kdenisk
          20.10.2016 11:19
          +1

          Если посмотреть на реальную базу ошибок, то иногда делаешь очень интересные открытия. Например:

          — очень частая ошибка *робота (вместо рАбота), хотя существует словоформа робота (У меня нет робота, а так хочется. <вместо> Нужно идти на работу, а так не хочется.)

          — есть случаи, когда без контекста никак — например воспитаНая и воспитаННая. Обе словоформы могут иметь место в соответствующих контекстах.

          — есть ошибки, которые по расстоянию отловить сложно, нужно учитывать фонетические особенности русского языка. Например: *хочица (хочется)

          — популярное -тся/-ться в ряде случает опять же требует контекста или пояснения

          — паронимы: невежа — невежда, тоже стоит учитывать

          В общем работы много, как раз сейчас этим занимаемся :)


          1. Firues
            20.10.2016 12:40

            Где-нибудь можно следить за ходом работы? Будете ли выкатывать продукт в свободный доступ? :)


            1. kdenisk
              20.10.2016 14:45

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

              То, что реалистично сделать, и то, что мы знаем как и зачем поддерживать — это актуальный словарь русской морфологии (слова, словоформы, морфометки). Начнём с этого, посмотрим насколько востребовано, а потом можно будет дальше думать дальше и строить планы.


  1. immaculate
    06.02.2017 14:00

    Самое важное это: «помимо производителя процессора, его уровня, обращайте внимание и на год/месяц начала производства и чипсета и смартфона. Чем новее, тем лучше, это же самая инновационная индустрия!»


    1. gluck59
      20.10.2016 00:55

      Понял, исправился.


  1. Firues
    20.10.2016 13:24

    Не могу упустить возможность и не задать вопрос по схожей тематике:
    кто-нибудь из присутствующих пробовал syntaxnet от google?
    Если да, то был ли опыт с русской моделью?