You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nlpcraft.apache.org by ar...@apache.org on 2022/02/19 18:53:11 UTC

[incubator-nlpcraft] branch master updated: WIP

This is an automated email from the ASF dual-hosted git repository.

aradzinski pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git


The following commit(s) were added to refs/heads/master by this push:
     new bc7a759  WIP
bc7a759 is described below

commit bc7a759219c571d06e178459ecf543bc5b3f7796
Author: Aaron Radzinski <ar...@datalingvo.com>
AuthorDate: Sat Feb 19 10:53:01 2022 -0800

    WIP
---
 .../nlpcraft/internal/intent/NCIDLEntity.scala     | 12 +++----
 .../nlpcraft/internal/intent/NCIDLTerm.scala       |  8 ++---
 .../intent/compiler/NCIDLCodeGenerator.scala       | 38 +++++++++++-----------
 .../intent/matcher/NCIntentSolverResult.scala      | 14 ++++----
 .../internal/intent/matcher/NCIntentsManager.scala | 28 +++++-----------
 5 files changed, 42 insertions(+), 58 deletions(-)

diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/NCIDLEntity.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/NCIDLEntity.scala
index 76f3c78..1cfbc7a 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/NCIDLEntity.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/NCIDLEntity.scala
@@ -22,12 +22,8 @@ import scala.jdk.CollectionConverters.*
 
 /**
   *
-  * @param ent
-  * @param idx
+  * @param impl
+  * @param index
   */
-class NCIDLEntity(ent: NCEntity, idx: Int):
-    private lazy val txt = ent.mkText()
-
-    def getImpl: NCEntity = ent
-    def getText: String = txt
-    def getIndex: Int = idx
+case class NCIDLEntity(impl: NCEntity, index: Int):
+    lazy val text: String = impl.mkText()
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/NCIDLTerm.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/NCIDLTerm.scala
index 9dbd6c4..ffd7a3e 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/NCIDLTerm.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/NCIDLTerm.scala
@@ -22,14 +22,14 @@ import org.apache.nlpcraft.*
 /**
   * IDL term.
   *
-  * @param idl
+  * @param idl IDL expression for this term.
   * @param id Optional ID of this term.
   * @param decls Term optional declarations.
   * @param pred Term predicate.
-  * @param min
-  * @param max
+  * @param min Min quantifier.
+  * @param max Max quantifier.
   * @param conv Whether or not this term support conversation context.
-  * @param fragMeta
+  * @param fragMeta Fragment metadata, if any.
   */
 case class NCIDLTerm(
     idl: String,
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/compiler/NCIDLCodeGenerator.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/compiler/NCIDLCodeGenerator.scala
index bb8e222..1f7bd91 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/compiler/NCIDLCodeGenerator.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/compiler/NCIDLCodeGenerator.scala
@@ -834,14 +834,14 @@ trait NCIDLCodeGenerator:
             val x = arg1()
             stack.push(() => {
                 val Z(arg, n) = x()
-                Z(idlCtx.entities.exists(t => t.getIndex > ent.getIndex && f(t, toStr(arg))), n)
+                Z(idlCtx.entities.exists(t => t.index > ent.index && f(t, toStr(arg))), n)
             })
 
         def doIsAfter(f: (NCIDLEntity, String) => Boolean): Unit =
             val x = arg1()
             stack.push(() => {
                 val Z(arg, n) = x()
-                Z(idlCtx.entities.exists(t => t.getIndex < ent.getIndex && f(t, toStr(arg))), n)
+                Z(idlCtx.entities.exists(t => t.index < ent.index && f(t, toStr(arg))), n)
             })
 
         def doIsBetween(f: (NCIDLEntity, String) => Boolean): Unit =
@@ -849,9 +849,9 @@ trait NCIDLCodeGenerator:
             stack.push(() => {
                 val (a1, a2, n) = extract2(x1, x2)
                 Z(
-                    idlCtx.entities.exists(t => t.getIndex < ent.getIndex && f(t, toStr(a1)))
+                    idlCtx.entities.exists(t => t.index < ent.index && f(t, toStr(a1)))
                     &&
-                    idlCtx.entities.exists(t => t.getIndex > ent.getIndex && f(t, toStr(a2)))
+                    idlCtx.entities.exists(t => t.index > ent.index && f(t, toStr(a2)))
                     ,
                     n
                 )
@@ -897,7 +897,7 @@ trait NCIDLCodeGenerator:
         try
             fun match
                 // Metadata access.
-                case "meta_ent" => z[ST](arg1, { x => val Z(v, _) = x(); Z(box(ent.getImpl.get[Object](toStr(v))), 0) })
+                case "meta_ent" => z[ST](arg1, { x => val Z(v, _) = x(); Z(box(ent.impl.get[Object](toStr(v))), 0) })
                 case "meta_cfg" => z[ST](arg1, { x => val Z(v, _) = x(); Z(box(idlCtx.mdlCfg.get[Object](toStr(v))), 0) })
                 case "meta_req" => z[ST](arg1, { x => val Z(v, _) = x(); Z(box(idlCtx.req.getRequestData.get(toStr(v))), 0) })
                 case "meta_intent" => z[ST](arg1, { x => val Z(v, _) = x(); Z(box(idlCtx.intentMeta.get(toStr(v)).orNull), 0) })
@@ -919,23 +919,23 @@ trait NCIDLCodeGenerator:
                 case "mdl_origin" => z0(() => Z(idlCtx.mdlCfg.getOrigin, 0))
 
                 // Entity functions.
-                case "ent_id" => arg1Tok() match { case x => stack.push(() => Z(toEntity(x().value).getImpl.getId, 1)) }
-                case "ent_index" => arg1Tok() match { case x => stack.push(() => Z(toEntity(x().value).getIndex, 1)) }
-                case "ent_text" => arg1Tok() match { case x => stack.push(() => Z(toEntity(x().value).getText, 1)) }
+                case "ent_id" => arg1Tok() match { case x => stack.push(() => Z(toEntity(x().value).impl.getId, 1)) }
+                case "ent_index" => arg1Tok() match { case x => stack.push(() => Z(toEntity(x().value).index, 1)) }
+                case "ent_text" => arg1Tok() match { case x => stack.push(() => Z(toEntity(x().value).text, 1)) }
                 case "ent_count" => checkAvail(); z0(() => Z(idlCtx.entities.size, 0))
-                case "ent_groups" => arg1Tok() match { case x => stack.push(() => Z(toEntity(x().value).getImpl.getGroups, 1)) }
+                case "ent_groups" => arg1Tok() match { case x => stack.push(() => Z(toEntity(x().value).impl.getGroups, 1)) }
                 case "ent_all" => checkAvail(); z0(() => Z(idlCtx.entities.asJava, 0))
-                case "ent_all_for_id" => checkAvail(); doForAll((e, id) => e.getImpl.getId == id)
-                case "ent_all_for_group" => checkAvail(); doForAll((e, grp) => e.getImpl.getGroups.contains(grp))
+                case "ent_all_for_id" => checkAvail(); doForAll((e, id) => e.impl.getId == id)
+                case "ent_all_for_group" => checkAvail(); doForAll((e, grp) => e.impl.getGroups.contains(grp))
                 case "ent_this" => z0(() => Z(ent, 1))
-                case "ent_is_last" => checkAvail(); arg1Tok() match { case x => stack.push(() => { Z(toEntity(x().value).getIndex == idlCtx.entities.size - 1, 1) }) }
-                case "ent_is_first" => checkAvail(); arg1Tok() match { case x => stack.push(() => { Z(toEntity(x().value).getIndex == 0, 1) }) }
-                case "ent_is_before_id" => checkAvail(); doIsBefore((e, id) => e.getImpl.getId == id)
-                case "ent_is_before_group" => checkAvail(); doIsBefore((e, grpId) => e.getImpl.getGroups.contains(grpId))
-                case "ent_is_after_id" => checkAvail(); doIsAfter((e, id) => e.getImpl.getId == id)
-                case "ent_is_after_group" => checkAvail(); doIsAfter((e, grpId) => e.getImpl.getGroups.contains(grpId))
-                case "ent_is_between_ids" => checkAvail(); doIsBetween((e, id) => e.getImpl.getId == id)
-                case "ent_is_between_groups" => checkAvail(); doIsBetween((e, grpId) => e.getImpl.getGroups.contains(grpId))
+                case "ent_is_last" => checkAvail(); arg1Tok() match { case x => stack.push(() => { Z(toEntity(x().value).index == idlCtx.entities.size - 1, 1) }) }
+                case "ent_is_first" => checkAvail(); arg1Tok() match { case x => stack.push(() => { Z(toEntity(x().value).index == 0, 1) }) }
+                case "ent_is_before_id" => checkAvail(); doIsBefore((e, id) => e.impl.getId == id)
+                case "ent_is_before_group" => checkAvail(); doIsBefore((e, grpId) => e.impl.getGroups.contains(grpId))
+                case "ent_is_after_id" => checkAvail(); doIsAfter((e, id) => e.impl.getId == id)
+                case "ent_is_after_group" => checkAvail(); doIsAfter((e, grpId) => e.impl.getGroups.contains(grpId))
+                case "ent_is_between_ids" => checkAvail(); doIsBetween((e, id) => e.impl.getId == id)
+                case "ent_is_between_groups" => checkAvail(); doIsBetween((e, grpId) => e.impl.getGroups.contains(grpId))
 
                 // Request data.
                 case "req_id" => z0(() => Z(idlCtx.req.getRequestId, 0))
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/matcher/NCIntentSolverResult.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/matcher/NCIntentSolverResult.scala
index 59c2880..b36e8e0 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/matcher/NCIntentSolverResult.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/matcher/NCIntentSolverResult.scala
@@ -20,17 +20,17 @@ package org.apache.nlpcraft.internal.intent.matcher
 import org.apache.nlpcraft.*
 
 /**
-  * Intent solver engine result. Using basic case class for easier Java interop.
   *
   * @param termId
   * @param entities
   */
-case class NCIntentEntitiesGroup(
+case class NCIntentTermEntities(
     termId: Option[String],
     entities: Seq[NCEntity]
 )
 
 /**
+  * Intent solver engine result. Using basic case class for easier Java interop.
   *
   * @param intentId
   * @param fn
@@ -39,9 +39,9 @@ case class NCIntentEntitiesGroup(
   * @param variantIdx
   */
 case class NCIntentSolverResult(
-    intentId: String,
-    fn: NCIntentMatch => NCResult,
-    groups: Seq[NCIntentEntitiesGroup],
-    variant: NCIntentSolverVariant,
-    variantIdx: Int
+   intentId: String,
+   fn: NCIntentMatch => NCResult,
+   groups: Seq[NCIntentTermEntities],
+   variant: NCIntentSolverVariant,
+   variantIdx: Int
 )
\ No newline at end of file
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/matcher/NCIntentsManager.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/matcher/NCIntentsManager.scala
index bc87ad9..b199a20 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/matcher/NCIntentsManager.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/matcher/NCIntentsManager.scala
@@ -248,7 +248,7 @@ class NCIntentsManager(dialog: NCDialogFlowManager, intents: Map[NCIDLIntent, NC
             NCIntentSolverResult(
                 m.intentMatch.intent.id,
                 m.callback,
-                m.intentMatch.entityGroups.map(grp => NCIntentEntitiesGroup(grp.term.id, grp.usedEntities.map(_.entity))),
+                m.intentMatch.entityGroups.map(grp => NCIntentTermEntities(grp.term.id, grp.usedEntities.map(_.entity))),
                 m.variant,
                 m.variantIdx
             )
@@ -318,7 +318,7 @@ class NCIntentsManager(dialog: NCDialogFlowManager, intents: Map[NCIDLIntent, NC
         tbl += (s"${"Intent Match Weight"}", mw1.toString, mw2.toString)
         tbl += (s"${"Variant Weight"}", v1.toString, v2.toString)
 
-        logger.warn(s"""Two matching intents have the same weight for their matches (variants weight will be used further):${tbl.toString}""")
+        tbl.warn(logger, Option("Two matching intents have the same weight for their matches (variants weight will be used further):"))
 
     /**
      *
@@ -403,15 +403,16 @@ class NCIntentsManager(dialog: NCDialogFlowManager, intents: Map[NCIDLIntent, NC
 
                 if !opts.allowStmEntityOnly && usedSenEnts.isEmpty && usedConvEnts.nonEmpty then
                     logger.info(
-                        s"Intent '$intentId' did not match because all its matched tokens came from STM $varStr. See intent 'allowStmEntityOnly' option."
+                        s"Intent '$intentId' did not match because all its matched tokens came from STM $varStr. " +
+                        s"See intent 'allowStmEntityOnly' option."
                     )
-
                     None
                 else if !opts.ignoreUnusedFreeWords && unusedToks.nonEmpty then
                     logger.info(
-                        s"Intent '$intentId' did not match because of unused free words $varStr. See intent 'ignoreUnusedFreeWords' option. Unused free words indexes: ${unusedToks.map(_.getIndex).mkString("{", ",", "}")}"
+                        s"Intent '$intentId' did not match because of unused free words $varStr. " +
+                        s"See intent 'ignoreUnusedFreeWords' option. " +
+                        s"Unused free words indexes: ${unusedToks.map(_.getIndex).mkString("{", ",", "}")}"
                     )
-
                     None
                 else
                     if usedSenEnts.isEmpty && usedConvEnts.isEmpty then
@@ -420,7 +421,6 @@ class NCIntentsManager(dialog: NCDialogFlowManager, intents: Map[NCIDLIntent, NC
                     // Number of remaining (unused) non-free words in the sentence is a measure of exactness of the match.
                     // The match is exact when all non-free words are used in that match.
                     // Negate to make sure the bigger (smaller negative number) is better.
-                    // TODO: check formula.
                     val nonFreeWordNum = -(ctx.getTokens.size() - senEnts.map(_.entity.getTokens.size()).sum)
 
                     intentW.prepend(nonFreeWordNum)
@@ -565,8 +565,6 @@ class NCIntentsManager(dialog: NCDialogFlowManager, intents: Map[NCIDLIntent, NC
     /**
       *
       * @param slvIn Intent solver input.
-      * @param span Parent span.
-      * @return
       * @throws NCRejection
       */
     private def solveIteration(slvIn: NCIntentSolverInput): Option[NCResult] =
@@ -610,7 +608,6 @@ class NCIntentsManager(dialog: NCDialogFlowManager, intents: Map[NCIDLIntent, NC
                 if slvIn.model.onMatchedIntent(intentMatch) then
                     // This can throw NCIntentSkip exception.
                     val cbRes = intentRes.fn(intentMatch)
-
                     // Store won intent match in the input.
                     slvIn.intentMatch = intentMatch
 
@@ -618,15 +615,10 @@ class NCIntentsManager(dialog: NCDialogFlowManager, intents: Map[NCIDLIntent, NC
                         cbRes.setIntentId(intentRes.intentId)
 
                     logger.info(s"Intent '${intentRes.intentId}' for variant #${intentRes.variantIdx + 1} selected as the <|best match|>")
-
                     dialog.addMatchedIntent(intentMatch, cbRes, ctx)
-
                     Loop.finish(Option(cbRes))
                 else
-                    logger.info(
-                        s"Model '${ctx.getModelConfig.getId}' triggered rematching of intents by intent '${intentRes.intentId}' on variant #${intentRes.variantIdx + 1}."
-                    )
-
+                    logger.info(s"Model '${ctx.getModelConfig.getId}' triggered rematching of intents by intent '${intentRes.intentId}' on variant #${intentRes.variantIdx + 1}.")
                     Loop.finish(None)
                 catch
                     case e: NCIntentSkip =>
@@ -640,16 +632,12 @@ class NCIntentsManager(dialog: NCDialogFlowManager, intents: Map[NCIDLIntent, NC
     /**
       *
       * @param in
-      * @param span
-      * @return
       * @throws NCRejection
       */
     def solve(in: NCIntentSolverInput): NCResult =
         var res: NCResult = null
-
         while (res == null)
             solveIteration(in) match
                 case Some(iterRes) => res = iterRes
                 case None => // No-op.
-
         res
\ No newline at end of file