Передача параметра в функцию Duckling Clojure из приложения Java

Я работаю с Утенком wit.ai (https://duckling.wit.ai/), однако Я полагаюсь на Duckling и вызываю его из своего Java-приложения. У меня нет опыта работы с Clojure...

Я могу запустить метод синтаксического анализа Duckling, однако я не могу понять, как передать дату/время, которые будут использоваться в качестве контекста для разрешения времени и даты.

Вот функция:

(defn parse
  "Public API. Parses text using given module. If dims are provided as a list of
  keywords referencing token dimensions, only these dimensions are extracted.
  Context is a map with a :reference-time key. If not provided, the system
  current date and time is used."
  ([module text]
   (parse module text []))
  ([module text dims]
   (parse module text dims (default-context :now)))
  ([module text dims context]
   (->> (analyze text context module (map (fn [dim] {:dim dim :label dim}) dims) nil)
        :winners
        (map #(assoc % :value (engine/export-value % {})))
        (map #(select-keys % [:dim :body :value :start :end :latent])))))

В тестовом корпусе дата контекста находится вверху файла. Это передается в функцию синтаксического анализа при тестировании корпуса.

{:reference-time (time/t -2 2013 2 12 4 30 0)
   :min (time/t -2 1900)
   :max (time/t -2 2100)}

Вот мой код Java:

public void extract(String input) {
    IFn require = Clojure.var("clojure.core", "require");
    require.invoke(Clojure.read("duckling.core"));
    Clojure.var("duckling.core", "load!").invoke();
    LazySeq o = (LazySeq) Clojure.var("duckling.core", "parse").invoke("en$core", input, dims);
}

Мой вопрос: как мне вставить конкретную дату/время в качестве параметра функции разбора?

РЕДАКТИРОВАТЬ 1 Если посмотреть на это еще раз, похоже, что это объект даты и времени. Duckling зависит от clj-time 0.8.0, однако я не могу понять, как создать тот же объект в Java, вызвав clj-time.


person Brooks    schedule 22.02.2017    source источник


Ответы (1)


У Duckling есть собственная вспомогательная функция datetime ('t') в пространстве имен duckling.time.obj, которая управляет тем, КАК я получаю тот же объект datetime, который он ожидает.

private final Keyword REFERENCE_TIME = Keyword.intern("reference-time");
private final Keyword MIN = Keyword.intern("min");
private final Keyword MAX = Keyword.intern("max");

public void extract(String input) {

    PersistentArrayMap datemap = (PersistentArrayMap) Clojure.var("duckling.time.obj", "t").invoke(-5, 2017, 2, 21, 23, 30, 0);
    PersistentArrayMap minMap = (PersistentArrayMap) Clojure.var("duckling.time.obj", "t").invoke(-5, 1900);
    PersistentArrayMap maxMap = (PersistentArrayMap) Clojure.var("duckling.time.obj", "t").invoke(-5, 2100);
    Object[] contextArr = new Object[6];
    contextArr[0] = REFERENCE_TIME;
    contextArr[1] = datemap;
    contextArr[2] = MIN;
    contextArr[3] = minMap;
    contextArr[4] = MAX;
    contextArr[5] = maxMap;
    PersistentArrayMap cljContextMap = PersistentArrayMap.createAsIfByAssoc(contextArr);

    LazySeq results = (LazySeq) Clojure.var("duckling.core", "parse").invoke("en$core", input, dims, cljContextMap);
}

Осталось только создать карту дат с динамическими значениями вместо жестко заданных.

person Brooks    schedule 22.02.2017