Duckling — это библиотека Haskell, которая анализирует текст в структурированные данные.
" the first Tuesday of October "
= > { " value " : " 2017-10-03T00:00:00.000-07:00 " , " grain " : " day " }
Требуется среда Haskell. Мы рекомендуем использовать стек.
В Linux и MacOS вам необходимо установить заголовки разработки PCRE. В Linux для их установки используйте менеджер пакетов. В MacOS их проще всего установить с помощью Homebrew:
brew install pcre
Если это не помогает, попробуйте запустить brew doctor
и устранить обнаруженные проблемы.
Чтобы скомпилировать и запустить двоичный файл:
stack build
stack exec duckling-example-exe
При первом запуске он загрузит все необходимые пакеты.
Это запускает базовый HTTP-сервер. Пример запроса:
curl -XPOST http://0.0.0.0:8000/parse --data ' locale=en_GB&text=tomorrow at eight '
В примере приложения все измерения включены по умолчанию. Укажите параметр dims
, чтобы указать, какие из них вам нужны. Примеры:
Identify credit card numbers only:
$ curl -XPOST http://0.0.0.0:8000/parse --data ' locale=en_US&text="4111-1111-1111-1111"&dims="["credit-card-number"]" '
If you want multiple dimensions, comma-separate them in the array:
$ curl -XPOST http://0.0.0.0:8000/parse --data ' locale=en_US&text="3 cups of sugar"&dims="["quantity","numeral"]" '
См. exe/ExampleMain.hs
для примера интеграции Duckling в ваш проект. Если ваш сервер не поддерживает Haskell или вы не хотите запускать собственный сервер Duckling, вы можете напрямую использовать встроенные объекты wit.ai.
Утенок поддерживает множество языков, но большинство из них пока не поддерживают все измерения ( нам нужна ваша помощь! ). Пожалуйста, загляните в этот каталог для получения поддержки для конкретного языка.
Измерение | Пример ввода | Пример вывода значения |
---|---|---|
AmountOfMoney | "42€" | {"value":42,"type":"value","unit":"EUR"} |
CreditCardNumber | "4111-1111-1111-1111" | {"value":"4111111111111111","issuer":"visa"} |
Distance | «6 миль» | {"value":6,"type":"value","unit":"mile"} |
Duration | «3 минуты» | {"value":3,"minute":3,"unit":"minute","normalized":{"value":180,"unit":"second"}} |
Email | "утёнок[email protected]" | {"value":"[email protected]"} |
Numeral | "восемьдесят восемь" | {"value":88,"type":"value"} |
Ordinal | "33-й" | {"value":33,"type":"value"} |
PhoneNumber | "+1 (650) 123-4567" | {"value":"(+1) 6501234567"} |
Quantity | «3 стакана сахара» | {"value":3,"type":"value","product":"sugar","unit":"cup"} |
Temperature | "80F" | {"value":80,"type":"value","unit":"fahrenheit"} |
Time | «сегодня в 9 утра» | {"values":[{"value":"2016-12-14T09:00:00.000-08:00","grain":"hour","type":"value"}],"value":"2016-12-14T09:00:00.000-08:00","grain":"hour","type":"value"} |
Url | "https://api.wit.ai/message?q=hi" | {"value":"https://api.wit.ai/message?q=hi","domain":"api.wit.ai"} |
Volume | «4 галлона» | {"value":4,"type":"value","unit":"gallon"} |
Также поддерживаются пользовательские размеры.
Чтобы восстановить классификаторы и запустить набор тестов:
stack build :duckling-regen-exe && stack exec duckling-regen-exe && stack test
Важно повторно сгенерировать классификаторы после обновления кода и перед запуском набора тестов.
Чтобы расширить поддержку Duckling измерения на данном языке, обычно необходимо обновить 4 файла:
Duckling/
Duckling/
Duckling/Dimensions/
(если еще не присутствует в Duckling/Dimensions/Common.hs
)
Duckling/Rules/
Чтобы добавить новый язык:
Numeral
.Чтобы добавить новую локаль:
Правила имеют имя, образец и продукцию. Шаблоны используются для сопоставления на уровне символов (регулярные выражения на входе) и сопоставления на уровне понятий (предикаты для токенов). Продукция — это произвольные функции, которые принимают список токенов и возвращают новый токен.
Корпус (соответственно отрицательный корпус) — это список примеров, которые следует (соответственно не следует) анализировать. Ориентировочное время для корпуса — вторник, 12 февраля 2013 г., 4:30 утра.
Duckling.Debug
предоставляет несколько инструментов отладки:
$ stack repl --no-load > :l Duckling.Debug > debug (makeLocale EN $ Just US) " in two minutes " [Seal Time] in | within | after < duration > (in two minutes) -- regex (in) -- < integer > < unit-of-duration > (two minutes) -- -- integer (0..19) (two) -- -- -- regex (two) -- -- minute (grain) (minutes) -- -- -- regex (minutes) [Entity {dim = " time " , body = " in two minutes " , value = RVal Time (TimeValue (SimpleValue (InstantValue {vValue = 2013-02-12 04:32:00 -0200, vGrain = Second})) [SimpleValue (InstantValue {vValue = 2013-02-12 04:32:00 -0200, vGrain = Second})] Nothing), start = 0, end = 14}]
Утенок имеет лицензию BSD.