Hors — это Библиотека .NET Core для распознавания даты и времени в естественной речи на русском языке. Умеет понимать сложные конструкции с абсолютными и относительными датой и временем. В том числе временные периоды. Хорс — это славянский бог солнца.
Библиотека Hors лежит в основе работы голосового навыка Мой Секретарь в Яндекс.Алисе.
Через NuGet
Install-Package Hors -Version 0.10.0
(Текущая дата в примерах: 14.07.2019 3:40)
> 26 марта в 11 вечера будет красивый закат.
>
> {0} будет красивый закат.
> [Type=Fixed, DateFrom=26.03.2019 23:00:00, StartIndex=0, EndIndex=20]
> Будет ли в сентябре 25 и 26 числа поход?
>
> Будет ли {0} {1} поход?
> [Type=Fixed, DateFrom=25.09.2019 0:00:00, DateTo=25.09.2019 23:59:59, StartIndex=9, EndIndex=33]
> [Type=Fixed, DateFrom=26.09.2019 0:00:00, DateTo=26.09.2019 23:59:59, StartIndex=9, EndIndex=33]
> Я был в гостях неделю 2 дня и час назад.
>
> Я был в гостях {0}.
> [Type=SpanBackward, DateFrom=05.07.2019 3:40:00, Span=-9.01:00:00, StartIndex=15, EndIndex=39]
> В следующий четверг с 9 утра до 6 вечера важный экзамен!
>
> {0} важный экзамен!
> [Type=Period, DateFrom=18.07.2019 9:00:00, DateTo=18.07.2019 18:00:00, StartIndex=0, EndIndex=40]
> Я был на даче в прошлые выходные
>
> Я был на даче {0}
> [Type=Period, DateFrom=06.07.2019 0:00:00, DateTo=07.07.2019 23:59:59, StartIndex=14, EndIndex=32]
> Позавчера в 6:30 состоялось совещание, а завтра днём будет хорошая погода.
>
> {0} состоялось совещание, а {1} будет хорошая погода.
> [Type=Fixed, DateFrom=12.07.2019 6:30:00, StartIndex=0, EndIndex=16]
> [Type=Fixed, DateFrom=15.07.2019 12:00:00, StartIndex=41, EndIndex=52]
- На вход можно подать строку или
IEnumerable<string>
, если строка уже разбита на токены. - Все числа должны быть числами, а не прописью.
- Вторым аргументом подаётся дата пользователя, относительно которой нужно измерять промежутки (например если пользователь скажет "день назад"). В большинстве ситуаций логично подавать просто текущую дату, но могут быть исключения.
- Третьим аргументом передаётся
int collapseDistance
— максимальное количество слов между двумя датами, при котором Hors будет пытаться объединить эта даты в одну, если возможно. Например: завтра встреча с другом в 12 превратится в {завтра в 12} встреча с другом. По-умолчанию3
.
using Hors;
var hors = new HorsTextParser();
var result = hors.Parse("26 марта в 11 вечера будет красивый закат", DateTime.Now);
var text = result.Text; // -> string: "будет красивый закат"
var formatText = result.TextWithTokens; // -> string: "{0} будет красивый закат"
var date = result.Dates[0].DateFrom; // -> DateTime: 26.03.2019 23:00:00
Метод Parse
возвращает объект HorsParseResult
Поле | Тип | Описание |
---|---|---|
SourceText |
string | Исходная строка без изменений |
Text |
string | Исходная строка с полной пунктуацией, из которой убраны все токены, отвечающие за распознанные дату-время |
Tokens |
List<string> | Текст, разбитый на токены с убранными знаками препинания. Вместо дат и времени будут токены {x} , где x — номер индекса токена в массиве Dates |
Dates |
List<DateTimeToken> | Список распознанных дат и времён, см. ниже |
TextWithTokens |
string | Исходная строка, где вместо всех распознанных участков даты и времени вставлен токен {x} , в котором x — номер индекса токена в массиве Dates |
CleanTextWithTokens |
string | TextWithTokens после токенизации с убранными знаками препинания |
Поле | Тип | Описание |
---|---|---|
Type |
Enum | Fixed — фиксированная дата, обозначает какой-то конкретный день или момент внутри дня; Period — промежуток; SpanForward — обозначение периода времени со сдвигом вперед, например "через 1 час"; SpanBackward — период времени со сдвигом в прошлое, например "5 часов назад" |
DateFrom |
DateTime | Дата начала периода. Для фиксированного момента дата этого момента. |
DateTo |
DateTime | Дата конца периода. Если фиксированный момент — целый день, то DateFrom и DateTo будут, соответственно, началом и концом дня. Если зафиксирован конкретный час, то они будут равны. |
Span |
TimeSpan | Величина периода смещения для Type = SpanForward и Type = SpanBackward . При этом в DateFrom лежит дата с этим смещением относительно даты пользователя. |
HasTime |
bool | Показывает, было ли для этого токена установлено время в процессе ввода дат, или только день |
StartIndex |
int | Индекс начала подстроки с данной датой в исходной строке, с нуля |
EndIndex |
int | Индекс конца подстроки с данной датой в исходной строке, не включительно |