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 2021/03/23 03:00:27 UTC
[incubator-nlpcraft] 06/08: 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
commit 975431411d2c9c52534f7991f350d675aaf1bd2f
Author: Aaron Radzinski <ar...@apache.org>
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.