WIP.
diff --git a/api-review.html b/api-review.html
index 82407ad..4043395 100644
--- a/api-review.html
+++ b/api-review.html
@@ -74,14 +74,140 @@
<code>Pipeline</code> can be based on standard and custom user defined components.
</li>
</ul>
+ </section>
+
+ <section id="model">
+ <h2 class="section-title">Model overview<a href="#"><i class="top-link fas fa-fw fa-angle-double-up"></i></a></h2>
+ <p>
+ Let's start with terminology and describe work workflow.
+ </p>
+
+ <ul>
+ <li>
+ <code>Token</code> represented as <a href="apis/latest/org/apache/nlpcraft/NCToken.html">NCToken</a>.
+ It is simple string, part of user input, which split according to some rules,
+ for instance by spaces and some additional conditions, which depends on language and some expectations.
+ So user input "<b>Where is it?</b>" contains four tokens: "<b>Where</b>", "<b>is</b>", "<b>it</b>", "<b>?</b>".
+ Usually <code>tokens</code>are words and punctuation symbols which can also contain some additional
+ information like point of speech etc.
+ Tokens data are input for searching <code>entities</code>.
+ </li>
+ <li>
+ <code>Entity</code> represented as <a href="apis/latest/org/apache/nlpcraft/NCEntity.html">NCEntity</a>.
+ According to wikipedia, named entity is a real-world object, such as a person, location, organization,
+ product, etc., that can be denoted with a proper name. It can be abstract or have a physical existence.
+ Each entity can contain one or more tokens.
+ Entities data are input for searching <a href="intent-matching.html">Intent matching</a> conditions.
+ </li>
+ <li>
+ <code>Variant</code> represented as <a href="apis/latest/org/apache/nlpcraft/NCVariant.html">NCVariant</a>.
+ List of entities. Potentially, each token can be recognized as different entities,
+ so user input can be processed as set of variants.
+ For example user input "Mercedes" can be processed as 2 variants,
+ both of them contains single element list of entities: car brand or Spanish family name.
+ When words are not overlapped with different <code>entities</code> there is only one
+ <code>variant</code> detected.
+ </li>
+ </ul>
<p>
- <b>Base client methods:</b>
+ <code>Model</code> must be able to do tree following things:
+ </p>
+
+ <ul>
+ <li>
+ Parse user input text as the <code>tokens</code>.
+ They are input for searching <code>name entities</code>.
+ Tokens parsing components should be included into <a href="#model-pipeline">Model pipeline</a>.
+ </li>
+ <li>
+ Find <code>name entities</code> based on these parsed tokens.
+ <code>name entities</code>.
+ They are input for searching <code>intents</code>.
+ Entity parsing components should be included into <a href="#model-pipeline">Model pipeline</a>.
+ </li>
+ <li>
+ Prepare callback methods which contain business logic
+ and rules for matching user requests on them.
+ These callbacks with their rules and named as <code>intents</code>.
+ These matched callback methods execution with parameters extracted from user text input and
+ these execution results returned to user as answer on his request.
+ These callbacks methods should be defined in the model or model should have reference in them.
+ It will be described below.
+ </li>
+ </ul>
+
+ <p>
+ Let's prepare the system which can call persons from your contact list.
+ Typical commands are: "Please call to John Smith" or "Connect me with Barbara Dillan".
+ This model should be able to recognize in user text following entities:
+ <code>command</code> and <code>person</code> to apply this command.
+ </p>
+
+ <ul>
+ <li>
+ Parsing split your input on tokens ["<code>please</code>", "<code>call</code>", "<code>to</code>", "<code>john</code>", "<code>smith</code>"]
+ </li>
+ <li>
+ By these tokens model should be able to found two named entities:
+ <ul>
+ <li>
+ <code>command</code> by token <code>call</code>.
+ </li>
+ <li>
+ <code>person</code> by tokens <code>john</code> and <code>smith</code>.
+ </li>
+ </ul>
+ </li>
+ <li>
+ Also intents should be prepared:
+ <pre class="brush: scala, highlight: [1, 2, 5, 6]">
+ @NCIntent("intent=call term(command)={# == command'} term(person)={# == 'person'}")
+ def onMatch(
+ ctx: NCContext,
+ im: NCIntentMatch,
+ @NCIntentTerm("command") command: NCEntity,
+ @NCIntentTerm("person") person: NCEntity
+ ): NCResult = ...
+ </pre>
+
+ <ul>
+ <li>
+ <code>Line 1</code> defines intent <code>ls</code> with two conditions.
+ </li>
+ <li>
+ <code>Line 2</code> defines related callback method.
+ </li>
+ <li>
+ <code>Lines 4 and 5</code> define two callback method's arguments which are corresponded to
+ <code>call</code> intent conditions. You can extract normalized value
+ <code>john smith</code> from the <code>person</code> parameter and use in the method body.
+ </li>
+ </ul>
+
+ <p>
+ Note that there are a lot of options of defining intents and their callback methods.
+ They can be defined in configuration files, nested classes, etc.
+ Look at the chapter <a href="intent-matching.html">Intent Matching</a> content for get more details.
+ </p>
+ </li>
+ </ul>
+
+ </section>
+
+ <section id="client">
+ <h2 class="section-title">Client overview<a href="#"><i class="top-link fas fa-fw fa-angle-double-up"></i></a></h2>
+
+ <p>
+ Base client methods:
</p>
<ul>
<li>
- <code>ask()</code> passes user text input to the model and receives back triggered callback method execution result or
+ <code>ask()</code> passes user text input to the model and receives back execution
+ <a href="apis/latest/org/apache/nlpcraft/NCResult.html">NCResult</a> or
rejection exception if there isn't any triggered intents.
+ <a href="apis/latest/org/apache/nlpcraft/NCResult.html">NCResult</a> is wrapper on
+ callback method execution result with additional information.
</li>
<li>
<code>debugAsk()</code> passes user text input to the model and receives back callback and its parameters or
@@ -133,38 +259,10 @@
<section id="model-pipeline">
<h2 class="section-title">Model pipeline <a href="#"><i class="top-link fas fa-fw fa-angle-double-up"></i></a></h2>
- <p>
- Before looking at <code>Pipeline</code> elements more throughly, let's start with terminology.
- </p>
-
- <ul>
- <li>
- <code>Token</code> represented as <a href="apis/latest/org/apache/nlpcraft/NCToken.html">NCToken</a>.
- It is simple string, part of user input, which split according to some rules, for instance by spaces and some additional conditions, which depends on language and some expectations.
- So user input "<b>Where is it?</b>" contains four tokens: "<b>Where</b>", "<b>is</b>", "<b>it</b>", "<b>?</b>".
- Tokens data are input for searching <code>entities</code>.
- </li>
- <li>
- <code>Entity</code> represented as <a href="apis/latest/org/apache/nlpcraft/NCEntity.html">NCEntity</a>.
- According to wikipedia, named entity is a real-world object, such as a person, location, organization,
- product, etc., that can be denoted with a proper name. It can be abstract or have a physical existence.
- Each entity can contain one or more tokens.
- Entities data are input for searching <a href="intent-matching.html">Intent matching</a> conditions.
- </li>
- <li>
- <code>Variant</code> represented as <a href="apis/latest/org/apache/nlpcraft/NCVariant.html">NCVariant</a>.
- List of entities. Potentially, each token can be recognized as different entities,
- so user input can be processed as set of variants.
- For example user input "Mercedes" can be processed as 2 variants,
- both of them contains single element list of entities: car brand or Spanish family name.
- When words are not overlapped with different <code>entities</code> there is only one
- <code>variant</code> detected.
- </li>
- </ul>
<p>
- Back to <code>pipeline</code> represented as <a href="apis/latest/org/apache/nlpcraft/NCPipeline.html">NCPipeline</a>.
- <code>Pipeline</code> should be created based in following components:
+ Model <code>Pipeline</code> is represented as <a href="apis/latest/org/apache/nlpcraft/NCPipeline.html">NCPipeline</a> and
+ contains following components:
</p>
<ul>
<li>
@@ -235,42 +333,6 @@
You can collect NlpCraft predefined components, write your own and easy reuse custom components.
</p>
</section>
- <section id="model-intents">
- <h2 class="section-title">Model intents and callbacks <a href="#"><i class="top-link fas fa-fw fa-angle-double-up"></i></a></h2>
-
- <p>
- Each model class should contain one or more callback methods which are mapped on their intents definitions.
- </p>
-
- <pre class="brush: scala, highlight: [1, 2, 4, 5]">
- @NCIntent("intent=ls term(act)={# == 'ls:on'} term(loc)={# == 'ls:loc'}*")
- def onMatch(
- ctx: NCContext,
- im: NCIntentMatch,
- @NCIntentTerm("act") act: NCEntity,
- @NCIntentTerm("loc") locs: List[NCEntity]
- ): NCResult = NCResult("OK")
- </pre>
-
- <ul>
- <li>
- <code>Line 1</code> defines intent <code>ls</code> with two conditions.
- </li>
- <li>
- <code>Line 2</code> defines related callback method.
- </li>
- <li>
- <code>Lines 4 and 5</code> define two callback method's arguments which are corresponded to
- <code>ls</code> intent conditions.
- </li>
- </ul>
-
- <p>
- Note that there are a lot of options of defining intents and their callback methods.
- They can be defined in configuration files, nested classes, etc.
- Look at the chapter <a href="intent-matching.html">Intent Matching</a> content for get more details.
- </p>
- </section>
<section id="model-behavior">
<h2 class="section-title">Model behavior overriding<a href="#"><i class="top-link fas fa-fw fa-angle-double-up"></i></a></h2>
@@ -302,9 +364,10 @@
<ul class="side-nav">
<li class="side-nav-title">On This Page</li>
<li><a href="#overview">Overview</a></li>
+ <li><a href="#model">Model overview</a></li>
+ <li><a href="#client">Client overview</a></li>
<li><a href="#model-configuration">Model configuration</a></li>
<li><a href="#model-pipeline">Model pipeline</a></li>
- <li><a href="#model-intents">Model intents and callbacks</a></li>
<li><a href="#model-behavior">Model behavior overriding</a></li>
{% include quick-links.html %}
</ul>