Комментарии 35
Почему-то распозналось по-разному.
через 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 дней" люди тоже говорят. Благо, модифицировать распознаватель под это очень просто )
послезавтра вечером в 8 иду в кино
Это и человеку-то не понять. В 8 выйдет в сторону кинотеатра или в 8 начало? Без контекста или известных умолчаний не понять.
А чем именованные сущности Яндекса не подошли? Там вроде всё нужное делается "из коробки".
https://yandex.ru/dev/dialogs/alice/doc/nlu-docpage/#nlu__datetime
Они чуть меньше понимают, чем я бы хотел.
А можно пару примеров, чего они не понимают?
"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"
}
![](https://habrastorage.org/webt/pw/i1/wo/pwi1wovg0_m9coxptnytre1xoay.png)
через полчаса (полгода и т.п.)
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 дней относительно сегодня, а имел бы ввиду некоторый промежуток примерно через месяц.
Вопрос "какие встречи через месяц" некорректнен и может быть не понят даже человеком, вместо этого надо спрашивать "какие у меня встречи в течении недели через месяц". Но зато в других вариантах однозначно имеется в виду конкретный день: "записаться к стоматологу через месяц", "поздравить Васю с ДР через год"
И «Поздравить друга через год» сказанное ровно в день рождения друга — так бывает? Но в любом случае, буду анализировать статистику использования и смотреть, как реально люди говорят. Может, я не прав.
Есть желание встроить в проект простое голосовое управление на русском.
Может знакомы?
Еще было бы здорово добавить место проведения, если планируется встреча, или как-нибудь отлавливать посторонние вопросы.
![image](https://habrastorage.org/getpro/habr/comment_images/de1/ffa/4a4/de1ffa4a4d58b456d7cf32826825b860.jpg)
Распознаём дату и время в естественной речи