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
commit 975431411d2c9c52534f7991f350d675aaf1bd2f Author: Aaron Radzinski <[email protected]> AuthorDate: Mon Mar 22 19:49:01 2021 -0700 WIP. --- .../org/apache/nlpcraft/examples/alarm/intents.idl | 1 + .../nlpcraft/examples/weather/WeatherModel.java | 11 +++-- .../apache/nlpcraft/model/intent/NCIdlTerm.scala | 2 +- .../model/intent/compiler/NCIdlCompiler.scala | 6 +-- .../model/intent/compiler/NCIdlCompilerBase.scala | 50 ++++++++-------------- .../model/intent/solver/NCIntentSolverEngine.scala | 10 +++-- 6 files changed, 37 insertions(+), 43 deletions(-) diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/alarm/intents.idl b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/alarm/intents.idl index cb28dc4..391b9de 100644 --- a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/alarm/intents.idl +++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/alarm/intents.idl @@ -19,6 +19,7 @@ fragment=buzz term~{id() == 'x:alarm'} fragment=when term(nums)~{ + // Demonstrating term variable. @type = meta_token('nlpcraft:num:unittype') @iseq = meta_token('nlpcraft:num:isequalcondition') diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/weather/WeatherModel.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/weather/WeatherModel.java index 34b2065..c3e22f1 100644 --- a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/weather/WeatherModel.java +++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/weather/WeatherModel.java @@ -122,21 +122,24 @@ public class WeatherModel extends NCModelFileAdapter { @NCIntent( "intent=req " + "term~{id() == 'wt:phen'}* " + // Zero or more weather phenomenon. - "term(ind)~{has(groups(), 'indicator')}* " + // Optional indicator words (zero or more). + "term(ind)~{" + + "@isIndicator = has(groups(), 'indicator') " + // Just to demo term variable usage. + "@isIndicator" + + "}* " + // Optional indicator words (zero or more). "term(city)~{id() == 'nlpcraft:city'}? " + // Optional city. "term(date)~{id() == 'nlpcraft:date'}?" // Optional date (overrides indicator words). ) - // NOTE: each samples group will reset conversation STM. + // NOTE: each samples group will reset conversation STM during auto-testing. @NCIntentSample({ "Current forecast?", "Chance of rain in Berlin now?" }) - // NOTE: each samples group will reset conversation STM. + // NOTE: each samples group will reset conversation STM during auto-testing. @NCIntentSample({ "Moscow forecast?", "Chicago history" }) - // NOTE: each samples group will reset conversation STM. + // NOTE: each samples group will reset conversation STM during auto-testing. @NCIntentSample({ "What's the local weather forecast?", "What's the weather in Moscow?", diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlTerm.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlTerm.scala index cdc8494..e3aa3b4 100644 --- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlTerm.scala +++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/NCIdlTerm.scala @@ -34,7 +34,7 @@ import org.apache.nlpcraft.common._ case class NCIdlTerm( idl: String, id: Option[String], - decls: List[NCIdlFunction], + decls: Map[String, NCIdlFunction], pred: NCIdlFunction, min: Int, max: Int, diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompiler.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompiler.scala index c3613ee..d27133c 100644 --- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompiler.scala +++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompiler.scala @@ -134,9 +134,7 @@ object NCIdlCompiler extends LazyLogging { if (!vars.contains(varName)) throw newSyntaxError(s"Unknown variable: @$varName")(ctx) - val instr: SI = (tok: NCToken, stack: S, idlCtx: NCIdlContext) ⇒ - stack.push(() ⇒ - idlCtx.vars(varName)(tok, idlCtx)) + val instr: SI = (tok: NCToken, stack: S, idlCtx: NCIdlContext) ⇒ stack.push(() ⇒ idlCtx.vars(varName)(tok, idlCtx)) expr += instr } @@ -320,7 +318,7 @@ object NCIdlCompiler extends LazyLogging { terms += NCIdlTerm( ctx.getText, Option(termId), - vars.values.toList, + vars.toMap, pred, min, max, diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompilerBase.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompilerBase.scala index 826d6a2..538871b 100644 --- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompilerBase.scala +++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompilerBase.scala @@ -285,27 +285,21 @@ trait NCIdlCompilerBase { val Z(v1, n1) = x1() val Z(v2, n2) = x2() - val f = - if (isInt(v1) && isInt(v2)) asInt(v1) * asInt(v2) - else if (isInt(v1) && isReal(v2)) asInt(v1) * asReal(v2) - else if (isReal(v1) && isInt(v2)) asReal(v1) * asInt(v2) - else if (isReal(v1) && isReal(v2)) asReal(v1) * asReal(v2) - else - throw rtBinaryOpError("*", v1, v2) - - Z(f, n1 + n2) + if (isInt(v1) && isInt(v2)) Z(asInt(v1) * asInt(v2), n1 + n2) + else if (isInt(v1) && isReal(v2)) Z(asInt(v1) * asReal(v2), n1 + n2) + else if (isReal(v1) && isInt(v2)) Z(asReal(v1) * asInt(v2), n1 + n2) + else if (isReal(v1) && isReal(v2)) Z(asReal(v1) * asReal(v2), n1 + n2) + else + throw rtBinaryOpError("*", v1, v2) }) else if (mod != null) stack.push(() ⇒ { val Z(v1, n1) = x1() val Z(v2, n2) = x2() - val f = - if (isInt(v1) && isInt(v2)) asInt(v1) % asInt(v2) - else - throw rtBinaryOpError("%", v1, v2) - - Z(f, n1 + n2) + if (isInt(v1) && isInt(v2)) Z(asInt(v1) % asInt(v2), n1 + n2) + else + throw rtBinaryOpError("%", v1, v2) }) else { assert(div != null) @@ -314,15 +308,12 @@ trait NCIdlCompilerBase { val Z(v1, n1) = x1() val Z(v2, n2) = x2() - val f = - if (isInt(v1) && isInt(v2)) asInt(v1) / asInt(v2) - else if (isInt(v1) && isReal(v2)) asInt(v1) / asReal(v2) - else if (isReal(v1) && isInt(v2)) asReal(v1) / asInt(v2) - else if (isReal(v1) && isReal(v2)) asReal(v1) / asReal(v2) - else - throw rtBinaryOpError("/", v1, v2) - - Z(f, n1 + n2) + if (isInt(v1) && isInt(v2)) Z(asInt(v1) / asInt(v2), n1 + n2) + else if (isInt(v1) && isReal(v2)) Z(asInt(v1) / asReal(v2), n1 + n2) + else if (isReal(v1) && isInt(v2)) Z(asReal(v1) / asInt(v2), n1 + n2) + else if (isReal(v1) && isReal(v2)) Z(asReal(v1) / asReal(v2), n1 + n2) + else + throw rtBinaryOpError("/", v1, v2) }) } } @@ -454,13 +445,10 @@ trait NCIdlCompilerBase { stack.push(() ⇒ { val Z(v, n) = x() - val z = - if (isReal(v)) -asReal(v) - else if (isInt(v)) -asInt(v) - else - throw rtUnaryOpError("-", v) - - Z(z, n) + if (isReal(v)) Z(-asReal(v), n) + else if (isInt(v)) Z(-asInt(v), n) + else + throw rtUnaryOpError("-", v) }) else { assert(not != null) diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverEngine.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverEngine.scala index b7675ca..b9d0de5 100644 --- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverEngine.scala +++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverEngine.scala @@ -488,16 +488,19 @@ object NCIntentSolverEngine extends LazyLogging with NCOpenCensusTrace { var abort = false val ordered = intent.ordered var lastTermMatch: TermMatch = null - + + // Conversation metadata (shared across all terms). val x = ctx.getConversation.getMetadata val convMeta = if (x.isEmpty) Map.empty[String, Object] else x.asScala.toMap[String, Object] // Check terms. for (term ← intent.terms if !abort) { + // Fresh context for each term. val termCtx = NCIdlContext( intentMeta = intent.meta, convMeta = convMeta, - req = ctx.getRequest + req = ctx.getRequest, + vars = mutable.HashMap.empty[String, NCIdlFunction] ++ term.decls ) solveTerm( @@ -604,7 +607,7 @@ object NCIntentSolverEngine extends LazyLogging with NCOpenCensusTrace { ctx: NCIdlContext, senToks: Seq[UsedToken], convToks: Seq[UsedToken] - ): Option[TermMatch] = + ): Option[TermMatch] = { solvePredicate(term.pred, ctx, term.min, term.max, senToks, convToks) match { case Some((usedToks, predWeight)) ⇒ Some( TermMatch( @@ -636,6 +639,7 @@ object NCIntentSolverEngine extends LazyLogging with NCOpenCensusTrace { // Term not found at all. case None ⇒ None } + } /** * Solves term's predicate.
