This is an automated email from the ASF dual-hosted git repository.
sergeykamov pushed a commit to branch NLPCRAFT-383
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git
The following commit(s) were added to refs/heads/NLPCRAFT-383 by this push:
new a3471e3 WIP.
a3471e3 is described below
commit a3471e34093527236bcd83b326de2e171f8835c0
Author: Sergey Kamov <[email protected]>
AuthorDate: Fri Aug 6 18:26:53 2021 +0300
WIP.
---
.../examples/solarsystem/SolarSystemModel.scala | 50 +++++++++++---
.../loaders/SolarSystemDiscoversValueLoader.scala | 31 ++++++++-
.../loaders/SolarSystemPlanetsValueLoader.scala | 15 ++++-
.../loaders/SolarSystemValueLoader.scala | 18 -----
.../SolarSystemOpenApiBodyRequest.scala} | 9 +--
.../tools/SolarSystemOpenApiService.scala | 78 +++++++++++++++++-----
.../src/main/resources/solarsystem_model.yaml | 23 +------
.../solarsystem/NCSolarSystemModelSpec.scala | 6 +-
8 files changed, 154 insertions(+), 76 deletions(-)
diff --git
a/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/SolarSystemModel.scala
b/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/SolarSystemModel.scala
index d94531a..b4e5b1e 100644
---
a/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/SolarSystemModel.scala
+++
b/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/SolarSystemModel.scala
@@ -18,24 +18,56 @@
package org.apache.nlpcraft.examples.solarsystem
import com.typesafe.scalalogging.LazyLogging
-import org.apache.nlpcraft.model.{NCIntent, NCIntentTerm, NCModelFileAdapter,
NCResult, NCToken}
+import org.apache.nlpcraft.examples.solarsystem.tools.SolarSystemOpenApiService
+import org.apache.nlpcraft.model.{NCIntent, NCIntentSample, NCIntentTerm,
NCModelFileAdapter, NCResult, NCToken}
class SolarSystemModel extends NCModelFileAdapter("solarsystem_model.yaml")
with LazyLogging {
+ private var api: SolarSystemOpenApiService = _
+
override def onInit(): Unit = {
+ api = SolarSystemOpenApiService.getInstance()
+ logger.info("Solar System Model started.")
}
override def onDiscard(): Unit = {
- super.onDiscard()
+ if (api != null)
+ api.stop()
+
+ logger.info("Solar System Model stopped.")
}
+ @NCIntentSample(
+ Array(
+ "Moon!",
+ "give me information about Larissa",
+ )
+ )
@NCIntent(
- "intent=i1 " +
- "term(planet)~{tok_id() == 'prop:moon'}"
+ "intent=planetInfo " +
+ " options={" +
+ " 'unused_usr_toks': false " +
+ " }" +
+ " term(planet)={tok_id() == 'planet'}"
)
- def onCustomSortReport(
- @NCIntentTerm("planet") sortTok: NCToken,
- ): NCResult = {
- NCResult.json("OK")
- }
+ def planetInfo(@NCIntentTerm("planet") planet: NCToken): NCResult =
+ NCResult.text(api.bodyRequest().withFilter("id", "eq",
planet.getNormalizedText).execute().toString())
+
+ @NCIntentSample(
+ Array(
+ "What was discovered by Asaph Hall",
+ "What was discovered by Hall",
+ "Galileo Galilei planets",
+ "Galilei planets",
+ )
+ )
+ @NCIntent(
+ "intent=discoverer " +
+ " options={" +
+ " 'unused_usr_toks': true " +
+ " }" +
+ " term(discoverer)={tok_id() == 'discoverer'}"
+ )
+ def discoverer(@NCIntentTerm("discoverer") discoverer: NCToken): NCResult =
+ NCResult.text(api.bodyRequest().withFilter("discoveredBy", "cs",
discoverer.getNormalizedText).execute().toString())
}
diff --git
a/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/loaders/SolarSystemDiscoversValueLoader.scala
b/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/loaders/SolarSystemDiscoversValueLoader.scala
index d676775..0a92d58 100644
---
a/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/loaders/SolarSystemDiscoversValueLoader.scala
+++
b/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/loaders/SolarSystemDiscoversValueLoader.scala
@@ -18,7 +18,34 @@
package org.apache.nlpcraft.examples.solarsystem.loaders
import org.apache.nlpcraft.examples.solarsystem.tools.SolarSystemOpenApiService
+import org.apache.nlpcraft.model.{NCElement, NCValue, NCValueLoader}
+
+import java.util
+import scala.collection.mutable.ArrayBuffer
+import scala.jdk.CollectionConverters.{SeqHasAsJava, SetHasAsJava}
+
+class SolarSystemDiscoversValueLoader extends NCValueLoader {
+ // Example: "Scott S. Sheppard, David C. Jewitt"
+ private def mkValue(discInfo: String): NCValue = {
+ val syns = ArrayBuffer.empty[String]
+
+ for (d <- discInfo.split(",").map(_.trim).filter(_.nonEmpty)) {
+ syns += d.toLowerCase
+
+ val arr = d.split(" ")
+
+ // Tries to detect last name.
+ if (arr.length > 1)
+ syns += arr.last.strip.toLowerCase
+ }
+
+ new NCValue {
+ override def getName: String = discInfo
+ override def getSynonyms: util.List[String] = syns.asJava
+ }
+ }
+
+ override def load(owner: NCElement): util.Set[NCValue] =
+
SolarSystemOpenApiService.getInstance().getAllDiscovers.map(mkValue).toSet.asJava
-class SolarSystemDiscoversValueLoader extends SolarSystemValueLoader {
- override def getData: Seq[String] =
SolarSystemOpenApiService.getInstance().getAllDiscovers
}
diff --git
a/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/loaders/SolarSystemPlanetsValueLoader.scala
b/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/loaders/SolarSystemPlanetsValueLoader.scala
index 5659d97..76dc321 100644
---
a/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/loaders/SolarSystemPlanetsValueLoader.scala
+++
b/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/loaders/SolarSystemPlanetsValueLoader.scala
@@ -18,7 +18,18 @@
package org.apache.nlpcraft.examples.solarsystem.loaders
import org.apache.nlpcraft.examples.solarsystem.tools.SolarSystemOpenApiService
+import org.apache.nlpcraft.model.{NCElement, NCValue, NCValueLoader}
-class SolarSystemPlanetsValueLoader extends SolarSystemValueLoader {
- override def getData: Seq[String] =
SolarSystemOpenApiService.getInstance().getAllPlanets
+import java.util
+import scala.jdk.CollectionConverters.{SeqHasAsJava, SetHasAsJava}
+
+class SolarSystemPlanetsValueLoader extends NCValueLoader {
+ private def mkValue(id: String, v: String): NCValue =
+ new NCValue {
+ override def getName: String = id
+ override def getSynonyms: util.List[String] = Seq(id.toLowerCase,
v.toLowerCase).asJava
+ }
+
+ override def load(owner: NCElement): util.Set[NCValue] =
+ SolarSystemOpenApiService.getInstance().getAllPlanets.map{ case (id,
v) => mkValue(id, v) }.toSet.asJava
}
diff --git
a/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/loaders/SolarSystemValueLoader.scala
b/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/loaders/SolarSystemValueLoader.scala
deleted file mode 100644
index 3996849..0000000
---
a/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/loaders/SolarSystemValueLoader.scala
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.apache.nlpcraft.examples.solarsystem.loaders
-
-import org.apache.nlpcraft.model.{NCElement, NCValue, NCValueLoader}
-
-import java.util
-import scala.jdk.CollectionConverters.{SeqHasAsJava, SetHasAsJava}
-
-trait SolarSystemValueLoader extends NCValueLoader {
- def getData: Seq[String]
-
- private def mkValue(v: String): NCValue =
- new NCValue {
- override def getName: String = v
- override def getSynonyms: util.List[String] =
Seq(v.toLowerCase).asJava
- }
-
- override def load(owner: NCElement): util.Set[NCValue] =
getData.map(mkValue).toSet.asJava
-}
diff --git
a/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/loaders/SolarSystemPlanetsValueLoader.scala
b/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/tools/SolarSystemOpenApiBodyRequest.scala
similarity index 72%
copy from
nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/loaders/SolarSystemPlanetsValueLoader.scala
copy to
nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/tools/SolarSystemOpenApiBodyRequest.scala
index 5659d97..66cbf11 100644
---
a/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/loaders/SolarSystemPlanetsValueLoader.scala
+++
b/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/tools/SolarSystemOpenApiBodyRequest.scala
@@ -15,10 +15,11 @@
* limitations under the License.
*/
-package org.apache.nlpcraft.examples.solarsystem.loaders
+package org.apache.nlpcraft.examples.solarsystem.tools
-import org.apache.nlpcraft.examples.solarsystem.tools.SolarSystemOpenApiService
+trait SolarSystemOpenApiBodyRequest {
+ def withParameters(params: String*): SolarSystemOpenApiBodyRequest
+ def withFilter(data: String, oper: String, value: String):
SolarSystemOpenApiBodyRequest
-class SolarSystemPlanetsValueLoader extends SolarSystemValueLoader {
- override def getData: Seq[String] =
SolarSystemOpenApiService.getInstance().getAllPlanets
+ def execute(): Seq[Map[String, Object]]
}
diff --git
a/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/tools/SolarSystemOpenApiService.scala
b/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/tools/SolarSystemOpenApiService.scala
index 3bff72d..d6d4011 100644
---
a/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/tools/SolarSystemOpenApiService.scala
+++
b/nlpcraft-examples/solarsystem/src/main/java/org/apache/nlpcraft/examples/solarsystem/tools/SolarSystemOpenApiService.scala
@@ -22,7 +22,7 @@ import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.typesafe.scalalogging.LazyLogging
import
org.apache.nlpcraft.examples.solarsystem.tools.SolarSystemOpenApiService.BodiesBean
-import java.net.URI
+import java.net.{URI, URLEncoder}
import java.net.http.HttpClient.Version
import java.net.http.{HttpClient, HttpRequest, HttpResponse}
@@ -31,7 +31,7 @@ object SolarSystemOpenApiService {
private var s: SolarSystemOpenApiService = _
- def getInstance(): SolarSystemOpenApiService = {
+ def getInstance(): SolarSystemOpenApiService =
this.synchronized {
if (s == null) {
s = new SolarSystemOpenApiService
@@ -41,7 +41,6 @@ object SolarSystemOpenApiService {
s
}
- }
}
class SolarSystemOpenApiService extends LazyLogging {
@@ -49,31 +48,74 @@ class SolarSystemOpenApiService extends LazyLogging {
private final val MAPPER = new
ObjectMapper().registerModule(DefaultScalaModule)
private var client: HttpClient = _
- private var planets: Seq[String] = _
+
+ private var planets: Map[String, String] = _
private var discovers: Seq[String] = _
- private def getBody(params: String*): Seq[Map[String, Object]] = {
- val req =
-
HttpRequest.newBuilder(URI.create(s"$URL_BODIES?data=${params.mkString(",")}")).
- header("Content-Type", "application/json").
- GET().
- build()
+ // Simplified implementation of
'https://api.le-systeme-solaire.net/rest/bodies/' request.
+ // Only single filter can be used.
+ def bodyRequest(): SolarSystemOpenApiBodyRequest = new
SolarSystemOpenApiBodyRequest() {
+ case class Filter(data: String, oper: String, value: String) {
+ require(data != null)
+ require(oper != null)
+ require(value != null)
+ }
+
+ private var params: Seq[String] = _
+ private var filter: Filter = _
+
+ override def withParameters(params: String*):
SolarSystemOpenApiBodyRequest = {
+ this.params = params
+
+ this
+ }
+
+ override def withFilter(data: String, oper: String, value: String):
SolarSystemOpenApiBodyRequest = {
+ this.filter = Filter(data, oper, value)
+
+ this
+ }
- val respJs = client.sendAsync(req,
HttpResponse.BodyHandlers.ofString()).get().body()
+ override def execute(): Seq[Map[String, Object]] = {
+ var url = URL_BODIES
- MAPPER.readValue(respJs, classOf[BodiesBean]).bodies
+ def getSeparator: String = if (url == URL_BODIES) "?" else "&"
+
+ if (params != null)
+ url = s"$url${getSeparator}data=${params.mkString(",")}"
+
+ if (filter != null)
+ url =
s"$url${getSeparator}filter=${filter.data},${filter.oper},${URLEncoder.encode(filter.value,
"UTF-8")}"
+
+ logger.info(s"Request prepared: $url")
+
+ val respJs = client.sendAsync(
+ HttpRequest.newBuilder(URI.create(url)).header("Content-Type",
"application/json").GET().build(),
+ HttpResponse.BodyHandlers.ofString()
+ ).get().body()
+
+ logger.info(s"Response received: $respJs")
+
+ MAPPER.readValue(respJs, classOf[BodiesBean]).bodies
+ }
}
def start(): Unit = {
client = HttpClient.newBuilder.version(Version.HTTP_2).build
- val res = getBody("englishName,discoveredBy")
+ val res = bodyRequest().withParameters("id", "englishName",
"discoveredBy").execute()
+
+ def extract(name: String): Map[String, String] =
+ res.map(row => row("id").toString.strip() ->
row(name).toString.strip()).
+ filter(p => p._1.nonEmpty && p._2.nonEmpty).distinct.toMap
+
+ def str(m: Map[String, Object], name: String): String =
m(name).asInstanceOf[String].strip
- def extract(name: String): Seq[String] =
-
res.map(_(name).asInstanceOf[String]).map(_.strip).filter(_.nonEmpty).distinct
+ planets =
+ res.map(row => str(row, "id") -> str(row, "englishName")).
+ filter(p => p._1.nonEmpty && p._2.nonEmpty).toMap
- planets = extract("englishName")
- discovers = extract("discoveredBy")
+ discovers = res.map(row => str(row, "discoveredBy")).distinct
logger.info(
s"Solar System Open Api Service started. " +
@@ -90,6 +132,6 @@ class SolarSystemOpenApiService extends LazyLogging {
logger.info(s"Solar System Open Api Service stopped.")
}
- def getAllPlanets: Seq[String] = planets
+ def getAllPlanets: Map[String, String] = planets
def getAllDiscovers: Seq[String] = discovers
}
diff --git
a/nlpcraft-examples/solarsystem/src/main/resources/solarsystem_model.yaml
b/nlpcraft-examples/solarsystem/src/main/resources/solarsystem_model.yaml
index 32745a9..93c4ac0 100644
--- a/nlpcraft-examples/solarsystem/src/main/resources/solarsystem_model.yaml
+++ b/nlpcraft-examples/solarsystem/src/main/resources/solarsystem_model.yaml
@@ -67,27 +67,10 @@ elements:
synonyms:
- "{discovered {by|_}}"
- - id: "prop:discoveredDate"
- groups:
- - "prop"
- description: "..."
- synonyms:
- - "{discovered {date|_}}"
-
- - id: "prop:discoveredDate"
- groups:
- - "prop"
- description: "..."
- synonyms:
- - "{discovered {date|_}}"
-
- - id: "enum:planet"
+ - id: "planet"
description: "..."
valueLoader:
"org.apache.nlpcraft.examples.solarsystem.loaders.SolarSystemPlanetsValueLoader"
- - id: "enum:discoverer"
+ - id: "discoverer"
description: "..."
- valueLoader:
"org.apache.nlpcraft.examples.solarsystem.loaders.SolarSystemDiscoversValueLoader"
-
-intents:
- - "intent=ls term(act)={has(tok_groups(), 'prop')}"
\ No newline at end of file
+ valueLoader:
"org.apache.nlpcraft.examples.solarsystem.loaders.SolarSystemDiscoversValueLoader"
\ No newline at end of file
diff --git
a/nlpcraft-examples/solarsystem/src/test/java/org/apache/nlpcraft/examples/solarsystem/NCSolarSystemModelSpec.scala
b/nlpcraft-examples/solarsystem/src/test/java/org/apache/nlpcraft/examples/solarsystem/NCSolarSystemModelSpec.scala
index 9dae572..921b57b 100644
---
a/nlpcraft-examples/solarsystem/src/test/java/org/apache/nlpcraft/examples/solarsystem/NCSolarSystemModelSpec.scala
+++
b/nlpcraft-examples/solarsystem/src/test/java/org/apache/nlpcraft/examples/solarsystem/NCSolarSystemModelSpec.scala
@@ -19,14 +19,14 @@ package org.apache.nlpcraft.examples.solarsystem
import org.apache.nlpcraft.{NCTestContext, NCTestEnvironment}
import org.junit.jupiter.api.Test
-
/**
*
*/
@NCTestEnvironment(model = classOf[SolarSystemModel], startClient = true)
class NCSolarSystemModelSpec extends NCTestContext {
@Test
- def test(): Unit = {
- checkIntent("moon", "i1")
+ def planetInfo(): Unit = {
+ checkIntent("moon", "planetInfo")
+ checkIntent("give me information about Larissa", "planetInfo")
}
}