This is an automated email from the ASF dual-hosted git repository. sergeykamov pushed a commit to branch master-ask-validate in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git
commit 3f0f3a755f3f91cc8eac2cf27090c2e46ed05cd8 Author: Sergey Kamov <skhdlem...@gmail.com> AuthorDate: Mon Mar 28 14:28:35 2022 +0300 Ask validation client method added. --- .../scala/org/apache/nlpcraft/NCModelClient.java | 5 +++++ .../nlpcraft/internal/impl/NCModelClientImpl.scala | 22 ++++++++++++++-------- .../intent/matcher/NCIntentSolverManager.scala | 10 ++++++---- .../nlpcraft/internal/impl/NCModelClientSpec.scala | 6 ++++++ 4 files changed, 31 insertions(+), 12 deletions(-) diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/NCModelClient.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/NCModelClient.java index 54f023b..3924812 100644 --- a/nlpcraft/src/main/scala/org/apache/nlpcraft/NCModelClient.java +++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/NCModelClient.java @@ -20,6 +20,7 @@ package org.apache.nlpcraft; import org.apache.nlpcraft.internal.impl.NCModelClientImpl; import java.util.Map; +import java.util.List; import java.util.function.Predicate; /** @@ -98,4 +99,8 @@ public class NCModelClient implements AutoCloseable { public void validateSamples() { impl.validateSamples(); } + + public List<List<NCEntity>> validateAsk(String txt, Map<String, Object> data, String usrId) { + return impl.validateAsk(txt, data, usrId); + } } diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/impl/NCModelClientImpl.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/impl/NCModelClientImpl.scala index 87b8983..06887a0 100644 --- a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/impl/NCModelClientImpl.scala +++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/impl/NCModelClientImpl.scala @@ -75,13 +75,7 @@ class NCModelClientImpl(mdl: NCModel) extends LazyLogging: dlgMgr.start() plMgr.start() - /* - * @param txt - * @param data - * @param usrId - * @return - */ - def ask(txt: String, data: JMap[String, AnyRef], usrId: String): NCResult = + private def ask0(txt: String, data: JMap[String, AnyRef], usrId: String, isValidation: Boolean): NCResult = val plData = plMgr.prepare(txt, data, usrId) val userId = plData.request.getUserId @@ -105,7 +99,16 @@ class NCModelClientImpl(mdl: NCModel) extends LazyLogging: override val getVariants: util.Collection[NCVariant] = plData.variants.asJava override val getTokens: JList[NCToken] = plData.tokens - intentsMgr.solve(mdl, ctx) + intentsMgr.solve(mdl, ctx, isValidation) + + + /* + * @param txt + * @param data + * @param usrId + * @return + */ + def ask(txt: String, data: JMap[String, AnyRef], usrId: String): NCResult = ask0(txt, data, usrId, false) /** * @@ -187,3 +190,6 @@ class NCModelClientImpl(mdl: NCModel) extends LazyLogging: plMgr.close() dlgMgr.close() convMgr.close() + + def validateAsk(txt: String, data: JMap[String, AnyRef], usrId: String): JList[JList[NCEntity]] = + ask0(txt, data, usrId, true).getBody.asInstanceOf[JList[JList[NCEntity]]] \ No newline at end of file diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/matcher/NCIntentSolverManager.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/matcher/NCIntentSolverManager.scala index 74cacda..d08b711 100644 --- a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/matcher/NCIntentSolverManager.scala +++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/intent/matcher/NCIntentSolverManager.scala @@ -622,9 +622,10 @@ class NCIntentSolverManager(dialog: NCDialogFlowManager, intents: Map[NCIDLInten * * @param mdl * @param ctx + * @param isValidation * @return */ - private def solveIteration(mdl: NCModel, ctx: NCContext): Option[IterationResult] = + private def solveIteration(mdl: NCModel, ctx: NCContext, isValidation: Boolean): Option[IterationResult] = require(intents.nonEmpty) val req = ctx.getRequest @@ -662,7 +663,7 @@ class NCIntentSolverManager(dialog: NCDialogFlowManager, intents: Map[NCIDLInten try if mdl.onMatchedIntent(intentMatch) then // This can throw NCIntentSkip exception. - val cbRes = intentRes.fn(intentMatch) + val cbRes = if isValidation then new NCResult(intentMatch.getIntentEntities, NCResultType.ASK_RESULT) else intentRes.fn(intentMatch) // Store won intent match in the input. if cbRes.getIntentId == null then cbRes.setIntentId(intentRes.intentId) @@ -685,9 +686,10 @@ class NCIntentSolverManager(dialog: NCDialogFlowManager, intents: Map[NCIDLInten * * @param mdl * @param ctx + * @param isValidation * @return */ - def solve(mdl: NCModel, ctx: NCContext): NCResult = + def solve(mdl: NCModel, ctx: NCContext, isValidation: Boolean): NCResult = var res: NCResult = mdl.onContext(ctx) if res != null then @@ -704,7 +706,7 @@ class NCIntentSolverManager(dialog: NCDialogFlowManager, intents: Map[NCIDLInten try while (loopRes == null) - solveIteration(mdl, ctx) match + solveIteration(mdl, ctx, isValidation) match case Some(iterRes) => loopRes = iterRes case None => // No-op. diff --git a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelClientSpec.scala b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelClientSpec.scala index 5123c84..72928aa 100644 --- a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelClientSpec.scala +++ b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelClientSpec.scala @@ -27,6 +27,9 @@ import scala.jdk.CollectionConverters.* import scala.util.Using class NCModelClientSpec: + private def s(e: NCEntity): String = + s"Entity [id=${e.getId}, text=${e.mkText()}, properties={${e.keysSet().asScala.map(k => s"$k=${e.get(k)}")}}]" + private def test0(mdl: NCTestModelAdapter): Unit = mdl.getPipeline.getEntityParsers.add(NCTestUtils.mkENSemanticParser("models/lightswitch_model.yaml")) @@ -37,6 +40,9 @@ class NCModelClientSpec: println(s"Body: ${res.getBody}") client.validateSamples() + val entities = client.validateAsk("Lights on at second floor kitchen", null, "userId") + + println("Entities: \n" + entities.asScala.map(p => p.asScala.map(s).mkString(", ")).mkString("\n")) } /** *