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