2017-02-22 24 views
1

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

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

Вот функция:

(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); 
} 

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

EDIT 1 Глядя на него еще, похоже, что это объект datetime. Утенок зависит от clj-time 0.8.0, однако я не могу понять, как создать тот же самый объект на Java, вызывая clj-time.

ответ

1

Утенок имеет свою собственную вспомогательную функцию 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); 
} 

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