Реклама
Комментарии 34

Почему-то распозналось по-разному.


через 13 дней
  text: 
  date: SpanForward, NoTime, 10/29/2019 12:00:00 AM - 10/29/2019 11:59:59 PM

спустя 13 дней
  text: Спустя
  date: Fixed, HasTime, 10/16/2019 1:00:00 PM

upd. Понятно, почему именно :)

следующий пример


на следующей неделе во вторник
  text: 
  date: Fixed, NoTime, 10/22/2019 12:00:00 AM - 10/22/2019 11:59:59 PM

через неделю во вторник
  text: 
  date: SpanForward, NoTime, 10/23/2019 12:00:00 AM - 10/23/2019 11:59:59 PM
  date: SpanForward, NoTime, 10/22/2019 12:00:00 AM - 10/22/2019 11:59:59 PM

Сегодня среда, поэтому "через неделю" это следующая среда. Получается "следующая среда во вторник", это две даты, а не одна. Чтобы выбрать вторник на следующей неделе, надо сказать "вторник на следующей неделе".

Денис, на мой взгляд, фраза «через неделю во вторник», это вполне нормальная разговорная фраза. А то что вы пытаетесь пользователя привести к определенному формату общения — это как раз минус современных чат-ботов и голосовых помощников.

Ну окей, дискуссионно. По моему опыту так не говорят. Какой смысл мне был поддержать кучу разговорных фраз и не поддержать эту, если бы я её встречал в реальной жизни? :) Буду изучать логи работы с навыком, вносить в библиотеку правки.

В любом случае — то что получилось, это круто! Буду использовать ваши либу в своём проекте, как раз «собрался с мыслями».

Но тогда остаётся вопрос. Если сегодня воскресенье, то "через неделю во вторник" это через 2 дня или через 9 дней? Если через 9, то в какой момент переход? А если сегодня пятница? Очень неоднозначно.

Да, неоднозначность может быть в разговорной речи передана вербально, а тут может заставлять Алису переспрашивать, видимо…

Предполагается, что фраза должны быть "N дней спустя", хотя наверное "спустя N дней" люди тоже говорят. Благо, модифицировать распознаватель под это очень просто )

Кстати больно смотреть на 10 число 29-го месяца. Может сделать выдачу в ISO формате даты по умолчанию?

Это в .NET Fiddle так, потому что CultureInfo стоит американская. Но я поправлю, да. Библиотека все равно для русского языка.

Когда программа учитывает локаль — это иногда бывает скорее плохо чем хорошо. Особенно если видишь дату вроде 3/10/2019 в отрыве от контекста.

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

А можно ли как-то использовать алису для автоматического распознавания текста и последующей отправки в какой-нибудь api?

Да, у меня есть навык и для этого. Называется "Мой Исполнитель" )

послезавтра вечером в 8 иду в кино

Это и человеку-то не понять. В 8 выйдет в сторону кинотеатра или в 8 начало? Без контекста или известных умолчаний не понять.
Каждый для себя заполняет события как-то по-своему. Я, например, пишу время начала сеанса.
Тут не ловит 'утром'
"request": {
    "command": "завтра утром иду гулять",
    "nlu": {
      "entities": [
        {
          "tokens": {
            "end": 1,
            "start": 0
          },
          "type": "YANDEX.DATETIME",
          "value": {
            "day": 1,
            "day_is_relative": true
          }
        }
      ],
      "tokens": [
        "завтра",
        "утром",
        "иду",
        "гулять"
      ]
    },
    "original_utterance": "завтра утром иду гулять",
    "type": "SimpleUtterance"
  }


Тут ловит только вторую дату
"request": {
    "command": "24 и 25 сентября идём в поход",
    "nlu": {
      "entities": [
        {
          "tokens": {
            "end": 1,
            "start": 0
          },
          "type": "YANDEX.NUMBER",
          "value": 24
        },
        {
          "tokens": {
            "end": 3,
            "start": 2
          },
          "type": "YANDEX.NUMBER",
          "value": 25
        },
        {
          "tokens": {
            "end": 4,
            "start": 2
          },
          "type": "YANDEX.DATETIME",
          "value": {
            "day": 25,
            "day_is_relative": false,
            "month": 9,
            "month_is_relative": false
          }
        }
      ],
      "tokens": [
        "24",
        "и",
        "25",
        "сентября",
        "идём",
        "в",
        "поход"
      ]
    },
    "original_utterance": "24 и 25 сентября идём в поход",
    "type": "SimpleUtterance"
  }


А такое вообще не видит
"request": {
    "command": "в следующий понедельник начинаю бегать",
    "nlu": {
      "entities": [],
      "tokens": [
        "в",
        "следующий",
        "понедельник",
        "начинаю",
        "бегать"
      ]
    },
    "original_utterance": "в следующий понедельник начинаю бегать",
    "type": "SimpleUtterance"
  }

В чем сложность «перенести»? Вроде никакой черной магии и всё в опенсорсе ))
Очень круто! Но кое-какие речевые обороты остаются необработанными:

Да, для таких я не сделал пока обработчик, буду добавлять.

Вот еще пара вариантов:

через полчаса (полгода и т.п.)
text: Через полчаса


зимой 2012
text: Зимой
date: Period, NoTime, 1/1/2012 12:00:00 AM - 12/31/2012 11:59:59 PM


Следующие варианты распознались как недельный промежуток, хотя имелся в виду конкретный день:

месяц назад
text:
date: SpanBackward, NoTime, 9/16/2019 12:00:00 AM - 9/22/2019 11:59:59 PM


через месяц
text:
date: SpanForward, NoTime, 11/11/2019 12:00:00 AM - 11/17/2019 11:59:59 PM


И еще нужен специальный обработчик для тех, кто хочет сходить в Эрмитаж бесплатно :)

в 3 четверг месяца
text: Месяца
date: Fixed, HasTime, 10/17/2019 3:00:00 PM

в 3 четверг ноября
text:
date: Fixed, HasTime, 11/7/2019 3:00:00 PM
Следующие варианты распознались как недельный промежуток, хотя имелся в виду конкретный день

As intended тут. Я должно думал, как распознавать через %название_промежутка%. И решил, что буду понижать на один уровень фиксации:

  • «через год» без дальнейшего уточнения — это промежуток длиной месяц
  • «через месяц» — неделю
  • «через неделю» — день

Логика такая: если бы я спросил своего секретаря «Какие у меня встречи через месяц?», то точно не имел бы ввиду один конкретный день +30 дней относительно сегодня, а имел бы ввиду некоторый промежуток примерно через месяц.

Вопрос "какие встречи через месяц" некорректнен и может быть не понят даже человеком, вместо этого надо спрашивать "какие у меня встречи в течении недели через месяц". Но зато в других вариантах однозначно имеется в виду конкретный день: "записаться к стоматологу через месяц", "поздравить Васю с ДР через год"

Мне с трудом представляется, что, если я сегодня 17-го октября скажу «Записаться к стоматологу через месяц», то я буду иметь ввиду «17-е ноября ровно». Скорее всего я буду иметь ввиду некоторый промежуток примерно через месяц :)

И «Поздравить друга через год» сказанное ровно в день рождения друга — так бывает? Но в любом случае, буду анализировать статистику использования и смотреть, как реально люди говорят. Может, я не прав.
Можете посоветовать библиотеку трансляции русской речи в текст?
Есть желание встроить в проект простое голосовое управление на русском.
Может знакомы?
А не пробовали подобное распознавание настроить в Dialogflow? Тогда можно переиспользовать на разных языках программирования без необходимости портирования

Никогда в жизни не работал с Dialogflow, когда-нибудь руки дойдут и до него )

Только полноправные пользователи могут оставлять комментарии. , пожалуйста.