This is an automated email from the ASF dual-hosted git repository.
aradzinski pushed a commit to branch web-site
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft-website.git
The following commit(s) were added to refs/heads/web-site by this push:
new a5f2b1b Update.
a5f2b1b is described below
commit a5f2b1b350f1c5c8e1e829b48e59592cc88676f5
Author: Aaron Radzinski <[email protected]>
AuthorDate: Fri Sep 3 21:52:30 2021 -0700
Update.
---
.gitignore | 11 -
assets/css/style.css | 2 +-
assets/css/style.css.map | 6 +-
blogs/nlpcraft-idl-intent-definition-language.html | 23 +-
blogs/quick_intro_apache_nlpcraft.html | 2 +-
blogs/short_term_memory.html | 2 +-
data-model.html | 272 ++++++++++------
examples/alarm_clock.html | 2 +-
examples/light_switch.html | 2 +-
feed.xml | 2 +-
first-example.html | 2 +-
intent-matching.html | 354 +++++++++++----------
short-term-memory.html | 2 +-
13 files changed, 388 insertions(+), 294 deletions(-)
diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 97239ea..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,11 +0,0 @@
-.jekyll-metadata
-**/*.iml
-*.iml
-.idea/
-_site/
-.sass-cache/
-.jekyll-cache/
-target
-out
-Gemfile.lock
-
diff --git a/assets/css/style.css b/assets/css/style.css
index 11069ff..982966a 100644
--- a/assets/css/style.css
+++ b/assets/css/style.css
@@ -1,3 +1,3 @@
-@font-face{font-family:'CanaroBlack';src:url("../../fonts/rene_bieder_-_canaro_black-webfont.eot");src:url("../../fonts/rene_bieder_-_canaro_black-webfont.eot?#iefix")
format("embedded-opentype"),url("../../fonts/rene_bieder_-_canaro_black-webfont.woff")
format("woff"),url("../../fonts/rene_bieder_-_canaro_black-webfont.ttf")
format("truetype"),url("../../fonts/rene_bieder_-_canaro_black-webfont.svg#canaroblack")
format("svg");font-weight:normal;font-style:normal}@font-face{font-family:'
[...]
+@font-face{font-family:'CanaroBlack';src:url("../../fonts/rene_bieder_-_canaro_black-webfont.eot");src:url("../../fonts/rene_bieder_-_canaro_black-webfont.eot?#iefix")
format("embedded-opentype"),url("../../fonts/rene_bieder_-_canaro_black-webfont.woff")
format("woff"),url("../../fonts/rene_bieder_-_canaro_black-webfont.ttf")
format("truetype"),url("../../fonts/rene_bieder_-_canaro_black-webfont.svg#canaroblack")
format("svg");font-weight:normal;font-style:normal}@font-face{font-family:'
[...]
/*# sourceMappingURL=style.css.map */
\ No newline at end of file
diff --git a/assets/css/style.css.map b/assets/css/style.css.map
index 7b63d77..5179cd1 100644
--- a/assets/css/style.css.map
+++ b/assets/css/style.css.map
@@ -30,7 +30,7 @@
"/*\n * Licensed to the Apache Software Foundation (ASF) under
one or more\n * contributor license agreements. See the NOTICE file
distributed with\n * this work for additional information regarding copyright
ownership.\n * The ASF licenses this file to You under the Apache License,
Version 2.0\n * (the \"License\"); you may not use this file except in
compliance with\n * the License. You may obtain a copy of the License at\n *\n
* http://www.apache.org/licenses/LICENSE-2.0\n *\ [...]
"/*\r\n * Licensed to the Apache Software Foundation (ASF)
under one or more\r\n * contributor license agreements. See the NOTICE file
distributed with\r\n * this work for additional information regarding copyright
ownership.\r\n * The ASF licenses this file to You under the Apache License,
Version 2.0\r\n * (the \"License\"); you may not use this file except in
compliance with\r\n * the License. You may obtain a copy of the License at\r\n
*\r\n * http://www.apache.org/licenses/ [...]
"/*\r\n * Licensed to the Apache Software Foundation (ASF)
under one or more\r\n * contributor license agreements. See the NOTICE file
distributed with\r\n * this work for additional information regarding copyright
ownership.\r\n * The ASF licenses this file to You under the Apache License,
Version 2.0\r\n * (the \"License\"); you may not use this file except in
compliance with\r\n * the License. You may obtain a copy of the License at\r\n
*\r\n * http://www.apache.org/licenses/ [...]
- "/*\r\n * Licensed to the Apache Software Foundation (ASF)
under one or more\r\n * contributor license agreements. See the NOTICE file
distributed with\r\n * this work for additional information regarding copyright
ownership.\r\n * The ASF licenses this file to You under the Apache License,
Version 2.0\r\n * (the \"License\"); you may not use this file except in
compliance with\r\n * the License. You may obtain a copy of the License at\r\n
*\r\n * http://www.apache.org/licenses/ [...]
+ "/*\r\n * Licensed to the Apache Software Foundation (ASF)
under one or more\r\n * contributor license agreements. See the NOTICE file
distributed with\r\n * this work for additional information regarding copyright
ownership.\r\n * The ASF licenses this file to You under the Apache License,
Version 2.0\r\n * (the \"License\"); you may not use this file except in
compliance with\r\n * the License. You may obtain a copy of the License at\r\n
*\r\n * http://www.apache.org/licenses/ [...]
"/*\r\n * Licensed to the Apache Software Foundation (ASF)
under one or more\r\n * contributor license agreements. See the NOTICE file
distributed with\r\n * this work for additional information regarding copyright
ownership.\r\n * The ASF licenses this file to You under the Apache License,
Version 2.0\r\n * (the \"License\"); you may not use this file except in
compliance with\r\n * the License. You may obtain a copy of the License at\r\n
*\r\n * http://www.apache.org/licenses/ [...]
"/*\r\n * Licensed to the Apache Software Foundation (ASF)
under one or more\r\n * contributor license agreements. See the NOTICE file
distributed with\r\n * this work for additional information regarding copyright
ownership.\r\n * The ASF licenses this file to You under the Apache License,
Version 2.0\r\n * (the \"License\"); you may not use this file except in
compliance with\r\n * the License. You may obtain a copy of the License at\r\n
*\r\n * http://www.apache.org/licenses/ [...]
"/*\r\n * Licensed to the Apache Software Foundation (ASF)
under one or more\r\n * contributor license agreements. See the NOTICE file
distributed with\r\n * this work for additional information regarding copyright
ownership.\r\n * The ASF licenses this file to You under the Apache License,
Version 2.0\r\n * (the \"License\"); you may not use this file except in
compliance with\r\n * the License. You may obtain a copy of the License at\r\n
*\r\n * http://www.apache.org/licenses/ [...]
@@ -39,7 +39,7 @@
"/*\r\n * Licensed to the Apache Software Foundation (ASF)
under one or more\r\n * contributor license agreements. See the NOTICE file
distributed with\r\n * this work for additional information regarding copyright
ownership.\r\n * The ASF licenses this file to You under the Apache License,
Version 2.0\r\n * (the \"License\"); you may not use this file except in
compliance with\r\n * the License. You may obtain a copy of the License at\r\n
*\r\n * http://www.apache.org/licenses/ [...]
"/*\r\n * Licensed to the Apache Software Foundation (ASF)
under one or more\r\n * contributor license agreements. See the NOTICE file
distributed with\r\n * this work for additional information regarding copyright
ownership.\r\n * The ASF licenses this file to You under the Apache License,
Version 2.0\r\n * (the \"License\"); you may not use this file except in
compliance with\r\n * the License. You may obtain a copy of the License at\r\n
*\r\n * http://www.apache.org/licenses/ [...]
"/*\r\n * Licensed to the Apache Software Foundation (ASF)
under one or more\r\n * contributor license agreements. See the NOTICE file
distributed with\r\n * this work for additional information regarding copyright
ownership.\r\n * The ASF licenses this file to You under the Apache License,
Version 2.0\r\n * (the \"License\"); you may not use this file except in
compliance with\r\n * the License. You may obtain a copy of the License at\r\n
*\r\n * http://www.apache.org/licenses/ [...]
- "/*\r\n * Licensed to the Apache Software Foundation (ASF)
under one or more\r\n * contributor license agreements. See the NOTICE file
distributed with\r\n * this work for additional information regarding copyright
ownership.\r\n * The ASF licenses this file to You under the Apache License,
Version 2.0\r\n * (the \"License\"); you may not use this file except in
compliance with\r\n * the License. You may obtain a copy of the License at\r\n
*\r\n * http://www.apache.org/licenses/ [...]
+ "/*\r\n * Licensed to the Apache Software Foundation (ASF)
under one or more\r\n * contributor license agreements. See the NOTICE file
distributed with\r\n * this work for additional information regarding copyright
ownership.\r\n * The ASF licenses this file to You under the Apache License,
Version 2.0\r\n * (the \"License\"); you may not use this file except in
compliance with\r\n * the License. You may obtain a copy of the License at\r\n
*\r\n * http://www.apache.org/licenses/ [...]
"/*\r\n * Licensed to the Apache Software Foundation (ASF)
under one or more\r\n * contributor license agreements. See the NOTICE file
distributed with\r\n * this work for additional information regarding copyright
ownership.\r\n * The ASF licenses this file to You under the Apache License,
Version 2.0\r\n * (the \"License\"); you may not use this file except in
compliance with\r\n * the License. You may obtain a copy of the License at\r\n
*\r\n * http://www.apache.org/licenses/ [...]
"/*\r\n * Licensed to the Apache Software Foundation (ASF)
under one or more\r\n * contributor license agreements. See the NOTICE file
distributed with\r\n * this work for additional information regarding copyright
ownership.\r\n * The ASF licenses this file to You under the Apache License,
Version 2.0\r\n * (the \"License\"); you may not use this file except in
compliance with\r\n * the License. You may obtain a copy of the License at\r\n
*\r\n * http://www.apache.org/licenses/ [...]
"/*\r\n * Licensed to the Apache Software Foundation (ASF)
under one or more\r\n * contributor license agreements. See the NOTICE file
distributed with\r\n * this work for additional information regarding copyright
ownership.\r\n * The ASF licenses this file to You under the Apache License,
Version 2.0\r\n * (the \"License\"); you may not use this file except in
compliance with\r\n * the License. You may obtain a copy of the License at\r\n
*\r\n * http://www.apache.org/licenses/ [...]
@@ -52,5 +52,5 @@
"/*\r\n * Licensed to the Apache Software Foundation (ASF)
under one or more\r\n * contributor license agreements. See the NOTICE file
distributed with\r\n * this work for additional information regarding copyright
ownership.\r\n * The ASF licenses this file to You under the Apache License,
Version 2.0\r\n * (the \"License\"); you may not use this file except in
compliance with\r\n * the License. You may obtain a copy of the License at\r\n
*\r\n * http://www.apache.org/licenses/ [...]
],
"names": [],
- "mappings":
"ACiBA,UAAU,CACN,WAAW,CAAE,aAAa,CAC1B,GAAG,CAAE,yDAAyD,CAC9D,GAAG,CAAE,gEAAgE,CAAC,2BAA2B,CAC7F,0DAA0D,CAAC,cAAc,CACzE,yDAAyD,CAAC,kBAAkB,CAC5E,qEAAqE,CAAC,aAAa,CACvF,WAAW,CAAE,MAAM,CACnB,UAAU,CAAE,MAAM,CAGtB,UAAU,CACN,WAAW,CAAE,YAAY,CACzB,GAAG,CAAE,wDAAwD,CAC7D,GAAG,CAAE,+DAA+D,CAAC,2BAA2B,CAC5F,yDAAyD,CAAC,cAAc,CACxE,wDAAwD,CAAC,kBAAkB,CAC3E,wEAAwE,CAAC,aAAa,CAC1F,WAAW,CAAE,MAAM,CACnB,UAAU,CAAE,MAAM,CAGtB,UAAU,CACN,WAAW,CAAE,YAAY,CACzB,GAAG,CAAE,wDAAwD,CAC7D,GAAG,CAAE,+DAA
[...]
+ "mappings":
"ACiBA,UAAU,CACN,WAAW,CAAE,aAAa,CAC1B,GAAG,CAAE,yDAAyD,CAC9D,GAAG,CAAE,gEAAgE,CAAC,2BAA2B,CAC7F,0DAA0D,CAAC,cAAc,CACzE,yDAAyD,CAAC,kBAAkB,CAC5E,qEAAqE,CAAC,aAAa,CACvF,WAAW,CAAE,MAAM,CACnB,UAAU,CAAE,MAAM,CAGtB,UAAU,CACN,WAAW,CAAE,YAAY,CACzB,GAAG,CAAE,wDAAwD,CAC7D,GAAG,CAAE,+DAA+D,CAAC,2BAA2B,CAC5F,yDAAyD,CAAC,cAAc,CACxE,wDAAwD,CAAC,kBAAkB,CAC3E,wEAAwE,CAAC,aAAa,CAC1F,WAAW,CAAE,MAAM,CACnB,UAAU,CAAE,MAAM,CAGtB,UAAU,CACN,WAAW,CAAE,YAAY,CACzB,GAAG,CAAE,wDAAwD,CAC7D,GAAG,CAAE,+DAA
[...]
}
\ No newline at end of file
diff --git a/blogs/nlpcraft-idl-intent-definition-language.html
b/blogs/nlpcraft-idl-intent-definition-language.html
index 616e453..aab7a16 100644
--- a/blogs/nlpcraft-idl-intent-definition-language.html
+++ b/blogs/nlpcraft-idl-intent-definition-language.html
@@ -19,18 +19,17 @@
intent=xa
flow="^(?:login)(^:logout)*$"
meta={'enabled': true}
- term(a)={!(tok_id()) != "z"}[1,3]
+ term(a)={# != "z"}[1,3]
term(b)={
meta_intent('enabled') == true && // Must be active.
- month() == 1 // January.
+ month == 1 // January.
}
term(c)~{
// Variables.
- @tokId = tok_id()
@usrTypes = meta_model('user_types')
// Predicate.
- (tokId == 'order' || tokId == 'order_cancel') &&
+ (# == 'order' || # == 'order_cancel') &&
has_all(@usrTypes, list(1, 2, 3) &&
abs(meta_tok('order:size')) > 10)
</pre><p><b>NOTES:</b></p><ul class="fixed"><li> The intent name is
<code>xa</code>.<li> The intent contains three terms. Term is an element that
defines a predicate, each of which must pass for the intent to be selected:<ul
class="fixed"><li> <code>term(a)</code> - the parsed request must contain
between one and three tokens with identifiers other than <code>z</code>,
without taking into account data from the dialogue history (term type
<code>=</code>).<li> <code>term(b)</code> - th [...]
@@ -55,7 +54,7 @@
intent=xa
flow="^(?:login)(^:logout)*$"
meta={'enabled': true}
- term(a)={!(tok_id()) != "z"}[1,3]
+ term(a)={# != "z"}[1,3]
</pre><p> Every intent statement consists of the following
elements:</p><ul class="fixed"><li><p><b>Intent Name</b></p><p> Required
element. The name is a unique identifier within the model. Below is an example
of using a reference to the <code>xa</code> intent.</p><pre class="brush: java">
@NCIntentRef("xa")
fun onTimeMatch(
@@ -63,18 +62,18 @@
@NCIntentTerm("a") tok: NCToken
): NCResult { ... }
</pre><li><p><b>Intent Terms</b></p><p> At least one term is
required. Term is the main element of the intent definition. Term consists of
the predicate over a token (term body). The constituent parts of the predicate
can be based on the token or on some other factors.</p><p> Here's how an
intent's term is defined:</p><ul class="fixed"><li>The <code>term</code>
keyword. Required element.<li> Name in parentheses. Optional. Used to create
references to the found token in the ca [...]
- term(nums)~{tok_id() == 'nlpcraft:num'} //
Conversational '~' term.
- term(nums)={tok_id() != 'z'} // Non-conversational '='
term.
+ term(nums)~{# == 'nlpcraft:num'} // Conversational '~'
term.
+ term(nums)={# != 'z'} // Non-conversational '=' term.
</pre><li><p> The term body. Required element. There are
two ways to define the term body: using IDL script with built-in functions or
in external Java-based code:</p><pre class="brush: idl">
- term(nums)={tok_id() == 'nlpcraft:num'} // IDL script.
+ term(nums)={# == 'nlpcraft:num'} // IDL script.
term(yes)~{true} // IDL script.
term~/org.mypackage.MyClass#termMethod/? // Reference
to external code.
</pre><p> Note the special syntax for the last term. The
existing set of built-in functions are typically enough to define many terms of
the intent. But, if necessary, the programmer can create her own predicates in
Java, Scala, Kotlin, Groovy or any other Java based language and write them in
the term body. That is, NLPCraft IDL can have snippets of code written entirely
in other languages:</p><pre class="brush: idl">
term~/org.mypackage.MyClass#termMethod/? // Reference
to external code.
</pre><p> This function <code>termMethod</code> receives
an argument that contains all the necessary data on the user's request, and as
the output it should return the value of a specific type.</p><li><p>
Quantifier. Optional. The default value is <code>[1, 1]</code>. The following
types of quantifiers are supported:</p><ul class="fixed"><li><code>[M,
N]</code> - the term must be found from <code>N</code> to <code>M</code>
times.<li><code>*</code> - the term must be f [...]
- term(nums)={tok_id() == 'nlpcraft:num'}[1,2] // The
request must contain one or two tokens with the ID “nlpcraft: num”.
- term(nums)={tok_id() == 'nlpcraft:num'}* // The
request must contain zero or more tokens with the ID “nlpcraft: num”.
- </pre></ul><li><p><b>IDL Built-In Functions</b></p><p>
NLPCraft IDL provides over 140 <a
href="/intent-matching.html#idl_functions">built-in functions</a> that can be
used in term definition. These functions can be conventionally classified into
the following categories:</p><ul class="fixed"><li>Based on base tokens
properties - token IDs, groups, parent, hierarchy, etc. Examples:
<code>tok_id()</code>, <code>tok_groups()</code>,
<code>tok_parent()</code>.<li>NLP-base [...]
+ term(nums)={# == 'nlpcraft:num'}[1,2] // The request
must contain one or two tokens with the ID “nlpcraft: num”.
+ term(nums)={# == 'nlpcraft:num'}* // The request must
contain zero or more tokens with the ID “nlpcraft: num”.
+ </pre></ul><li><p><b>IDL Built-In Functions</b></p><p>
NLPCraft IDL provides over 140 <a
href="/intent-matching.html#idl_functions">built-in functions</a> that can be
used in term definition. These functions can be conventionally classified into
the following categories:</p><ul class="fixed"><li>Based on base tokens
properties - token IDs, groups, parent, hierarchy, etc. Examples:
<code>tok_id</code>, <code>tok_groups</code>,
<code>tok_parent</code>.<li>NLP-based toke [...]
term(t2)={
@a = meta_model('a')
@list = list(1, 2, 3, 4)
@@ -86,7 +85,7 @@
</pre><p> This rule means that for the intent to be matched, it is
necessary that within the current session the intent with the
<code>login</code> identifier has already been matched before, and not with
identifier <code>logout</code>.</p><p> If it is necessary to define more
complex logic, it can also be moved into user code written in any Java-based
language, like the term body:</p><pre class="brush: scala">
@NCIntent("intent=x
flow=/com.company.dialog.Flow#customFlow/
- term~{tok_id() == 'some_id'}"
+ term~{# == 'some_id'}"
)
def onX(): NCResult = { .. }
</pre><p> The predicate defined in the method
<code>customFlow()</code> receives at the input a list with all intents
information, previously matched within the current session, and returns a
boolean value.</p><li><p><b>Intent Metadata</b></p><p> Optional element. A
additional dataset that can be used by term predicates presented in JSON
format.</p></ul></section><section><h2 class="section-title">Why Do We Need
NLPCraft IDL? <a href="#"><i class="top-link fas fa-fw fa-angle- [...]
diff --git a/blogs/quick_intro_apache_nlpcraft.html
b/blogs/quick_intro_apache_nlpcraft.html
index 19d63be..2e127c3 100644
--- a/blogs/quick_intro_apache_nlpcraft.html
+++ b/blogs/quick_intro_apache_nlpcraft.html
@@ -53,7 +53,7 @@
- "{<ACTION>|shut|kill|stop|eliminate} {off|out}
<LIGHT>"
- "no <LIGHT>"
intents:
- - "intent=ls term(act)={has(tok_groups(), 'act')}
term(loc)={tok_id() == 'ls:loc'}*"
+ - "intent=ls term(act)={has(tok_groups, 'act')} term(loc)={# ==
'ls:loc'}*"
</pre><p><b>NOTES:</b></p><ul><li> We define 3 model elements
(corresponding to the NEs we’ve come up with
earlier):<ul><li><code>"ls:loc"</code> to define the
location.<li><code>"ls:on"</code> to define ON action.<li><code>"ls:off"</code>
to define OFF action.</ul><li> We grouped <code>"ls:on"</code> and
<code>"ls:off"</code> into group <code>"act"</code> for easier use in the
intent.<li> Each model element is defined through synonyms using <a
href="/data-model.html#macros">Macro DS [...]
package org.apache.nlpcraft.examples.lightswitch
diff --git a/blogs/short_term_memory.html b/blogs/short_term_memory.html
index 6bb391c..3e482eb 100644
--- a/blogs/short_term_memory.html
+++ b/blogs/short_term_memory.html
@@ -15,4 +15,4 @@
limitations under the License.
-->
-<!doctype html><html lang="en"> <script async
src="https://www.googletagmanager.com/gtag/js?id=UA-180663034-1"></script>
<script> window.dataLayer = window.dataLayer || []; function
gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config',
'UA-180663034-1'); </script><meta charset="utf-8"><meta
http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport"
content="width=device-width, initial-scale=1, shrink-to-fit=no"><meta
name="description" content="An open sourc [...]
+<!doctype html><html lang="en"> <script async
src="https://www.googletagmanager.com/gtag/js?id=UA-180663034-1"></script>
<script> window.dataLayer = window.dataLayer || []; function
gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config',
'UA-180663034-1'); </script><meta charset="utf-8"><meta
http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport"
content="width=device-width, initial-scale=1, shrink-to-fit=no"><meta
name="description" content="An open sourc [...]
diff --git a/data-model.html b/data-model.html
index b2a9a2c..d0cf209 100644
--- a/data-model.html
+++ b/data-model.html
@@ -15,7 +15,7 @@
limitations under the License.
-->
-<!doctype html><html lang="en"> <script async
src="https://www.googletagmanager.com/gtag/js?id=UA-180663034-1"></script>
<script> window.dataLayer = window.dataLayer || []; function
gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config',
'UA-180663034-1'); </script><meta charset="utf-8"><meta
http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport"
content="width=device-width, initial-scale=1, shrink-to-fit=no"><meta
name="description" content="An open sourc [...]
+<!doctype html><html lang="en"> <script async
src="https://www.googletagmanager.com/gtag/js?id=UA-180663034-1"></script>
<script> window.dataLayer = window.dataLayer || []; function
gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config',
'UA-180663034-1'); </script><meta charset="utf-8"><meta
http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport"
content="width=device-width, initial-scale=1, shrink-to-fit=no"><meta
name="description" content="An open sourc [...]
package org.apache.nlpcraft.examples.lightswitch
import org.apache.nlpcraft.model.{NCIntentTerm, _}
@@ -54,15 +54,74 @@ class LightSwitchModel extends
NCModelFileAdapter("lightswitch_model.yaml") {
NCResult.text(s"Lights are [$status] in [${locations.toLowerCase}].")
}
}
- </pre></div><div class="tab-pane fade show" id="java-model-ex"
role="tabpanel"><pre class="brush: java">
+ </pre></div><div class="tab-pane fade show"
id="lightswitch_yaml_model" role="tabpanel"><pre class="brush: js">
+id: "nlpcraft.lightswitch.ex"
+name: "Light Switch Example Model"
+version: "1.0"
+description: "NLI-powered light switch example model."
+macros:
+ - name: "<ACTION>"
+ macro: "{turn|switch|dial|let|set|get|put}"
+ - name: "<KILL>"
+ macro: "{shut|kill|stop|eliminate}"
+ - name: "<ENTIRE_OPT>"
+ macro: "{entire|full|whole|total|_}"
+ - name: "<FLOOR_OPT>"
+ macro:
"{upstairs|downstairs|{1st|first|2nd|second|3rd|third|4th|fourth|5th|fifth|top|ground}
floor|_}"
+ - name: "<TYPE>"
+ macro: "{room|closet|attic|loft|{store|storage} {room|_}}"
+ - name: "<LIGHT>"
+ macro: "{all|_} {it|them|light|illumination|lamp|lamplight}"
+enabledBuiltInTokens: [] # This example doesn't use any built-in tokens.
+
+#
+# Allows for multi-word synonyms in this entire model
+# to be sparse and permutate them for better detection.
+# These two properties generally enable a free-form
+# natural language comprehension.
+#
+permutateSynonyms: true
+sparse: true
+
+elements:
+ - id: "ls:loc"
+ description: "Location of lights."
+ synonyms:
+ - "<ENTIRE_OPT> <FLOOR_OPT>
{kitchen|library|closet|garage|office|playroom|{dinning|laundry|play}
<TYPE>}"
+ - "<ENTIRE_OPT> <FLOOR_OPT>
{master|kid|children|child|guest|_} {bedroom|bathroom|washroom|storage}
{<TYPE>|_}"
+ - "<ENTIRE_OPT> {house|home|building|{1st|first}
floor|{2nd|second} floor}"
+
+ - id: "ls:on"
+ groups:
+ - "act"
+ description: "Light switch ON action."
+ synonyms:
+ - "<ACTION> {on|up|_} <LIGHT> {on|up|_}"
+ - "<LIGHT> {on|up}"
+
+ - id: "ls:off"
+ groups:
+ - "act"
+ description: "Light switch OFF action."
+ synonyms:
+ - "<ACTION> <LIGHT> {off|out|down}"
+ - "{<ACTION>|<KILL>} {off|out|down} <LIGHT>"
+ - "<KILL> <LIGHT>"
+ - "<LIGHT> <KILL>"
+ - "{out|no|off|down} <LIGHT>"
+ - "<LIGHT> {out|off|down}"
+
+intents:
+ - "intent=ls term(act)={has(tok_groups, 'act')} term(loc)={# == 'ls:loc'}*"
+ </pre></div></div></div><div class="tab-pane fade
show" id="alarm" role="tabpanel"><nav><div class="nav nav-tabs" role="tablist">
<a class="nav-item nav-link active" data-toggle="tab" href="#alarm_java_model"
role="tab"><code>AlarmModel.java</code></a> <a class="nav-item nav-link"
data-toggle="tab" href="#alarm_intents_idl"
role="tab"><code>intents.idl</code></a> <a class="nav-item nav-link"
data-toggle="tab" href="#alarm_json_model" role="tab"><code>alarm_model.j [...]
package org.apache.nlpcraft.examples.alarm;
import org.apache.nlpcraft.model.*;
+
import java.time.*;
-import java.time.format.*;
import java.util.*;
-import static java.time.temporal.ChronoUnit.*;
+import static java.time.temporal.ChronoUnit.MILLIS;
public class AlarmModel extends NCModelFileAdapter {
private static final DateTimeFormatter FMT =
@@ -71,28 +130,42 @@ public class AlarmModel extends NCModelFileAdapter {
private final Timer timer = new Timer();
public AlarmModel() {
- // Loading the model from the file in the classpath.
+ // Loading the model from the file.
super("alarm_model.json");
}
- @NCIntentRef("alarm")
- @NCIntentSample({
- "Ping me in 3 minutes",
- "Buzz me in an hour and 15mins",
- "Set my alarm for 30s"
- })
+ @NCIntentRef("alarm") // Intent is defined in JSON model file
(alarm_model.json and intents.idl).
+ @NCIntentSampleRef("alarm_samples.txt") // Samples supplied in an external
file.
NCResult onMatch(
NCIntentMatch ctx,
@NCIntentTerm("nums") List<NCToken> numToks
) {
- if (ctx.isAmbiguous())
- throw new NCRejection("Not exact match.");
+ long ms = calculateTime(numToks);
+
+ assert ms >= 0;
+
+ timer.schedule(
+ new TimerTask() {
+ @Override
+ public void run() {
+ System.out.println(
+ "BEEP BEEP BEEP for: " +
ctx.getContext().getRequest().getNormalizedText() + ""
+ );
+ }
+ },
+ ms
+ );
- long unitsCnt = numToks.stream().map(tok ->
(String)tok.meta("num:unit")).distinct().count();
+ return NCResult.text("Timer set for: " +
FMT.format(LocalDateTime.now().plus(ms, MILLIS)));
+ }
- if (unitsCnt != numToks.size())
- throw new NCRejection("Ambiguous time units.");
+ @Override
+ public void onDiscard() {
+ // Clean up when model gets discarded (e.g. during testing).
+ timer.cancel();
+ }
+ public static long calculateTime(List<NCToken> numToks) {
LocalDateTime now = LocalDateTime.now();
LocalDateTime dt = now;
@@ -115,37 +188,54 @@ public class AlarmModel extends NCModelFileAdapter {
case "year": { dt = dt.plusYears(v); break; }
default:
- // It shouldn't be assert, because 'datetime' unit can be
extended.
+ // It shouldn't be an assertion, because 'datetime' unit
can be extended outside.
throw new NCRejection("Unsupported time unit: " + unit);
}
}
- long ms = now.until(dt, MILLIS);
-
- assert ms >= 0;
-
- timer.schedule(
- new TimerTask() {
- @Override
- public void run() {
- System.out.println(
- "BEEP BEEP BEEP for: " +
ctx.getContext().getRequest().getNormalizedText() + ""
- );
- }
- },
- ms
- );
-
- return NCResult.text("Timer set for: " + FMT.format(dt));
+ return now.until(dt, MILLIS);
}
+}
+ </pre></div><div class="tab-pane fade show"
id="alarm_intents_idl" role="tabpanel"><pre class="brush: idl">
+// Fragments (mostly for demo purposes here).
+fragment=buzz term~{# == 'x:alarm'}
+fragment=when
+ term(nums)~{
+ // Demonstrating term variables.
+ @type = meta_tok('nlpcraft:num:unittype')
+ @iseq = meta_tok('nlpcraft:num:isequalcondition') // Excludes
conditional statements.
- @Override
- public void onDiscard() {
- // Clean up when model gets discarded (e.g. during testing).
- timer.cancel();
- }
+ # == 'nlpcraft:num' && @type == 'datetime' && @iseq == true
+ }[1,7]
+
+// Intents (using fragments).
+intent=alarm
+ fragment(buzz)
+ fragment(when)
+ </pre></div><div class="tab-pane fade show"
id="alarm_json_model" role="tabpanel"><pre class="brush: js">
+{
+ "id": "nlpcraft.alarm.ex",
+ "name": "Alarm Example Model",
+ "version": "1.0",
+ "description": "Alarm example model.",
+ "enabledBuiltInTokens": [
+ "nlpcraft:num"
+ ],
+ "elements": [
+ {
+ "id": "x:alarm",
+ "description": "Alarm token indicator.",
+ "synonyms": [
+ "{ping|buzz|wake|call|hit} {me|up|me up|_}",
+ "{set|_} {my|_} {wake|wake up|_}
{alarm|timer|clock|buzzer|call} {clock|_} {up|_}"
+ ]
+ }
+ ],
+ "intents": [
+ "import('intents.idl')" // Import intents from external file.
+ ]
}
- </pre></div></div><p> Further sub-sections will provide
details on model's static configuration and dynamic programmable logic
implementation.</p></section><section id="dataflow"><h2
class="section-title">Model Dataflow <a href="#"><i class="top-link fas fa-fw
fa-angle-double-up"></i></a></h2><figure> <img alt="data model dataflow"
class="img-fluid" src="/images/homepage-fig1.1.png"><figcaption><b>Fig 1.</b>
NLPCraft Architecture</figcaption></figure><p> Let's review the [...]
+ </pre></div></div></div></div><p> Further sub-sections
will provide details on model's static configuration and dynamic programmable
logic implementation.</p></section><section id="dataflow"><h2
class="section-title">Model Dataflow <a href="#"><i class="top-link fas fa-fw
fa-angle-double-up"></i></a></h2><figure> <img alt="data model dataflow"
class="img-fluid" src="/images/homepage-fig1.1.png"><figcaption><b>Fig 1.</b>
NLPCraft Architecture</figcaption></figure>< [...]
{
"id": "user.defined.id",
"name": "User Defined Name",
@@ -202,47 +292,7 @@ intents:
}
]
...
- </pre><p> While adding multi-word synonyms looks somewhat trivial - in
real models, the naive approach can lead to thousands and even tens of
thousands of possible synonyms due to words, grammar, and linguistic
permutations - which quickly becomes untenable if performed manually.</p><p>
NLPCraft provides an effective tool for a compact synonyms representation.
Instead of listing all possible multi-word synonyms one by one you can use
combination of following techniques:</p><ul><l [...]
- "macros": [
- {
- "name": "<A>",
- "macro": "aaa"
- },
- {
- "name": "<B>",
- "macro": "<A> bbb"
- },
- {
- "name": "<C>",
- "macro": "<A> bbb {z|w}"
- }
- ]
- </pre><span id="option-groups" class="section-sub-title">Option Groups
<a href="#"><i class="top-link fas fa-fw fa-angle-double-up"></i></a></span><p>
Option groups are similar to wildcard patterns that operates on a single word
base. One line of option group expands into one or more individual synonyms.
Option groups is the key mechanism for shortened synonyms notation. The
following examples demonstrate how to use option groups.</p><p> Consider the
following macros defined belo [...]
- ...
- "macros": [
- {
- "name": "<TRUCK_TYPE>",
- "macro": "{ {light|super|heavy|medium} duty|half ton|1/2
ton|3/4 ton|one ton}"
- }
- ]
- "elements": [
- {
- "id": "transport.vehicle",
- "description": "Transportation vehicle",
- "synonyms": [
- "car",
- "{<TRUCK_TYPE>|_} {pickup|_} truck"
- "sedan",
- "coupe"
- ]
- }
- ]
- ...
- </pre><span id="regex" class="section-sub-title">Regular Expressions
<a href="#"><i class="top-link fas fa-fw fa-angle-double-up"></i></a></span><p>
Any individual synonym word that starts and ends with <code>//</code> (two
forward slashes) is considered to be Java regular expression as defined in
<code>java.util.regex.Pattern</code>. Note that regular expression can only
span a single word, i.e. only individual words from the user input will be
matched against given regular expr [...]
- "synonyms": [
- "{foo|//[bar].+//}}"
- ]
- </pre><p> will match word <code>foo</code> or any other strings that
start with <code>bar</code> as long as this string doesn't contain
whitespaces.</p><div class="bq info"> <b>Regular Expressions Performance</b><p>
It's important to note that regular expressions can significantly affect the
performance of the NLPCraft processing if used uncontrolled. Use it with
caution and test the performance of your model to ensure it meets your
requirements.</p></div><span id="values" class= [...]
+ </pre><p> While adding multi-word synonyms looks somewhat trivial - in
real models, the naive approach can lead to thousands and even tens of
thousands of possible synonyms due to words, grammar, and linguistic
permutations - which quickly becomes untenable if performed manually.</p><p>
NLPCraft provides an effective tool for a compact synonyms representation.
Instead of listing all possible multi-word synonyms one by one you can use
combination of following techniques:</p><ul><l [...]
...
"macros": [
{
@@ -289,10 +339,50 @@ intents:
| | |-- hatchback
| | +-- wagon
</pre><p> Then in our intent, for example, we could look for any token
with root parent ID <code>vehicle</code> or immediate parent ID
<code>truck</code> or <code>car</code> without a need to match on all current
and future individual sub-IDs. For example:</p><pre class="brush: idl">
- intent=vehicle.intent term~{has(tok_ancestors(), 'vehicle')}
- intent=truck.intent term~{tok_parent() == 'truck'}
- intent=car.intent term~{tok_parent() == 'car'}
- </pre></section><section id="dsl" ><h2 class="section-title">IDL
Expressions <a href="#"><i class="top-link fas fa-fw
fa-angle-double-up"></i></a></h2><p> Any individual synonym word that that
starts and ends with <code>^^</code> is a <a
href="/intent-matching.html#idl">IDL expression.</a> IDL expression inside of
<code>^^ ... ^^</code> markers allows you to define a predicate on already
parsed and detected token. It is very important to note that unlike all other
synonyms the ID [...]
+ intent=vehicle.intent term~{has(tok_ancestors, 'vehicle')}
+ intent=truck.intent term~{tok_parent == 'truck'}
+ intent=car.intent term~{tok_parent == 'car'}
+ </pre></section><section id="syns-tools"> <span id="macros"
class="section-sub-title">Macros <a href="#"><i class="top-link fas fa-fw
fa-angle-double-up"></i></a></span><p> Listing all possible multi-word synonyms
for a given element can be a time-consuming task. Macros together with option
groups allow for significant simplification of this task. Macros allow you to
give a name to an often used set of words or option groups and reuse it without
repeating those words or option gr [...]
+ "macros": [
+ {
+ "name": "<A>",
+ "macro": "aaa"
+ },
+ {
+ "name": "<B>",
+ "macro": "<A> bbb"
+ },
+ {
+ "name": "<C>",
+ "macro": "<A> bbb {z|w}"
+ }
+ ]
+ </pre><span id="option-groups" class="section-sub-title">Option Groups
<a href="#"><i class="top-link fas fa-fw fa-angle-double-up"></i></a></span><p>
Option groups are similar to wildcard patterns that operates on a single word
base. One line of option group expands into one or more individual synonyms.
Option groups is the key mechanism for shortened synonyms notation. The
following examples demonstrate how to use option groups.</p><p> Consider the
following macros defined belo [...]
+ ...
+ "macros": [
+ {
+ "name": "<TRUCK_TYPE>",
+ "macro": "{ {light|super|heavy|medium} duty|half ton|1/2
ton|3/4 ton|one ton}"
+ }
+ ]
+ "elements": [
+ {
+ "id": "transport.vehicle",
+ "description": "Transportation vehicle",
+ "synonyms": [
+ "car",
+ "{<TRUCK_TYPE>|_} {pickup|_} truck"
+ "sedan",
+ "coupe"
+ ]
+ }
+ ]
+ ...
+ </pre><span id="regex" class="section-sub-title">Regular Expressions
<a href="#"><i class="top-link fas fa-fw fa-angle-double-up"></i></a></span><p>
Any individual synonym word that starts and ends with <code>//</code> (two
forward slashes) is considered to be Java regular expression as defined in
<code>java.util.regex.Pattern</code>. Note that regular expression can only
span a single word, i.e. only individual words from the user input will be
matched against given regular expr [...]
+ "synonyms": [
+ "{foo|//[bar].+//}}"
+ ]
+ </pre><p> will match word <code>foo</code> or any other strings that
start with <code>bar</code> as long as this string doesn't contain
whitespaces.</p><div class="bq info"> <b>Regular Expressions Performance</b><p>
It's important to note that regular expressions can significantly affect the
performance of the NLPCraft processing if used uncontrolled. Use it with
caution and test the performance of your model to ensure it meets your
requirements.</p></div><h2 id="dsl" class="sect [...]
...
"elements": [
{
@@ -310,13 +400,13 @@ intents:
"id": "race.vehicle",
"description": "Race vehicle",
"synonyms": [
- "{race|speed|track} ^^{tok_id() ==
'transport.vehicle'}^^"
+ "{race|speed|track} ^^{# == 'transport.vehicle'}^^"
]
}
]
...
- </pre><div class="bq warn"><p> <b>Greedy NERs <span
class="amp">&</span> Synonyms Conflicts</b></p><p> Note that in the above
example you need to ensure that words <code>race</code>, <code>speed</code> or
<code>track</code> are not part of the <code>transport.vehicle</code> token. It
is particular important for the 3rd party NERs where specific rules about what
words can or cannot be part of the token are unclear or undefined. In such
cases the only remedy is to extensively test [...]
+ </pre><div class="bq warn"><p> <b>Greedy NERs <span
class="amp">&</span> Synonyms Conflicts</b></p><p> Note that in the above
example you need to ensure that words <code>race</code>, <code>speed</code> or
<code>track</code> are not part of the <code>transport.vehicle</code> token. It
is particular important for the 3rd party NERs where specific rules about what
words can or cannot be part of the token are unclear or undefined. In such
cases the only remedy is to extensively test [...]
...
"elements": [
{
@@ -324,13 +414,13 @@ intents:
"description": "Wrapper for google location",
"groups": ["my_group"],
"synonyms": [
- "^^{tok_id() == 'google:location'}^^"
+ "^^{# == 'google:location'}^^"
]
}
]
...
- </pre><span id="dsl-syntax" class="section-sub-title">IDL Expression
Syntax <a href="#"><i class="top-link fas fa-fw
fa-angle-double-up"></i></a></span><p> IDL expressions are a subset of overall
<a href="/intent-matching.html#idl">IDL syntax</a>. You can review formal <a
target="github"
href="https://github.com/apache/incubator-nlpcraft/blob/master/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdl.g4">ANTLR4
grammar</a> but basically an IDL expressio [...]
+ </pre><b>IDL Expression Syntax</b><p> IDL expressions are a subset of
overall <a href="/intent-matching.html#idl">IDL syntax</a>. You can review
formal <a target="github"
href="https://github.com/apache/incubator-nlpcraft/blob/master/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIdl.g4">ANTLR4
grammar</a> but basically an IDL expression for synonym is a term expression
with the optional alias at the beginning. Here's an example of IDL expression
defin [...]
"synonyms": [
- "population {of|for} ^^[city]{tok_id() == 'nlpcraft:city' &&
lowercase(meta_tok('city:country')) == 'france'}^^"
+ "population {of|for} ^^[city]{# == 'nlpcraft:city' &&
lowercase(meta_tok('city:country')) == 'france'}^^"
]
- </pre><b>NOTES:</b><ul><li>Optional alias <code>city</code> can be
used to access a constituent part token (with ID
<code>nlpcraft:city</code>).<li> The expression between <code>{</code> and
<code>}</code> brackets is a standard IDL term
expression.</ul></section><section id="programmable_ners"><h2
class="section-title">Programmable NERs <a href="#"><i class="top-link fas
fa-fw fa-angle-double-up"></i></a></h2><p> By default, the data model detects
its elements by their synonyms, [...]
+ </pre><b>NOTES:</b><ul><li>Optional alias <code>city</code> can be
used to access a constituent part token (with ID
<code>nlpcraft:city</code>).<li> The expression between <code>{</code> and
<code>}</code> brackets is a standard IDL term expression.</ul><h2
id="custom_ners" class="section-sub-title">Custom NERs <a href="#"><i
class="top-link fas fa-fw fa-angle-double-up"></i></a></h2><p> By default, the
data model detects its elements by their synonyms, regexp or IDL expressions.
[...]
diff --git a/examples/alarm_clock.html b/examples/alarm_clock.html
index 394619b..dcd269b 100644
--- a/examples/alarm_clock.html
+++ b/examples/alarm_clock.html
@@ -37,7 +37,7 @@
}
],
"intents": [
- "intent=alarm term~{tok_id() == 'x:alarm'} term(nums)~{tok_id() ==
'nlpcraft:num' && meta_token('nlpcraft:num:unittype') == 'datetime' &&
meta_token('nlpcraft:num:isequalcondition') == true}[0,7]"
+ "intent=alarm term~{# == 'x:alarm'} term(nums)~{# == 'nlpcraft:num' &&
meta_token('nlpcraft:num:unittype') == 'datetime' &&
meta_token('nlpcraft:num:isequalcondition') == true}[0,7]"
]
}
</pre><p>There are number of important points here:</p><ul><li>
<code>Line 7</code> indicates that we'll be using built-in token
<code>nlpcraft:num</code> (and therefore it needs to be explicitly
enabled).<li> <code>Line 11</code> defines the only custom model element we'll
need. It's ID is <code>x:alarm</code> and it is defined through synonyms. It
basically means a verb to set up an alarm clock.<li> On <code>line 20</code> we
define an intent <code>alarm</code> that we are goin [...]
diff --git a/examples/light_switch.html b/examples/light_switch.html
index 62d16c5..35b7d71 100644
--- a/examples/light_switch.html
+++ b/examples/light_switch.html
@@ -70,7 +70,7 @@ elements:
- "no <LIGHT>"
intents:
- - "intent=ls term(act)={has(tok_groups(), 'act')} term(loc)={tok_id() ==
'ls:loc'}*"
+ - "intent=ls term(act)={has(tok_groups, 'act')} term(loc)={# == 'ls:loc'}*"
</pre><p>There are number of important points here:</p><ul><li>
<code>Line 6</code> defines several macros that are used later on throughout
the model's elements to shorten the synonym declarations. Note how macros
coupled with option groups shorten overall synonym declarations 1000:1 vs.
manually listing all possible word permutations.<li> <code>Lines 22, 23</code>
define model properties that allow for multi-word synonyms in this model to be
<a class="not-code" target="javadoc" [...]
package demo
diff --git a/feed.xml b/feed.xml
index 675eef2..c7b9d6c 100644
--- a/feed.xml
+++ b/feed.xml
@@ -1 +1 @@
-<?xml version="1.0" encoding="utf-8"?><feed
xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/"
version="4.1.1">Jekyll</generator><link href="http://localhost:4000/feed.xml"
rel="self" type="application/atom+xml" /><link href="http://localhost:4000/"
rel="alternate" type="text/html"
/><updated>2021-08-22T13:42:27-07:00</updated><id>http://localhost:4000/feed.xml</id><title
type="html">Apache NLPCraft</title></feed>
\ No newline at end of file
+<?xml version="1.0" encoding="utf-8"?><feed
xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/"
version="4.2.0">Jekyll</generator><link href="/feed.xml" rel="self"
type="application/atom+xml" /><link href="/" rel="alternate" type="text/html"
/><updated>2021-09-03T21:46:18-07:00</updated><id>/feed.xml</id><title
type="html">Apache NLPCraft</title></feed>
\ No newline at end of file
diff --git a/first-example.html b/first-example.html
index 84010ce..64c0b4a 100644
--- a/first-example.html
+++ b/first-example.html
@@ -70,7 +70,7 @@ elements:
- "no <LIGHT>"
intents:
- - "intent=ls term(act)={has(tok_groups(), 'act')} term(loc)={tok_id() ==
'ls:loc'}*"
+ - "intent=ls term(act)={has(tok_groups, 'act')} term(loc)={# == 'ls:loc'}*"
</pre><p>There are number of important points here:</p><ul><li>
<code>Line 6</code> defines several macros that are used later on throughout
the model's elements to shorten the synonym declarations. Note how macros
coupled with option groups shorten overall synonym declarations 1000:1 vs.
manually listing all possible word permutations.<li> <code>Lines 22, 23</code>
define model properties that allow for multi-word synonyms in this model to be
<a class="not-code" target="javadoc" [...]
package demo
diff --git a/intent-matching.html b/intent-matching.html
index 4fc65c2..e1d9295 100644
--- a/intent-matching.html
+++ b/intent-matching.html
@@ -15,20 +15,19 @@
limitations under the License.
-->
-<!doctype html><html lang="en"> <script async
src="https://www.googletagmanager.com/gtag/js?id=UA-180663034-1"></script>
<script> window.dataLayer = window.dataLayer || []; function
gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config',
'UA-180663034-1'); </script><meta charset="utf-8"><meta
http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport"
content="width=device-width, initial-scale=1, shrink-to-fit=no"><meta
name="description" content="An open sourc [...]
+<!doctype html><html lang="en"> <script async
src="https://www.googletagmanager.com/gtag/js?id=UA-180663034-1"></script>
<script> window.dataLayer = window.dataLayer || []; function
gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config',
'UA-180663034-1'); </script><meta charset="utf-8"><meta
http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport"
content="width=device-width, initial-scale=1, shrink-to-fit=no"><meta
name="description" content="An open sourc [...]
intent=x
- term(a)~{tok_id() == 'my_elm'}
- term(b)={has(tok_groups(), "my_group")}
- </pre><p> IDL intent defines a match between the parsed user input
represented as the collection of <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCToken.html">tokens</a>, and the
user-define callback method. IDL intents are <a href="#binding">bound</a> to
their callbacks via <a href="#binding">Java annotation</a> and can be <a
href="#idl_location">located</a> in the same Java annotations or placed in
model YAML/JSON file as well as in external [...]
+ term(a)~{# == 'my_elm'}
+ term(b)={has(tok_groups, "my_group")}
+ </pre><p> IDL intent defines a match between the parsed user input
represented as the collection of <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCToken.html">tokens</a>, and the
user-define callback method. IDL intents are <a href="#binding">bound</a> to
their callbacks via <a href="#binding">Java annotation</a> and can be <a
href="#idl_location">located</a> in the same Java annotations or placed in
model YAML/JSON file as well as in external [...]
intent=xa
flow="^(?:login)(^:logout)*$"
meta={'enabled': true}
- term(a)={month() >= 6 && !(tok_id()) != "z" &&
meta_intent('enabled') == true}[1,3]
+ term(a)={month >= 6 && !# != "z" &&
meta_intent('enabled') == true}[1,3]
term(b)~{
- @tokId = tok_id()
@usrTypes = meta_model('user_types')
- (tokId == 'order' || tokId == 'order_cancel') &&
has_all(@usrTypes, list(1, 2, 3))
+ (# == 'order' || # == 'order_cancel') &&
has_all(@usrTypes, list(1, 2, 3))
}
intent=xb
@@ -42,7 +41,7 @@
flow=/#flowModelMethod/
term(a)=/org.mypackage.MyClass#termMethod/?
fragment(frag, {'p1': 25, 'p2': {'a': false}})
- </pre><p><b>NOTES:</b></p><dl><dt> <code>intent=xa</code>
<sup><small>line 1</small></sup><br/> <code>intent=xb</code> <sup><small>line
12</small></sup><dd> <code>xa</code> and <code>xb</code> are the mandatory
intent IDs. Intent ID is any arbitrary unique string matching the following
lexer template:
<code>(UNI_CHAR|UNDERSCORE|LETTER|DOLLAR)+(UNI_CHAR|DOLLAR|LETTER|[0-9]|COLON|MINUS|UNDERSCORE)*</code><dt><code>options={...}</code>
<sup><small>line 13</small></sup><dd> < [...]
+ </pre><p><b>NOTES:</b></p><dl><dt> <code>intent=xa</code>
<sup><small>line 1</small></sup><br/> <code>intent=xb</code> <sup><small>line
12</small></sup><dd> <code>xa</code> and <code>xb</code> are the mandatory
intent IDs. Intent ID is any arbitrary unique string matching the following
lexer template:
<code>(UNI_CHAR|UNDERSCORE|LETTER|DOLLAR)+(UNI_CHAR|DOLLAR|LETTER|[0-9]|COLON|MINUS|UNDERSCORE)*</code><dt><code>options={...}</code>
<sup><small>line 13</small></sup><dd> < [...]
term(b)~{
@a = meta_model('a')
@lst = list(1, 2, 3, 4)
@@ -71,14 +70,14 @@
term(a)=/org.mypackage.MyClass#termMethod/?
</pre><p> Class name is optional in which case
the model class will be used by default. Note that if the custom class is in
fact specified, the instance of this class will be created for each term
evaluation. This class must have a no-arg constructor to instantiate via
standard Java reflection and its creation must be as light as possible to avoid
performance degradation during its instantiation. For this reason it is
recommended to have user-defined term [...]
// Fragments.
- fragment=buzz term~{tok_id() == meta_frag('id')}
+ fragment=buzz term~{# == meta_frag('id')}
fragment=when
term(nums)~{
// Term variable.
@type = meta_tok('nlpcraft:num:unittype')
@iseq = meta_tok('nlpcraft:num:isequalcondition')
- tok_id() == 'nlpcraft:num' && @type == 'datetime'
&& @iseq == true
+ # == 'nlpcraft:num' && @type == 'datetime' &&
@iseq == true
}[0,7]
// Intents.
@@ -97,15 +96,15 @@
// Import using URL.
import('ftp://user:password@myhost:22/opt/globals.idl')
- </pre><p> <b>NOTES:</b></p><ul
class="recover-bottom-margin"><li> The effect of importing is the same as if
the imported declarations were inserted in place of import statement.<li>
Recursive and cyclic imports are detected and safely ignored.<li> Import
statement starts with <code>import</code> keyword and has a string parameter
that indicates the location of the resource to import.<li> For the classpath
resource you don't need to specify leading forward slash.</ul><p></ [...]
+ </pre><p> <b>NOTES:</b></p><ul
class="recover-bottom-margin"><li> The effect of importing is the same as if
the imported declarations were inserted in place of import statement.<li>
Recursive and cyclic imports are detected and safely ignored.<li> Import
statement starts with <code>import</code> keyword and has a string parameter
that indicates the location of the resource to import.<li> For the classpath
resource you don't need to specify leading forward slash.</ul><p></ [...]
intent=a
- term~{tok_id() == 'x:id'}
- term(nums)~{tok_id() == 'nlpcraft:num' &&
lowercase(meta_tok('nlpcraft:num:unittype')) == 'datetime'}[0,2]
+ term~{# == 'x:id'}
+ term(nums)~{# == 'nlpcraft:num' &&
lowercase(meta_tok('nlpcraft:num:unittype')) == 'datetime'}[0,2]
</pre><p><b>NOTES:</b></p><ul><li> Intent has ID <code>a</code>.<li>
Intent uses default conversational support (<code>true</code>) and default
order (<code>false</code>).<li> Intent has two conversational terms
(<code>~</code>) that have to be found for the intent to match. Note that
second term is optional as it has <code>[0,2]</code> quantifier.<li> Both terms
have to be found in the user input for the intent to match.<li> First term
matches any single token with ID <code>x:id [...]
intent=id2
flow='id1 id2'
- term={tok_id() == 'mytok' && signum(get(meta_tok('score'),
'best')) != -1}
- term={has_any(tok_groups(), list('actors', 'owners')) &&
size(meta_part('partAlias, 'text')) > 10}
+ term={# == 'mytok' && signum(get(meta_tok('score'), 'best')) != -1}
+ term={has_any(tok_groups, list('actors', 'owners')) &&
size(meta_part('partAlias, 'text')) > 10}
</pre><p><b>NOTES:</b></p><ul><li> Intent has ID <code>id2</code>.<li>
Intent has dialog flow pattern: <code>'id1 id2'</code>. It expects the sequence
of intents <code>id1</code> and <code>id2</code> somewhere in the history of
previously matched intents in the course of the current conversation.<li>
Intent has two non-conversational terms (<code>=</code>). Both terms have to be
present only once (their implicit quantifiers are <code>[1,1]</code>).<li> Both
terms have to be found [...]
;(function()
{
@@ -143,122 +142,137 @@
})();
</pre><p> Make sure to include this script in your
page:</p><pre class="brush: js">
<script src="/path/to/your/scripts/shBrushIdl.js"
type="text/javascript"></script>
- </pre><p> And then you can use it to display IDL code from
HTML using <code><pre></code> tag and <code>brush: idl</code> CSS
class:</p><pre class="brush: html">
+ </pre><p> And then you can use it to display IDL code from
HTML using <code><pre></code> tag and <code>brush: idl</code> CSS
class:</p><pre class="brush: html, highlight: [1]">
<pre class="brush: idl">
intent=xa
flow="^(?:login)(^:logout)*$"
meta={'enabled': true}
- term(a)={month() >= 6 && !(tok_id()) != "z" && meta_intent('enabled')
== true}[1,3]
+ term(a)={month >= 6 && # != "z" && meta_intent('enabled') == true}[1,3]
term(b)~{
- @tokId = tok_id()
@usrTypes = meta_model('user_types')
- (tokId == 'order' || tokId == 'order_cancel') &&
has_all(@usrTypes, list(1, 2, 3))
+ (# == 'order' || # == 'order_cancel') && has_all(@usrTypes,
list(1, 2, 3))
}
</pre>
- </pre></div></div></section><section id="idl_functions" ><h2
class="section-title">IDL Functions <a href="#"><i class="top-link fas fa-fw
fa-angle-double-up"></i></a></h2><p> IDL provides over 140 built-in functions
that can be used in IDL intent definitions. IDL function call takes on
traditional <code><b>fun_name</b>(p1, p2, ... pk)</code> syntax form. IDL
function operates on stack - its parameters are taken from the stack and its
result is put back onto stack which in [...]
-tok_id() == 'my_id'
-tok_id(tok_this()) == 'my_id'
+ </pre></div></div></section><section id="idl_functions" ><h2
class="section-title">IDL Functions <a href="#"><i class="top-link fas fa-fw
fa-angle-double-up"></i></a></h2><p> IDL provides over 150 built-in functions
that can be used in IDL intent definitions. IDL function call takes on
traditional <code><b>fun_name</b>(p1, p2, ... pk)</code> syntax form. If
function has no parameters, the brackets are optional. IDL function operates on
stack - its parameters are taken fro [...]
+ tok_id() == 'id'
+ tok_id == 'id' // Remember - empty parens are optional.
+ # == 'id'
+ </pre></div><p> When chaining the function calls IDL uses
mathematical notation (a-la Python) rather than object-oriented one: IDL
<code>length(trim(" text "))</code> vs. OOP-style <code>" text
".trim().length()</code>.</p><p> IDL functions operate with the following
types:</p><table class="gradient-table"><thead><tr><th>JVM Type<th>IDL
Name<th>Notes<tbody><tr><td><code>java.lang.String</code><td><code>String</code><td><tr><td>
<code>java.lang.Long</code><br/> <code>java.lang [...]
+tok_id == 'my_id'
+# == 'my_id'
+tok_id(tok_this) == 'my_id'
+#(tok_this) == 'my_id'
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_lemma">
<span><code><b>tok_lemma</b>(t: Token<em><sub>opt</sub></em>) ⇒ String
</code></span> <span class="fn-short-desc">Returns <a class="not-code"
target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCToken.html#getLemma()">token
lemma</a> </span> </button></h2></div><div id="fn_tok_lem [...]
-tok_lemma() == 'work'
-tok_lemma(tok_this()) == 'work'
+tok_lemma == 'work'
+tok_lemma(tok_this) == 'work'
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_stem">
<span><code><b>tok_stem</b>(t: Token<em><sub>opt</sub></em>) ⇒ String
</code></span> <span class="fn-short-desc">Returns <a class="not-code"
target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCToken.html#getStem()">token
stem</a></span> </button></h2></div><div id="fn_tok_stem" cl [...]
-tok_stem() == 'work'
-tok_stem(tok_this()) == 'work'
+tok_stem == 'work'
+tok_stem(tok_this) == 'work'
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_pos"> <span><code><b>tok_pos</b>(t:
Token<em><sub>opt</sub></em>) ⇒ String </code></span> <span
class="fn-short-desc">Returns <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCToken.html#getPos()">token
PoS</a> tag</span> </button></h2></div><div id="fn_tok_pos" cla [...]
-tok_pos() == 'NN'
-tok_pos(tok_this()) == 'NN'
+tok_pos == 'NN'
+tok_pos(tok_this) == 'NN'
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_sparsity">
<span><code><b>tok_sparsity</b>(t: Token<em><sub>opt</sub></em>) ⇒ Long
</code></span> <span class="fn-short-desc">Returns <a class="not-code"
target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCToken.html#getSparsity()">token
sparsity</a> value</span> </button></h2></div><div [...]
-tok_sparsity()
-tok_sparsity(tok_this())
+tok_sparsity
+tok_sparsity(tok_this)
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_unid">
<span><code><b>tok_unid</b>(t: Token<em><sub>opt</sub></em>) ⇒ String
</code></span> <span class="fn-short-desc">Returns internal <a class="not-code"
target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCToken.html#getUnid()">token
globally unique ID</a></span> </button></h2></div>< [...]
-tok_unid()
-tok_unid(tok_this())
+tok_unid
+tok_unid(tok_this)
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_is_abstract">
<span><code><b>tok_is_abstract</b>(t: Token<em><sub>opt</sub></em>) ⇒ Boolean
</code></span> <span class="fn-short-desc">Returns <a class="not-code"
target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCToken.html#isAbstract()">token
abstract</a> flag</span> </button></h2></d [...]
-tok_is_abstract()
-tok_is_abstract(tok_this())
+tok_is_abstract
+tok_is_abstract(tok_this)
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_is_bracketed">
<span><code><b>tok_is_bracketed</b>(t: Token<em><sub>opt</sub></em>) ⇒ Boolean
</code></span> <span class="fn-short-desc">Returns <a class="not-code"
target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCToken.html#isBracketed()">token
bracketed</a> flag</span> </button></h2 [...]
-tok_is_bracketed()
-tok_is_bracketed(tok_this())
+tok_is_bracketed
+tok_is_bracketed(tok_this)
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_is_direct">
<span><code><b>tok_is_direct</b>(t: Token<em><sub>opt</sub></em>) ⇒ Boolean
</code></span> <span class="fn-short-desc">Returns <a class="not-code"
target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCToken.html#isDirect()">token
direct</a> flag</span> </button></h2></div><div [...]
-tok_is_direct()
-tok_is_direct(tok_this())
+tok_is_direct
+tok_is_direct(tok_this)
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_is_permutated">
<span><code><b>tok_is_permutated</b>(t: Token<em><sub>opt</sub></em>) ⇒ Boolean
</code></span> <span class="fn-short-desc">Returns <a class="not-code"
target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCToken.html#isPermutated()">token
permutated</a> flag</span> </button> [...]
-tok_is_permutated()
-tok_is_permutated(tok_this())
+tok_is_permutated
+tok_is_permutated(tok_this)
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_is_english">
<span><code><b>tok_is_english</b>(t: Token<em><sub>opt</sub></em>) ⇒ Boolean
</code></span> <span class="fn-short-desc">Returns <a class="not-code"
target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCToken.html#isEnglish()">token
English</a> detection flag</span> </button></ [...]
-tok_is_english()
-tok_is_english(tok_this())
+tok_is_english
+tok_is_english(tok_this)
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_is_freeword">
<span><code><b>tok_is_freeword</b>(t: Token<em><sub>opt</sub></em>) ⇒ Boolean
</code></span> <span class="fn-short-desc">Returns <a class="not-code"
target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCToken.html#isFreeWord()">token
freeword</a> flag</span> </button></h2></d [...]
-tok_is_freeword()
-tok_is_freeword(tok_this())
+tok_is_freeword
+tok_is_freeword(tok_this)
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_is_quoted">
<span><code><b>tok_is_quoted</b>(t: Token<em><sub>opt</sub></em>) ⇒ Boolean
</code></span> <span class="fn-short-desc">Returns <a class="not-code"
target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCToken.html#isQuoted()">token
quoted</a> flag</span> </button></h2></div><div [...]
-tok_is_quoted()
-tok_is_quoted(tok_this())
+tok_is_quoted
+tok_is_quoted(tok_this)
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_is_stopword">
<span><code><b>tok_is_stopword</b>(t: Token<em><sub>opt</sub></em>) ⇒ Boolean
</code></span> <span class="fn-short-desc">Returns <a class="not-code"
target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCToken.html#isStopWord()">token
stopword</a> flag</span> </button></h2></d [...]
-tok_is_stopword()
-tok_is_stopword(tok_this())
+tok_is_stopword
+tok_is_stopword(tok_this)
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_is_swear">
<span><code><b>tok_is_swear</b>(t: Token<em><sub>opt</sub></em>) ⇒ Boolean
</code></span> <span class="fn-short-desc">Returns <a class="not-code"
target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCToken.html#isSwearWord()">token
swear word</a> flag</span> </button></h2></div> [...]
-tok_is_swear()
-tok_is_swear(tok_this())
+tok_is_swear
+tok_is_swear(tok_this)
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_is_user">
<span><code><b>tok_is_user</b>(t: Token<em><sub>opt</sub></em>) ⇒ Boolean
</code></span> <span class="fn-short-desc">Returns if this token is <a
class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCToken.html#isUserDefined()">user-defined</a></span>
</button></h [...]
-tok_is_user()
-tok_is_user(tok_this())
+tok_is_user
+tok_is_user(tok_this)
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_is_wordnet">
<span><code><b>tok_is_wordnet</b>(t: Token<em><sub>opt</sub></em>) ⇒ Boolean
</code></span> <span class="fn-short-desc">Returns if this token is part of <a
class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCToken.html#isWordnet()">WordNet</a>
dictionary</sp [...]
-tok_is_wordnet()
-tok_is_wordnet(tok_this())
+tok_is_wordnet
+tok_is_wordnet(tok_this)
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_ancestors">
<span><code><b>tok_ancestors</b>(t: Token<em><sub>opt</sub></em>) ⇒
List[String] </code></span> <span class="fn-short-desc">Gets the <a
class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCToken.html#getAncestors()">list
of all parent IDs</a> for this token</s [...]
-tok_ancestors()
-tok_ancestors(tok_this())
+tok_ancestors
+tok_ancestors(tok_this)
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_parent">
<span><code><b>tok_parent</b>(t: Token<em><sub>opt</sub></em>) ⇒ String
</code></span> <span class="fn-short-desc">Gets optional <a class="not-code"
target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCToken.html#getParentId()">parent
ID</a> for this token</span> </button></h2></ [...]
-tok_parent()
-tok_parent(tok_this())
+tok_parent
+tok_parent(tok_this)
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_groups">
<span><code><b>tok_groups</b>(t: Token<em><sub>opt</sub></em>) ⇒ List[String]
</code></span> <span class="fn-short-desc">Gets the list of <a class="not-code"
target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCToken.html#getGroups()">groups</a>
this token belongs to</span> </but [...]
-tok_groups()
-tok_groups(tok_this())
+tok_groups
+tok_groups(tok_this)
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_value">
<span><code><b>tok_value</b>(t: Token<em><sub>opt</sub></em>) ⇒ String
</code></span> <span class="fn-short-desc">Gets the <a class="not-code"
target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCToken.html#getValue()">value</a>
if this token was detected via element's value</span [...]
-tok_value()
-tok_value(tok_this())
+tok_value
+tok_value(tok_this)
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_aliases">
<span><code><b>tok_aliases</b>(t: Token<em><sub>opt</sub></em>) ⇒ List[String]
</code></span> <span class="fn-short-desc">Gets optional <a class="not-code"
target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCToken.html#getAliases()">list of
aliases</a> this token is known by</s [...]
-has(tok_aliases(), 'alias')
-has(tok_aliases(tok_this()), 'alias')
+has(tok_aliases, 'alias')
+has(tok_aliases(tok_this), 'alias')
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_start_idx">
<span><code><b>tok_start_idx</b>(t: Token<em><sub>opt</sub></em>) ⇒ Long
</code></span> <span class="fn-short-desc">Gets <a class="not-code"
target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCToken.html#getStartCharIndex()">start
character index</a> of this token in the orig [...]
-tok_start_idx()
-tok_start_idx(tok_this())
+tok_start_idx
+tok_start_idx(tok_this)
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_end_idx">
<span><code><b>tok_end_idx</b>(t: Token<em><sub>opt</sub></em>) ⇒ Long
</code></span> <span class="fn-short-desc">Gets <a class="not-code"
target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCToken.html#getEndCharIndex()">end
character index</a> of this token in the original tex [...]
-tok_end_idx()
-tok_end_idx(tok_this())
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_this">
<span><code><b>tok_this</b>() ⇒ Token </code></span> <span
class="fn-short-desc">Returns current token.</span> </button></h2></div><div
id="fn_tok_this" class="collapse" data-parent="#token_fns"><div
class="card-body"><p class="fn-desc"> <em>Description:</em><br> Returns current
token.</p><p [...]
-tok_this()
+tok_end_idx
+tok_end_idx(tok_this)
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_this"> <span><code><b>tok_this</b>
⇒ Token </code></span> <span class="fn-short-desc">Returns current
token.</span> </button></h2></div><div id="fn_tok_this" class="collapse"
data-parent="#token_fns"><div class="card-body"><p class="fn-desc">
<em>Description:</em><br> Returns current token.</p><p cl [...]
+tok_this
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_find_part">
<span><code><b>tok_find_part</b>(t: Token, a: String) ⇒ Token </code></span>
<span class="fn-short-desc">Finds part token with given alias or ID.</span>
</button></h2></div><div id="fn_tok_find_part" class="collapse"
data-parent="#token_fns"><div class="card-body"><p class="fn-desc"> <em [...]
// if any, or throws runtime exception.
-tok_find_part(tok_this(), 'alias')
+tok_find_part(tok_this, 'alias')
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_has_part">
<span><code><b>tok_has_part</b>(t: Token, a: String) ⇒ Boolean </code></span>
<span class="fn-short-desc">Checks if part token with given alias or ID
exists.</span> </button></h2></div><div id="fn_tok_has_part" class="collapse"
data-parent="#token_fns"><div class="card-body"><p class="fn- [...]
-tok_has_part(tok_this(), 'alias')
+tok_has_part(tok_this, 'alias')
// Result: part token 'alias' if it exists or the current token if it does not.
-@this = tok_this()
+@this = tok_this
@tok = if(tok_has_part(@this, 'alias'), tok_find_part(@this, 'alias'), @this)
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_find_parts">
<span><code><b>tok_find_parts</b>(t: Token, a: String) ⇒ List[Token]
</code></span> <span class="fn-short-desc">Finds part tokens with given alias
or ID.</span> </button></h2></div><div id="fn_tok_find_parts" class="collapse"
data-parent="#token_fns"><div class="card-body"><p class="fn- [...]
-tok_find_parts(tok_this(), 'alias')
+tok_find_parts(tok_this, 'alias')
// Result: part token 'alias' if it exists or the current token if it does not.
-@this = tok_this()
+@this = tok_this
@parts = tok_find_parts(@this, 'alias')
@tok = if(is_empty(@parts), @this, first(@parts))
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_txt"> <span><code><b>tok_txt</b>(t:
Token<em><sub>opt</sub></em>) ⇒ String </code></span> <span
class="fn-short-desc">Returns token's original text</span>
</button></h2></div><div id="fn_tok_txt" class="collapse"
data-parent="#token_fns"><div class="card-body"><p class="fn-desc">
<em>Description:</e [...]
+tok_txt
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_norm_txt">
<span><code><b>tok_norm_txt</b>(t: Token<em><sub>opt</sub></em>) ⇒ String
</code></span> <span class="fn-short-desc">Returns token's normalized
text</span> </button></h2></div><div id="fn_tok_norm_txt" class="collapse"
data-parent="#token_fns"><div class="card-body"><p class="fn-desc"> <e [...]
+tok_norm_txt
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_index">
<span><code><b>tok_index</b>(t: Token<em><sub>opt</sub></em>) ⇒ Long
</code></span> <span class="fn-short-desc">Returns token's index in the
original input</span> </button></h2></div><div id="fn_tok_index"
class="collapse" data-parent="#token_fns"><div class="card-body"><p
class="fn-desc"> < [...]
-tok_index() == 1
-tok_index(tok_this()) == 1
+tok_index == 1
+tok_index(tok_this) == 1
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_is_first">
<span><code><b>tok_is_first</b>(t: Token<em><sub>opt</sub></em>) ⇒ Boolean
</code></span> <span class="fn-short-desc">Returns <code>true</code> if this
token is the first in the original input</span> </button></h2></div><div
id="fn_tok_is_first" class="collapse" data-parent="#token_fns">< [...]
-tok_is_first()
-tok_is_first(tok_this())
+tok_is_first
+tok_is_first(tok_this)
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_is_last">
<span><code><b>tok_is_last</b>(t: Token<em><sub>opt</sub></em>) ⇒ Boolean
</code></span> <span class="fn-short-desc">Returns <code>true</code> if this
token is the last in the original input</span> </button></h2></div><div
id="fn_tok_is_last" class="collapse" data-parent="#token_fns"><div [...]
-tok_is_last()
-tok_is_last(tok_this())
+tok_is_last
+tok_is_last(tok_this)
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_is_before_id">
<span><code><b>tok_is_before_id</b>(id: String) ⇒ Boolean </code></span> <span
class="fn-short-desc">Returns <code>true</code> if there is a token with ID
<code>id</code> after this token</span> </button></h2></div><div
id="fn_tok_is_before_id" class="collapse" data-parent="#token_fns [...]
tok_is_before_id('a')
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_is_after_id">
<span><code><b>tok_is_after_id</b>(id: String) ⇒ Boolean </code></span> <span
class="fn-short-desc">Returns <code>true</code> if there is a token with ID
<code>id</code> before this token</span> </button></h2></div><div
id="fn_tok_is_after_id" class="collapse" data-parent="#token_fns"> [...]
tok_is_after_id('a')
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_is_between_ids">
<span><code><b>tok_is_between_ids</b>(id1: String, id2: String) ⇒ Boolean
</code></span> <span class="fn-short-desc">Returns <code>true</code> if this
token is located between tokens with IDs <code>id1</code> and
<code>id2</code>.</span> </button></h2></div><div id="fn_tok_is_betwee [...]
+tok_is_between_ids('before', 'after')
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_is_between_groups">
<span><code><b>tok_is_between_groups</b>(grp1: String, grp2: String) ⇒ Boolean
</code></span> <span class="fn-short-desc">Returns <code>true</code> if this
token is located between tokens with group IDs <code>grp1</code> and
<code>grp2</code>.</span> </button></h2></div><div id=" [...]
+tok_is_between_groups('before', 'after')
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_is_between_parents">
<span><code><b>tok_is_between_parents</b>(id1: String, id2: String) ⇒ Boolean
</code></span> <span class="fn-short-desc">Returns <code>true</code> if this
token is located between tokens with parent IDs <code>id1</code> and
<code>id2</code>.</span> </button></h2></div><div id="f [...]
+tok_is_between_parents('before', 'after')
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_is_before_group">
<span><code><b>tok_is_before_group</b>(grp: String) ⇒ Boolean </code></span>
<span class="fn-short-desc">Returns <code>true</code> if there is a token that
belongs to the <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCToken.html#getGroups()">gro [...]
tok_is_before_group('grp')
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_is_after_group">
<span><code><b>tok_is_after_group</b>(grp: String) ⇒ Boolean </code></span>
<span class="fn-short-desc">Returns <code>true</code> if there is a token that
belongs to the <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCToken.html#getGroups()">group
[...]
@@ -267,45 +281,47 @@ tok_is_after_group('grp')
tok_is_after_parent('owner')
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_is_before_parent">
<span><code><b>tok_is_before_parent</b>(parentId: String) ⇒ Boolean
</code></span> <span class="fn-short-desc">Returns <code>true</code> if there
is a token with <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCToken.html#getParentId()">parent
ID [...]
tok_is_before_parent('owner')
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_all"> <span><code><b>tok_all</b>()
⇒ List[Token] </code></span> <span class="fn-short-desc">Returns all tokens
from the original input </span> </button></h2></div><div id="fn_tok_all"
class="collapse" data-parent="#token_fns"><div class="card-body"><p
class="fn-desc"> <em>Description:</em><br> Retur [...]
-tok_all()
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_count">
<span><code><b>tok_count</b>() ⇒ Long </code></span> <span
class="fn-short-desc">Returns number of tokens from the original input </span>
</button></h2></div><div id="fn_tok_count" class="collapse"
data-parent="#token_fns"><div class="card-body"><p class="fn-desc">
<em>Description:</em><br> [...]
-tok_count()
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_all"> <span><code><b>tok_all</b> ⇒
List[Token] </code></span> <span class="fn-short-desc">Returns all tokens from
the original input </span> </button></h2></div><div id="fn_tok_all"
class="collapse" data-parent="#token_fns"><div class="card-body"><p
class="fn-desc"> <em>Description:</em><br> Returns [...]
+tok_all
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_count">
<span><code><b>tok_count</b> ⇒ Long </code></span> <span
class="fn-short-desc">Returns number of tokens from the original input </span>
</button></h2></div><div id="fn_tok_count" class="collapse"
data-parent="#token_fns"><div class="card-body"><p class="fn-desc">
<em>Description:</em><br> Re [...]
+tok_count
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_all_for_id">
<span><code><b>tok_all_for_id</b>(id: String) ⇒ List[Token] </code></span>
<span class="fn-short-desc">Returns list of tokens from the original input with
ID <code>id</code> </span> </button></h2></div><div id="fn_tok_all_for_id"
class="collapse" data-parent="#token_fns"><div class="car [...]
tok_all_for_id('id')
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_all_for_parent">
<span><code><b>tok_all_for_id</b>(parentId: String) ⇒ List[Token]
</code></span> <span class="fn-short-desc">Returns list of tokens from the
original input with parent ID <code>parentId</code> </span>
</button></h2></div><div id="fn_tok_all_for_parent" class="collapse"
data-parent=" [...]
tok_all_for_parent('id')
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_tok_all_for_group">
<span><code><b>tok_all_for_group</b>(grp: String) ⇒ List[Token] </code></span>
<span class="fn-short-desc">Returns list of tokens from the original input that
belong to the group <code>grp</code> </span> </button></h2></div><div
id="fn_tok_all_for_group" class="collapse" data-parent= [...]
tok_all_for_group('grp')
-</pre></div></div></div></div></div><div class="tab-pane fade show"
id="fn_text" role="tabpanel"><div class="accordion" id="text_fns"><div
class="card"><div class="card-header"><h2 class="mb-0"> <button class="btn
btn-link btn-block text-left" type="button" data-toggle="collapse"
data-target="#fn_length"> <span><code><b>length</b>(p: {String|List|Map}) ⇒
Long </code></span> <span class="fn-short-desc">Returns size or length of the
given string, list or map</span> </button></h2></div><div [...]
+</pre></div></div></div></div></div><div class="tab-pane fade show"
id="fn_text" role="tabpanel"><div class="accordion" id="text_fns"><div
class="card"><div class="card-header"><h2 class="mb-0"> <button class="btn
btn-link btn-block text-left" type="button" data-toggle="collapse"
data-target="#fn_length"> <span><code><b>length</b>(p: {String|List|Map}) ⇒
Long </code></span> <span class="fn-short-desc">Returns size or length of the
given string, list or map</span> </button></h2></div><div [...]
length("some text")
// Result: 3
@lst = list(1, 2, 3)
size(@lst)
count(@lst)
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_trim"> <span><code><b>trim</b>(p:
String) ⇒ Long </code></span> <span class="fn-short-desc">Calls <a
target="javadoc"
href="https://docs.oracle.com/en/java/javase/15/docs/api/java.base/java/lang/String.html#trim()"><code>String.trim()</code></a></span>
</button></h2></div><div id="fn_trim" class="collap [...]
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_regex"> <span><code><b>regex</b>(s:
String, rx: String) ⇒ Boolean </code></span> <span class="fn-short-desc">Checks
whether string <code>s</code> matches Java regular expression
<code>rx</code></span> </button></h2></div><div id="fn_regex" class="collapse"
data-parent="#text_fns"><div class="card-body"> [...]
+regex('_textabc', '^text.*$') // Returns 'false'.
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_trim"> <span><code><b>trim</b>(p:
String) ⇒ Long </code></span> <span class="fn-short-desc">Calls <a
target="javadoc"
href="https://docs.oracle.com/en/java/javase/15/docs/api/java.base/java/lang/String.html#trim()"><code>String.trim()</code></a></span>
</button></h2></div><div id="fn_trim" class="collap [...]
trim(" text ")
strip(" text ")
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_uppercase">
<span><code><b>uppercase</b>(p: String) ⇒ String </code></span> <span
class="fn-short-desc">Calls <a target="javadoc"
href="https://docs.oracle.com/en/java/javase/15/docs/api/java.base/java/lang/String.html#toUpperCase()"><code>String.toUpperCase()</code></a></span>
</button></h2></div><div [...]
uppercase("text")
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_lowercase">
<span><code><b>lowercase</b>(p: String) ⇒ String </code></span> <span
class="fn-short-desc">Calls <a target="javadoc"
href="https://docs.oracle.com/en/java/javase/15/docs/api/java.base/java/lang/String.html#toLowerCase()"><code>String.toLowerCase()</code></a></span>
</button></h2></div><div [...]
lowercase("TeXt")
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_is_alpha">
<span><code><b>is_alpha</b>(p: String) ⇒ Boolean </code></span> <span
class="fn-short-desc">Calls <a target="javadoc"
href="http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#isAlpha-java.lang.CharSequence-"><code>StringUtils.isAlpha()</code></a></
[...]
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_is_alpha">
<span><code><b>is_alpha</b>(p: String) ⇒ Boolean </code></span> <span
class="fn-short-desc">Calls <a target="javadoc"
href="https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#isAlpha-java.lang.CharSequence-"><code>StringUtils.isAlpha()</code></a><
[...]
is_alpha("text")
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_is_alphanum">
<span><code><b>is_alphanum</b>(p: String) ⇒ Boolean </code></span> <span
class="fn-short-desc">Calls <a target="javadoc"
href="http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#isAlphanumeric-java.lang.CharSequence-"><code>StringUtils.isAlphanu
[...]
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_is_alphanum">
<span><code><b>is_alphanum</b>(p: String) ⇒ Boolean </code></span> <span
class="fn-short-desc">Calls <a target="javadoc"
href="https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#isAlphanumeric-java.lang.CharSequence-"><code>StringUtils.isAlphan
[...]
is_alphanum("text123")
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_is_whitespace">
<span><code><b>is_whitespace</b>(p: String) ⇒ Boolean </code></span> <span
class="fn-short-desc">Calls <a target="javadoc"
href="http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#isWhitespace-java.lang.CharSequence-"><code>StringUtils.isWhite
[...]
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_is_whitespace">
<span><code><b>is_whitespace</b>(p: String) ⇒ Boolean </code></span> <span
class="fn-short-desc">Calls <a target="javadoc"
href="https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#isWhitespace-java.lang.CharSequence-"><code>StringUtils.isWhit
[...]
is_whitespace("text123")
// Result: true
is_whitespace(" ")
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_is_num"> <span><code><b>is_num</b>(p:
String) ⇒ Boolean </code></span> <span class="fn-short-desc">Calls <a
target="javadoc"
href="http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#isNumeric-java.lang.CharSequence-"><code>StringUtils.isNumeric()</code></a></
[...]
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_is_num"> <span><code><b>is_num</b>(p:
String) ⇒ Boolean </code></span> <span class="fn-short-desc">Calls <a
target="javadoc"
href="https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#isNumeric-java.lang.CharSequence-"><code>StringUtils.isNumeric()</code></a><
[...]
is_num("123")
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_is_numspace">
<span><code><b>is_numspace</b>(p: String) ⇒ Boolean </code></span> <span
class="fn-short-desc">Calls <a target="javadoc"
href="http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#isNumericSpace-java.lang.CharSequence-"><code>StringUtils.isNumeric
[...]
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_is_numspace">
<span><code><b>is_numspace</b>(p: String) ⇒ Boolean </code></span> <span
class="fn-short-desc">Calls <a target="javadoc"
href="https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#isNumericSpace-java.lang.CharSequence-"><code>StringUtils.isNumeri
[...]
is_numspace(" 123")
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_is_alphaspace">
<span><code><b>is_alphaspace</b>(p: String) ⇒ Boolean </code></span> <span
class="fn-short-desc">Calls <a target="javadoc"
href="http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#isAlphaSpace-java.lang.CharSequence-"><code>StringUtils.isAlpha
[...]
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_is_alphaspace">
<span><code><b>is_alphaspace</b>(p: String) ⇒ Boolean </code></span> <span
class="fn-short-desc">Calls <a target="javadoc"
href="https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#isAlphaSpace-java.lang.CharSequence-"><code>StringUtils.isAlph
[...]
is_alphaspace(" text ")
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_is_alphanumspace">
<span><code><b>is_alphanumspace</b>(p: String) ⇒ Boolean </code></span> <span
class="fn-short-desc">Calls <a target="javadoc"
href="http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#isAlphaNumericSpace-java.lang.CharSequence-"><code>String
[...]
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_is_alphanumspace">
<span><code><b>is_alphanumspace</b>(p: String) ⇒ Boolean </code></span> <span
class="fn-short-desc">Calls <a target="javadoc"
href="https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#isAlphaNumericSpace-java.lang.CharSequence-"><code>Strin
[...]
is_alphanumspace(" 123 text ")
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_split"> <span><code><b>split</b>(p1:
String, p2: String) ⇒ List[String] </code></span> <span
class="fn-short-desc">Calls <code><b>p1</b></code>.<a target="javadoc"
href="https://docs.oracle.com/en/java/javase/15/docs/api/java.base/java/lang/String.html#split(java.lang.String)"><code>split(<b>p2</b>)</co
[...]
split("a|b|c", "|")
@@ -367,10 +383,10 @@ cbrt(-27.0)
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_square"> <span><code><b>square</b>(x:
{Long|Double}) ⇒ {Long|Double} </code></span> <span
class="fn-short-desc">Returns square of <code>><b>x</b></code></span>
</button></h2></div><div id="fn_square" class="collapse"
data-parent="#math_fns"><div class="card-body"><p class="fn-desc">
<em>Description:</em [...]
square(2)
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_log1p"> <span><code><b>log1p</b>(d:
Double) ⇒ Double </code></span> <span class="fn-short-desc">Calls <a
target="javadoc"
href="https://docs.oracle.com/en/java/javase/15/docs/api/java.base/java/lang/Math.html#log1p(double)"><code>Math.log1p(<b>d</b>)</code></a></span>
</button></h2></div><div id="fn_log [...]
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_pi"> <span><code><b>pi</b>() ⇒ Double
</code></span> <span class="fn-short-desc">Returns PI constant</span>
</button></h2></div><div id="fn_pi" class="collapse"
data-parent="#math_fns"><div class="card-body"><p class="fn-desc">
<em>Description:</em><br> Returns PI constant.</p><p class="fn-usage"> <em>U
[...]
-pi()
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_euler"> <span><code><b>pi</b>() ⇒
Double </code></span> <span class="fn-short-desc">Returns Euler constant</span>
</button></h2></div><div id="fn_euler" class="collapse"
data-parent="#math_fns"><div class="card-body"><p class="fn-desc">
<em>Description:</em><br> Returns Euler constant.</p><p class="fn-u [...]
-euler()
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_pi"> <span><code><b>pi</b> ⇒ Double
</code></span> <span class="fn-short-desc">Returns PI constant</span>
</button></h2></div><div id="fn_pi" class="collapse"
data-parent="#math_fns"><div class="card-body"><p class="fn-desc">
<em>Description:</em><br> Returns PI constant.</p><p class="fn-usage"> <em>Usa
[...]
+pi
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_euler"> <span><code><b>pi</b> ⇒ Double
</code></span> <span class="fn-short-desc">Returns Euler constant</span>
</button></h2></div><div id="fn_euler" class="collapse"
data-parent="#math_fns"><div class="card-body"><p class="fn-desc">
<em>Description:</em><br> Returns Euler constant.</p><p class="fn-usa [...]
+euler
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_max"> <span><code><b>max</b>(c: List) ⇒
Any </code></span> <span class="fn-short-desc">Returns maximum value for given
list</span> </button></h2></div><div id="fn_max" class="collapse"
data-parent="#math_fns"><div class="card-body"><p class="fn-desc">
<em>Description:</em><br> Returns maximum value for [...]
max(list(1, 2, 3))
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_min"> <span><code><b>min</b>(c: List) ⇒
Any </code></span> <span class="fn-short-desc">Returns minimum value for given
list</span> </button></h2></div><div id="fn_min" class="collapse"
data-parent="#math_fns"><div class="card-body"><p class="fn-desc">
<em>Description:</em><br> Returns minimum value for [...]
@@ -384,7 +400,7 @@ stdev(list("1.0", 2, "3"))
pow(2.0, 2.0)
</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_hypot"> <span><code><b>hypot</b>(d1:
Double, d2: Double) ⇒ Double </code></span> <span class="fn-short-desc">Calls
<a target="javadoc"
href="https://docs.oracle.com/en/java/javase/15/docs/api/java.base/java/lang/Math.html#hypot(double,
double)"><code>Math.hypot(<b>d2</b>, <b>d2</b>)</code></a></span> </ [...]
</pre></div></div></div></div></div><div class="tab-pane fade show"
id="fn_collection" role="tabpanel"><div class="accordion"
id="collections_fns"><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_list"> <span><code><b>list</b>(t:
Any...<em><sub>opt</sub></em>) ⇒ List[Any] </code></span> <span
class="fn-short-desc">Returns new list with given parameters</span>
</button></h2>< [...]
-list()
+list
// Result: [1, 2, 3]
list(1, 2, 3)
// Result: ["1", true, 1.25]
@@ -445,68 +461,68 @@ meta_frag('my:prop')
meta_sys('java.home')
// Result: 'HOME' environment variable.
meta_sys('HOME')
-</pre></div></div></div></div></div><div class="tab-pane fade show"
id="fn_datetime" role="tabpanel"><div class="accordion" id="datetime_fns"><div
class="card"><div class="card-header"><h2 class="mb-0"> <button class="btn
btn-link btn-block text-left" type="button" data-toggle="collapse"
data-target="#fn_year"> <span><code><b>year</b>() ⇒ Long </code></span> <span
class="fn-short-desc">Returns current year</span> </button></h2></div><div
id="fn_year" class="collapse" data-parent="#dateti [...]
-year()
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_month"> <span><code><b>month</b>() ⇒
Long </code></span> <span class="fn-short-desc">Returns current month: 1 ... 12
</span> </button></h2></div><div id="fn_month" class="collapse"
data-parent="#datetime_fns"><div class="card-body"><p class="fn-desc">
<em>Description:</em><br> Returns current month: 1 . [...]
-month()
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_day_of_month">
<span><code><b>day_of_month</b>() ⇒ Long </code></span> <span
class="fn-short-desc">Returns current day of the month: 1 ... 31 </span>
</button></h2></div><div id="fn_day_of_month" class="collapse"
data-parent="#datetime_fns"><div class="card-body"><p class="fn-desc">
<em>Description:</em [...]
-day_of_month()
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_day_of_week">
<span><code><b>day_of_week</b>() ⇒ Long </code></span> <span
class="fn-short-desc">Returns current day of the week: 1 ... 7 </span>
</button></h2></div><div id="fn_day_of_week" class="collapse"
data-parent="#datetime_fns"><div class="card-body"><p class="fn-desc">
<em>Description:</em><br> [...]
-day_of_week()
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_day_of_year">
<span><code><b>day_of_year</b>() ⇒ Long </code></span> <span
class="fn-short-desc">Returns current day of the year: 1 ... 365 </span>
</button></h2></div><div id="fn_day_of_year" class="collapse"
data-parent="#datetime_fns"><div class="card-body"><p class="fn-desc">
<em>Description:</em><b [...]
-day_of_year()
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_hour"> <span><code><b>hour</b>() ⇒ Long
</code></span> <span class="fn-short-desc">Returns current hour: 0 ... 23
</span> </button></h2></div><div id="fn_hour" class="collapse"
data-parent="#datetime_fns"><div class="card-body"><p class="fn-desc">
<em>Description:</em><br> Returns current hour: 0 ... 23 [...]
-hour()
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_minute"> <span><code><b>minute</b>() ⇒
Long </code></span> <span class="fn-short-desc">Returns current minute: 0 ...
59 </span> </button></h2></div><div id="fn_minute" class="collapse"
data-parent="#datetime_fns"><div class="card-body"><p class="fn-desc">
<em>Description:</em><br> Returns current minute [...]
-minute()
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_second"> <span><code><b>second</b>() ⇒
Long </code></span> <span class="fn-short-desc">Returns current second: 0 ...
59 </span> </button></h2></div><div id="fn_second" class="collapse"
data-parent="#datetime_fns"><div class="card-body"><p class="fn-desc">
<em>Description:</em><br> Returns current second [...]
-second()
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_week_of_month">
<span><code><b>week_of_month</b>() ⇒ Long </code></span> <span
class="fn-short-desc">Returns current week of the month: 1 ... 4 </span>
</button></h2></div><div id="fn_week_of_month" class="collapse"
data-parent="#datetime_fns"><div class="card-body"><p class="fn-desc">
<em>Description:< [...]
-week_of_month()
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_week_of_year">
<span><code><b>week_of_year</b>() ⇒ Long </code></span> <span
class="fn-short-desc">Returns current week of the year: 1 ... 56 </span>
</button></h2></div><div id="fn_week_of_year" class="collapse"
data-parent="#datetime_fns"><div class="card-body"><p class="fn-desc">
<em>Description:</em [...]
-week_of_year()
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_quarter"> <span><code><b>quarter</b>()
⇒ Long </code></span> <span class="fn-short-desc">Returns current quarter: 1
...4 </span> </button></h2></div><div id="fn_quarter" class="collapse"
data-parent="#datetime_fns"><div class="card-body"><p class="fn-desc">
<em>Description:</em><br> Returns current quar [...]
-quarter()
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_now"> <span><code><b>now</b>() ⇒ Long
</code></span> <span class="fn-short-desc">Returns current time in milliseconds
</span> </button></h2></div><div id="fn_now" class="collapse"
data-parent="#datetime_fns"><div class="card-body"><p class="fn-desc">
<em>Description:</em><br> Returns current time in mil [...]
-now()
-</pre></div></div></div></div></div><div class="tab-pane fade show"
id="fn_req" role="tabpanel"><div class="accordion" id="req_fns"><div
class="card"><div class="card-header"><h2 class="mb-0"> <button class="btn
btn-link btn-block text-left" type="button" data-toggle="collapse"
data-target="#fn_req_id"> <span><code><b>req_id</b>() ⇒ String </code></span>
<span class="fn-short-desc">Returns <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCRequest.html#ge [...]
-req_id()
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_req_normtext">
<span><code><b>req_normtext</b>() ⇒ String </code></span> <span
class="fn-short-desc">Returns request <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCRequest.html#getNormalizedText()">normalied
text</a></span> </button></h2></div><div id="fn_req_normtex [...]
-req_normtext()
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_req_tstamp">
<span><code><b>req_tstamp</b>() ⇒ Long </code></span> <span
class="fn-short-desc">Gets UTC/GMT receive <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCRequest.html#getNormalizedText()">timestamp</a></span>
</button></h2></div><div id="fn_req_tstamp" class [...]
-req_tstamp()
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_req_addr">
<span><code><b>req_addr</b>() ⇒ String </code></span> <span
class="fn-short-desc">Gets remote client <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCRequest.html#getRemoteAddress()">address</a></span>
</button></h2></div><div id="fn_req_addr" class="collaps [...]
-req_addr()
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_req_agent">
<span><code><b>req_agent</b>() ⇒ String </code></span> <span
class="fn-short-desc">Gets remote client <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCRequest.html#getClientAgent()">agent</a></span>
</button></h2></div><div id="fn_req_agent" class="collapse [...]
-req_agent()
-</pre></div></div></div></div></div><div class="tab-pane fade show"
id="fn_user" role="tabpanel"><div class="accordion" id="user_fns"><div
class="card"><div class="card-header"><h2 class="mb-0"> <button class="btn
btn-link btn-block text-left" type="button" data-toggle="collapse"
data-target="#fn_user_id"> <span><code><b>user_id</b>() ⇒ String </code></span>
<span class="fn-short-desc">Returns <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCUser.html#g [...]
-user_id()
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_user_fname">
<span><code><b>user_fname</b>() ⇒ String </code></span> <span
class="fn-short-desc">Returns <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCUser.html#getFirstName()">user
first name</a></span> </button></h2></div><div id="fn_user_fname"
class="collapse" d [...]
-user_fname()
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_user_lname">
<span><code><b>user_lname</b>() ⇒ String </code></span> <span
class="fn-short-desc">Returns <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCUser.html#getLastName()">user
last name</a></span> </button></h2></div><div id="fn_user_lname"
class="collapse" dat [...]
-user_lname()
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_user_email">
<span><code><b>user_email</b>() ⇒ String </code></span> <span
class="fn-short-desc">Returns <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCUser.html#getEmail()">user
email</a></span> </button></h2></div><div id="fn_user_email" class="collapse"
data-paren [...]
-user_email()
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_user_admin">
<span><code><b>user_admin</b>() ⇒ Boolean </code></span> <span
class="fn-short-desc">Returns <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCUser.html#isAdmin()">user
admin</a> flag</span> </button></h2></div><div id="fn_user_admin"
class="collapse" data- [...]
-user_admin()
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_user_signup_tstamp">
<span><code><b>user_signup_tstamp</b>() ⇒ Long </code></span> <span
class="fn-short-desc">Returns <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCUser.html#getSignupTimestamp()">user
signup timestamp</a></span> </button></h2></div><div id="fn_user [...]
-user_signup_tstamp()
-</pre></div></div></div></div></div><div class="tab-pane fade show"
id="fn_company" role="tabpanel"><div class="accordion" id="company_fns"><div
class="card"><div class="card-header"><h2 class="mb-0"> <button class="btn
btn-link btn-block text-left" type="button" data-toggle="collapse"
data-target="#fn_comp_id"> <span><code><b>comp_id</b>() ⇒ String </code></span>
<span class="fn-short-desc">Returns <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCCompa [...]
-comp_id()
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_comp_name">
<span><code><b>comp_name</b>() ⇒ String </code></span> <span
class="fn-short-desc">Returns <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCCompany.html#getName()">company
name</a></span> </button></h2></div><div id="fn_comp_name" class="collapse"
data-pare [...]
-comp_name()
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_comp_website">
<span><code><b>comp_website</b>() ⇒ String </code></span> <span
class="fn-short-desc">Returns <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCCompany.html#getWebsite()">company
website</a></span> </button></h2></div><div id="fn_comp_website" class="coll
[...]
-comp_website()
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_comp_country">
<span><code><b>comp_country</b>() ⇒ String </code></span> <span
class="fn-short-desc">Returns <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCCompany.html#getCountry()">company
country</a></span> </button></h2></div><div id="fn_comp_country" class="coll
[...]
-comp_country()
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_comp_region">
<span><code><b>comp_region</b>() ⇒ String </code></span> <span
class="fn-short-desc">Returns <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCCompany.html#getRegion()">company
region</a></span> </button></h2></div><div id="fn_comp_region"
class="collapse" [...]
-comp_region()
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_comp_city">
<span><code><b>comp_city</b>() ⇒ String </code></span> <span
class="fn-short-desc">Returns <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCCompany.html#getCity()">company
city</a></span> </button></h2></div><div id="fn_comp_city" class="collapse"
data-pare [...]
-comp_city()
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_comp_addr">
<span><code><b>comp_addr</b>() ⇒ String </code></span> <span
class="fn-short-desc">Returns <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCCompany.html#getAddress()">company
address</a></span> </button></h2></div><div id="fn_comp_addr" class="collapse"
dat [...]
-comp_addr()
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_comp_postcode">
<span><code><b>comp_postcode</b>() ⇒ String </code></span> <span
class="fn-short-desc">Returns <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCCompany.html#getPostalCode()">company
postal code</a></span> </button></h2></div><div id="fn_comp_postcode" c [...]
-comp_postcode()
+</pre></div></div></div></div></div><div class="tab-pane fade show"
id="fn_datetime" role="tabpanel"><div class="accordion" id="datetime_fns"><div
class="card"><div class="card-header"><h2 class="mb-0"> <button class="btn
btn-link btn-block text-left" type="button" data-toggle="collapse"
data-target="#fn_year"> <span><code><b>year</b> ⇒ Long </code></span> <span
class="fn-short-desc">Returns current year</span> </button></h2></div><div
id="fn_year" class="collapse" data-parent="#datetime [...]
+year
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_month"> <span><code><b>month</b> ⇒ Long
</code></span> <span class="fn-short-desc">Returns current month: 1 ... 12
</span> </button></h2></div><div id="fn_month" class="collapse"
data-parent="#datetime_fns"><div class="card-body"><p class="fn-desc">
<em>Description:</em><br> Returns current month: 1 ... [...]
+month
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_day_of_month">
<span><code><b>day_of_month</b> ⇒ Long </code></span> <span
class="fn-short-desc">Returns current day of the month: 1 ... 31 </span>
</button></h2></div><div id="fn_day_of_month" class="collapse"
data-parent="#datetime_fns"><div class="card-body"><p class="fn-desc">
<em>Description:</em>< [...]
+day_of_month
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_day_of_week">
<span><code><b>day_of_week</b> ⇒ Long </code></span> <span
class="fn-short-desc">Returns current day of the week: 1 ... 7 </span>
</button></h2></div><div id="fn_day_of_week" class="collapse"
data-parent="#datetime_fns"><div class="card-body"><p class="fn-desc">
<em>Description:</em><br> R [...]
+day_of_week
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_day_of_year">
<span><code><b>day_of_year</b> ⇒ Long </code></span> <span
class="fn-short-desc">Returns current day of the year: 1 ... 365 </span>
</button></h2></div><div id="fn_day_of_year" class="collapse"
data-parent="#datetime_fns"><div class="card-body"><p class="fn-desc">
<em>Description:</em><br> [...]
+day_of_year
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_hour"> <span><code><b>hour</b> ⇒ Long
</code></span> <span class="fn-short-desc">Returns current hour: 0 ... 23
</span> </button></h2></div><div id="fn_hour" class="collapse"
data-parent="#datetime_fns"><div class="card-body"><p class="fn-desc">
<em>Description:</em><br> Returns current hour: 0 ... 23.< [...]
+hour
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_minute"> <span><code><b>minute</b> ⇒
Long </code></span> <span class="fn-short-desc">Returns current minute: 0 ...
59 </span> </button></h2></div><div id="fn_minute" class="collapse"
data-parent="#datetime_fns"><div class="card-body"><p class="fn-desc">
<em>Description:</em><br> Returns current minute: [...]
+minute
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_second"> <span><code><b>second</b> ⇒
Long </code></span> <span class="fn-short-desc">Returns current second: 0 ...
59 </span> </button></h2></div><div id="fn_second" class="collapse"
data-parent="#datetime_fns"><div class="card-body"><p class="fn-desc">
<em>Description:</em><br> Returns current second: [...]
+second
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_week_of_month">
<span><code><b>week_of_month</b> ⇒ Long </code></span> <span
class="fn-short-desc">Returns current week of the month: 1 ... 4 </span>
</button></h2></div><div id="fn_week_of_month" class="collapse"
data-parent="#datetime_fns"><div class="card-body"><p class="fn-desc">
<em>Description:</e [...]
+week_of_month
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_week_of_year">
<span><code><b>week_of_year</b> ⇒ Long </code></span> <span
class="fn-short-desc">Returns current week of the year: 1 ... 56 </span>
</button></h2></div><div id="fn_week_of_year" class="collapse"
data-parent="#datetime_fns"><div class="card-body"><p class="fn-desc">
<em>Description:</em>< [...]
+week_of_year
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_quarter"> <span><code><b>quarter</b> ⇒
Long </code></span> <span class="fn-short-desc">Returns current quarter: 1 ...4
</span> </button></h2></div><div id="fn_quarter" class="collapse"
data-parent="#datetime_fns"><div class="card-body"><p class="fn-desc">
<em>Description:</em><br> Returns current quarte [...]
+quarter
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_now"> <span><code><b>now</b> ⇒ Long
</code></span> <span class="fn-short-desc">Returns current time in milliseconds
</span> </button></h2></div><div id="fn_now" class="collapse"
data-parent="#datetime_fns"><div class="card-body"><p class="fn-desc">
<em>Description:</em><br> Returns current time in milli [...]
+now
+</pre></div></div></div></div></div><div class="tab-pane fade show"
id="fn_req" role="tabpanel"><div class="accordion" id="req_fns"><div
class="card"><div class="card-header"><h2 class="mb-0"> <button class="btn
btn-link btn-block text-left" type="button" data-toggle="collapse"
data-target="#fn_req_id"> <span><code><b>req_id</b> ⇒ String </code></span>
<span class="fn-short-desc">Returns <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCRequest.html#getS [...]
+req_id
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_req_normtext">
<span><code><b>req_normtext</b> ⇒ String </code></span> <span
class="fn-short-desc">Returns request <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCRequest.html#getNormalizedText()">normalied
text</a></span> </button></h2></div><div id="fn_req_normtext" [...]
+req_normtext
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_req_tstamp">
<span><code><b>req_tstamp</b> ⇒ Long </code></span> <span
class="fn-short-desc">Gets UTC/GMT receive <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCRequest.html#getNormalizedText()">timestamp</a></span>
</button></h2></div><div id="fn_req_tstamp" class=" [...]
+req_tstamp
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_req_addr"> <span><code><b>req_addr</b>
⇒ String </code></span> <span class="fn-short-desc">Gets remote client <a
class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCRequest.html#getRemoteAddress()">address</a></span>
</button></h2></div><div id="fn_req_addr" class="collapse" [...]
+req_addr
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_req_agent">
<span><code><b>req_agent</b> ⇒ String </code></span> <span
class="fn-short-desc">Gets remote client <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCRequest.html#getClientAgent()">agent</a></span>
</button></h2></div><div id="fn_req_agent" class="collapse" [...]
+req_agent
+</pre></div></div></div></div></div><div class="tab-pane fade show"
id="fn_user" role="tabpanel"><div class="accordion" id="user_fns"><div
class="card"><div class="card-header"><h2 class="mb-0"> <button class="btn
btn-link btn-block text-left" type="button" data-toggle="collapse"
data-target="#fn_user_id"> <span><code><b>user_id</b> ⇒ String </code></span>
<span class="fn-short-desc">Returns <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCUser.html#get [...]
+user_id
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_user_fname">
<span><code><b>user_fname</b> ⇒ String </code></span> <span
class="fn-short-desc">Returns <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCUser.html#getFirstName()">user
first name</a></span> </button></h2></div><div id="fn_user_fname"
class="collapse" dat [...]
+user_fname
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_user_lname">
<span><code><b>user_lname</b> ⇒ String </code></span> <span
class="fn-short-desc">Returns <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCUser.html#getLastName()">user
last name</a></span> </button></h2></div><div id="fn_user_lname"
class="collapse" data- [...]
+user_lname
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_user_email">
<span><code><b>user_email</b> ⇒ String </code></span> <span
class="fn-short-desc">Returns <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCUser.html#getEmail()">user
email</a></span> </button></h2></div><div id="fn_user_email" class="collapse"
data-parent= [...]
+user_email
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_user_admin">
<span><code><b>user_admin</b> ⇒ Boolean </code></span> <span
class="fn-short-desc">Returns <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCUser.html#isAdmin()">user
admin</a> flag</span> </button></h2></div><div id="fn_user_admin"
class="collapse" data-pa [...]
+user_admin
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_user_signup_tstamp">
<span><code><b>user_signup_tstamp</b> ⇒ Long </code></span> <span
class="fn-short-desc">Returns <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCUser.html#getSignupTimestamp()">user
signup timestamp</a></span> </button></h2></div><div id="fn_user_s [...]
+user_signup_tstamp
+</pre></div></div></div></div></div><div class="tab-pane fade show"
id="fn_company" role="tabpanel"><div class="accordion" id="company_fns"><div
class="card"><div class="card-header"><h2 class="mb-0"> <button class="btn
btn-link btn-block text-left" type="button" data-toggle="collapse"
data-target="#fn_comp_id"> <span><code><b>comp_id</b> ⇒ String </code></span>
<span class="fn-short-desc">Returns <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCCompany [...]
+comp_id
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_comp_name">
<span><code><b>comp_name</b> ⇒ String </code></span> <span
class="fn-short-desc">Returns <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCCompany.html#getName()">company
name</a></span> </button></h2></div><div id="fn_comp_name" class="collapse"
data-parent [...]
+comp_name
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_comp_website">
<span><code><b>comp_website</b> ⇒ String </code></span> <span
class="fn-short-desc">Returns <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCCompany.html#getWebsite()">company
website</a></span> </button></h2></div><div id="fn_comp_website" class="collap
[...]
+comp_website
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_comp_country">
<span><code><b>comp_country</b> ⇒ String </code></span> <span
class="fn-short-desc">Returns <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCCompany.html#getCountry()">company
country</a></span> </button></h2></div><div id="fn_comp_country" class="collap
[...]
+comp_country
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_comp_region">
<span><code><b>comp_region</b> ⇒ String </code></span> <span
class="fn-short-desc">Returns <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCCompany.html#getRegion()">company
region</a></span> </button></h2></div><div id="fn_comp_region"
class="collapse" d [...]
+comp_region
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_comp_city">
<span><code><b>comp_city</b> ⇒ String </code></span> <span
class="fn-short-desc">Returns <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCCompany.html#getCity()">company
city</a></span> </button></h2></div><div id="fn_comp_city" class="collapse"
data-parent [...]
+comp_city
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_comp_addr">
<span><code><b>comp_addr</b> ⇒ String </code></span> <span
class="fn-short-desc">Returns <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCCompany.html#getAddress()">company
address</a></span> </button></h2></div><div id="fn_comp_addr" class="collapse"
data- [...]
+comp_addr
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_comp_postcode">
<span><code><b>comp_postcode</b> ⇒ String </code></span> <span
class="fn-short-desc">Returns <a class="not-code" target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCCompany.html#getPostalCode()">company
postal code</a></span> </button></h2></div><div id="fn_comp_postcode" cla [...]
+comp_postcode
</pre></div></div></div></div></div><div class="tab-pane fade show"
id="fn_other" role="tabpanel"><div class="accordion" id="other_fns"><div
class="card"><div class="card-header"><h2 class="mb-0"> <button class="btn
btn-link btn-block text-left" type="button" data-toggle="collapse"
data-target="#fn_if"> <span><code><b>if</b>(c: Boolean, then: Any: else: Any) ⇒
Any </code></span> <span class="fn-short-desc">This function provides
'if-then-else' equivalent</span> </button></h2></div><div i [...]
// - 'list(1, 2, 3)' if 1st parameter is 'true'.
// - 'null' if 1st parameter is 'false'.
@@ -517,12 +533,12 @@ json('{"a": 2, "b": [1, 2, 3]}')
to_string(1.25)
// Result: list("1", "2", "3")
to_string(list(1, 2, 3))
-</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_or_else"> <span><code><b>or_else</b>(p:
Any, a: Any) ⇒ Any </code></span> <span class="fn-short-desc">Returns
<code><b>p</b></code> if it is not <code>null</code>, <code><b>a</b></code>
otherwise</span> </button></h2></div><div id="fn_or_else" class="collapse"
data-parent="#other_fns"><div class="card-b [...]
+</pre></div></div></div><div class="card"><div class="card-header"><h2
class="mb-0"> <button class="btn btn-link btn-block text-left" type="button"
data-toggle="collapse" data-target="#fn_or_else"> <span><code><b>or_else</b>(p:
Any, a: Any) ⇒ Any </code></span> <span class="fn-short-desc">Returns
<code><b>p</b></code> if it is not <code>null</code>, <code><b>a</b></code>
otherwise</span> </button></h2></div><div id="fn_or_else" class="collapse"
data-parent="#other_fns"><div class="card-b [...]
@dflt = 'text'
or_else(meta_model('some_prop'), @dflt)
</pre></div></div></div></div></div></div></section><section id="idl_location"
><h2 class="section-title">IDL Location <a href="#"><i class="top-link fas
fa-fw fa-angle-double-up"></i></a></h2><p> IDL declarations can be placed in
different locations based on user preferences:</p><ul><li><p> <a
target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCIntent.html">@NCIntent</a>
annotation takes a string as its parameter that should be a valid IDL
declaration. For example, Scala cod [...]
@NCIntent("import('/opt/myproj/global_fragments.idl')") //
Importing.
- @NCIntent("intent=act term(act)={has(tok_groups(), 'act')}
fragment(f1)") // Defining in place.
+ @NCIntent("intent=act term(act)={has(tok_groups, 'act')}
fragment(f1)") // Defining in place.
def onMatch(
@NCIntentTerm("act") actTok: NCToken,
@NCIntentTerm("loc") locToks: List[NCToken]
@@ -539,7 +555,7 @@ or_else(meta_model('some_prop'), @dflt)
"intents": [
"import('/opt/myproj/global_fragments.idl')", //
Importing.
"import('/opt/myproj/my_intents.idl')", // Importing.
- "intent=alarm term~{tok_id()=='x:alarm'}" // Defining
in place.
+ "intent=alarm term~{#=='x:alarm'}" // Defining in
place.
]
}
</pre><li> External <code>*.idl</code> files contain IDL
declarations and can be imported in any other places where IDL declarations are
allowed. See <code>import()</code> statement explanation below. For
example:<pre class="brush: idl">
@@ -552,14 +568,14 @@ or_else(meta_model('some_prop'), @dflt)
// Fragments.
// ----------
- fragment=buzz term~{tok_id() == 'x:alarm'}
+ fragment=buzz term~{# == 'x:alarm'}
fragment=when
term(nums)~{
// Term variables.
@type = meta_tok('nlpcraft:num:unittype')
@iseq = meta_tok('nlpcraft:num:isequalcondition')
- tok_id() == 'nlpcraft:num' && @type != 'datetime'
&& @iseq == true
+ # == 'nlpcraft:num' && @type != 'datetime' &&
@iseq == true
}[0,7]
// Intents.
@@ -607,7 +623,7 @@ or_else(meta_model('some_prop'), @dflt)
}
],
"intents": [
- "intent=alarm term~{tok_id()=='x:alarm'}
term(nums)~{tok_id() == 'nlpcraft:num' && meta_tok('nlpcraft:num:unittype') ==
'datetime' && meta_tok('nlpcraft:num:isequalcondition') == true}[0,7]"
+ "intent=alarm term~{# == 'x:alarm'} term(nums)~{# ==
'nlpcraft:num' && meta_tok('nlpcraft:num:unittype') == 'datetime' &&
meta_tok('nlpcraft:num:isequalcondition') == true}[0,7]"
]
}
</pre><pre class="brush: java, highlight: [1]">
@@ -639,10 +655,10 @@ or_else(meta_model('some_prop'), @dflt)
}
],
</pre><p> All of these elements will be detected but since two
of them are overlapping (<code>elm1</code> and <code>elm2</code>) there should
be <b>two</b> parsing variants at the output of this
step:</p><ol><li><code>elm1</code>('A', 'B') <code>freeword</code>('C')
<code>elm3</code>('D')<li><code>freeword</code>('A') <code>elm2</code>('B',
'C') <code>elm3</code>('D')</ol><p></p><p> Note that at this point the
<em>system cannot determine which of these variants is the bes [...]
- @NCIntent("intent=id term(termId)~{tok_id() == 'my_token'}?")
+ @NCIntent("intent=id term(termId)~{# == 'my_token'}?")
private NCResult onMatch(
@NCIntentTerm("termId") Optional<NCToken> myTok
) {
...
}
- </pre><p><b>NOTES:</b></p><ul><li> Conversational term
<code>termId</code> has <code>[0,1]</code> quantifier (it's optional).<li> The
formal parameter on the callback has a type of
<code>Optional<NCToken></code> because the term's quantifier is
<code>[0,1]</code>.<li> Note that callback doesn't have an optional <a
target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCIntentMatch.html">NCIntentMatch</a>
parameter.</ul><h2 class="section-sub-title"><code>NCRejection [...]
+ </pre><p><b>NOTES:</b></p><ul><li> Conversational term
<code>termId</code> has <code>[0,1]</code> quantifier (it's optional).<li> The
formal parameter on the callback has a type of
<code>Optional<NCToken></code> because the term's quantifier is
<code>[0,1]</code>.<li> Note that callback doesn't have an optional <a
target="javadoc"
href="/apis/latest/org/apache/nlpcraft/model/NCIntentMatch.html">NCIntentMatch</a>
parameter.</ul><h2 class="section-sub-title"><code>NCRejection [...]
diff --git a/short-term-memory.html b/short-term-memory.html
index 1fe15ec..4162537 100644
--- a/short-term-memory.html
+++ b/short-term-memory.html
@@ -15,4 +15,4 @@
limitations under the License.
-->
-<!doctype html><html lang="en"> <script async
src="https://www.googletagmanager.com/gtag/js?id=UA-180663034-1"></script>
<script> window.dataLayer = window.dataLayer || []; function
gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config',
'UA-180663034-1'); </script><meta charset="utf-8"><meta
http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport"
content="width=device-width, initial-scale=1, shrink-to-fit=no"><meta
name="description" content="An open sourc [...]
+<!doctype html><html lang="en"> <script async
src="https://www.googletagmanager.com/gtag/js?id=UA-180663034-1"></script>
<script> window.dataLayer = window.dataLayer || []; function
gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config',
'UA-180663034-1'); </script><meta charset="utf-8"><meta
http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport"
content="width=device-width, initial-scale=1, shrink-to-fit=no"><meta
name="description" content="An open sourc [...]