This is an automated email from the ASF dual-hosted git repository.

sergeykamov 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 71e7974  Model builder refactoring.
71e7974 is described below

commit 71e79741e380dac2dff7136339905342dfae4a56
Author: Sergey Kamov <[email protected]>
AuthorDate: Wed Mar 16 22:08:09 2022 +0300

    Model builder refactoring.
---
 .../apache/nlpcraft/examples/time/EchoModel.java   |  1 -
 .../examples/lightswitch/LightSwitchFrModel.scala  |  4 +-
 .../entity/parser/NCFrSemanticEntityParser.scala   |  1 +
 .../lightswitch/LightSwitchGroovyModel.groovy      |  2 +-
 .../examples/lightswitch/LightSwitchJavaModel.java |  2 +-
 .../examples/lightswitch/LightSwitchKotlinModel.kt |  2 +-
 .../lightswitch/LightSwitchScalaModel.scala        |  4 +-
 .../apache/nlpcraft/examples/time/TimeModel.java   |  2 +-
 .../stanford/NCStanfordNLPEntityParserSpec.scala   |  3 +-
 .../apache/nlpcraft/NCModelPipelineBuilder.java    | 95 +++++++++++++++++++++-
 .../nlpcraft/internal/util/NCResourceReader.scala  |  4 +-
 .../impl/semantic/NCSemanticEntityParserImpl.scala |  2 +-
 .../nlp/token/parser/NCENOpenNLPTokenParser.java   | 30 -------
 .../internal/impl/NCModelCallbacksSpec.scala       |  9 +-
 .../nlpcraft/internal/impl/NCModelClientSpec.scala |  7 +-
 .../internal/impl/NCModelPingPongSpec.scala        |  7 +-
 .../internal/impl/NCModelPipelineManagerSpec.scala |  5 +-
 .../impl/scan/NCModelIntentsInvalidArgsSpec.scala  |  1 -
 .../scan/NCModelIntentsInvalidIntentsSpec.scala    |  1 -
 .../impl/scan/NCModelIntentsNestedSpec.scala       |  1 -
 .../internal/impl/scan/NCTestModelJava.java        |  2 +-
 .../internal/impl/scan/NCTestModelScala.scala      |  2 +-
 .../intent/compiler/NCIDLCompilerSpec.scala        |  2 +-
 .../intent/compiler/functions/NCIDLFunctions.scala |  1 -
 .../compiler/functions/NCIDLFunctionsModel.scala   |  2 +-
 .../entity/parser/nlp/NCNLPEntityParserSpec.scala  |  1 -
 .../parser/opennlp/NCOpenNLPEntityParserSpec.scala |  1 -
 .../semantic/NCSemanticEntityParserJsonSpec.scala  |  3 +-
 .../semantic/NCSemanticEntityParserLemmaSpec.scala | 17 ++--
 .../semantic/NCSemanticEntityParserSpec.scala      | 11 +--
 .../semantic/NCSemanticEntityParserYamlSpec.scala  |  3 +-
 .../parser/semantic/NCSemanticTestElement.scala    |  2 +-
 .../enricher/en/NCBracketsTokenEnricherSpec.scala  |  1 -
 .../en/NCDictionaryTokenEnricherSpec.scala         |  7 +-
 .../enricher/en/NCQuotesTokenEnricherSpec.scala    |  7 +-
 .../enricher/en/NCStopWordsEnricherSpec.scala      |  8 +-
 .../en/NCSwearWordsTokenEnricherSpec.scala         |  1 -
 .../enricher/en/impl/NCStopWordsImplSpec.scala     |  1 -
 .../parser/opennlp/NCOpenNLPTokenParserSpec.scala  |  7 +-
 .../nlp/util/{opennlp => }/NCTestConfig.scala      |  2 +-
 .../nlp/util/{opennlp => }/NCTestConfigJava.java   |  2 +-
 .../nlpcraft/nlp/util/NCTestModelAdapter.scala     |  2 +-
 .../org/apache/nlpcraft/nlp/util/NCTestUtils.scala | 41 +++++++++-
 43 files changed, 200 insertions(+), 109 deletions(-)

diff --git 
a/nlpcraft-examples/echo/src/main/java/org/apache/nlpcraft/examples/time/EchoModel.java
 
b/nlpcraft-examples/echo/src/main/java/org/apache/nlpcraft/examples/time/EchoModel.java
index 0563885..a514717 100644
--- 
a/nlpcraft-examples/echo/src/main/java/org/apache/nlpcraft/examples/time/EchoModel.java
+++ 
b/nlpcraft-examples/echo/src/main/java/org/apache/nlpcraft/examples/time/EchoModel.java
@@ -28,7 +28,6 @@ import org.apache.nlpcraft.NCRejection;
 import org.apache.nlpcraft.NCRequest;
 import org.apache.nlpcraft.NCResult;
 import org.apache.nlpcraft.NCResultType;
-import org.apache.nlpcraft.nlp.entity.parser.NCEnSemanticEntityParser;
 
 import java.util.HashMap;
 import java.util.Map;
diff --git 
a/nlpcraft-examples/lightswitch-fr/src/main/java/org/apache/nlpcraft/examples/lightswitch/LightSwitchFrModel.scala
 
b/nlpcraft-examples/lightswitch-fr/src/main/java/org/apache/nlpcraft/examples/lightswitch/LightSwitchFrModel.scala
index fb7734f..92cbb35 100644
--- 
a/nlpcraft-examples/lightswitch-fr/src/main/java/org/apache/nlpcraft/examples/lightswitch/LightSwitchFrModel.scala
+++ 
b/nlpcraft-examples/lightswitch-fr/src/main/java/org/apache/nlpcraft/examples/lightswitch/LightSwitchFrModel.scala
@@ -22,8 +22,8 @@ import org.apache.nlpcraft.*
 import 
org.apache.nlpcraft.examples.lightswitch.nlp.entity.parser.NCFrSemanticEntityParser
 import 
org.apache.nlpcraft.examples.lightswitch.nlp.token.enricher.{NCFrLemmaPosTokenEnricher,
 NCFrStopWordsTokenEnricher}
 import 
org.apache.nlpcraft.examples.lightswitch.nlp.token.parser.NCFrTokenParser
-import org.apache.nlpcraft.nlp.entity.parser.{NCNLPEntityParser, 
NCSemanticEntityParser}
-import org.apache.nlpcraft.nlp.token.enricher.NCENStopWordsTokenEnricher
+import org.apache.nlpcraft.nlp.entity.parser.*
+import org.apache.nlpcraft.nlp.token.enricher.*
 import org.apache.nlpcraft.nlp.token.parser.NCOpenNLPTokenParser
 
 import java.util
diff --git 
a/nlpcraft-examples/lightswitch-fr/src/main/java/org/apache/nlpcraft/examples/lightswitch/nlp/entity/parser/NCFrSemanticEntityParser.scala
 
b/nlpcraft-examples/lightswitch-fr/src/main/java/org/apache/nlpcraft/examples/lightswitch/nlp/entity/parser/NCFrSemanticEntityParser.scala
index 6a70a75..ceeaf10 100644
--- 
a/nlpcraft-examples/lightswitch-fr/src/main/java/org/apache/nlpcraft/examples/lightswitch/nlp/entity/parser/NCFrSemanticEntityParser.scala
+++ 
b/nlpcraft-examples/lightswitch-fr/src/main/java/org/apache/nlpcraft/examples/lightswitch/nlp/entity/parser/NCFrSemanticEntityParser.scala
@@ -20,6 +20,7 @@ package 
org.apache.nlpcraft.examples.lightswitch.nlp.entity.parser
 import opennlp.tools.stemmer.snowball.SnowballStemmer
 import 
org.apache.nlpcraft.examples.lightswitch.nlp.token.parser.NCFrTokenParser
 import org.apache.nlpcraft.nlp.entity.parser.*
+import org.apache.nlpcraft.nlp.entity.parser.semantic.*
 
 /**
   *
diff --git 
a/nlpcraft-examples/lightswitch/src/main/java/org/apache/nlpcraft/examples/lightswitch/LightSwitchGroovyModel.groovy
 
b/nlpcraft-examples/lightswitch/src/main/java/org/apache/nlpcraft/examples/lightswitch/LightSwitchGroovyModel.groovy
index 5336e87..27d3999 100644
--- 
a/nlpcraft-examples/lightswitch/src/main/java/org/apache/nlpcraft/examples/lightswitch/LightSwitchGroovyModel.groovy
+++ 
b/nlpcraft-examples/lightswitch/src/main/java/org/apache/nlpcraft/examples/lightswitch/LightSwitchGroovyModel.groovy
@@ -35,7 +35,7 @@ class LightSwitchGroovyModel extends NCModelAdapter {
     LightSwitchGroovyModel() {
         super(
             new NCModelConfig("nlpcraft.lightswitch.java.ex", "LightSwitch 
Example Model", "1.0"),
-            new 
NCModelPipelineBuilder().withLanguage("EN").withEntityParser(new 
NCEnSemanticEntityParser("lightswitch_model.yaml")).build()
+            new NCModelPipelineBuilder().withLanguage("EN").withSemantic("EN", 
"lightswitch_model.yaml").build()
         )
     }
 
diff --git 
a/nlpcraft-examples/lightswitch/src/main/java/org/apache/nlpcraft/examples/lightswitch/LightSwitchJavaModel.java
 
b/nlpcraft-examples/lightswitch/src/main/java/org/apache/nlpcraft/examples/lightswitch/LightSwitchJavaModel.java
index ea1361a..b3058b8 100644
--- 
a/nlpcraft-examples/lightswitch/src/main/java/org/apache/nlpcraft/examples/lightswitch/LightSwitchJavaModel.java
+++ 
b/nlpcraft-examples/lightswitch/src/main/java/org/apache/nlpcraft/examples/lightswitch/LightSwitchJavaModel.java
@@ -38,7 +38,7 @@ public class LightSwitchJavaModel extends NCModelAdapter {
     public LightSwitchJavaModel() {
         super(
             new NCModelConfig("nlpcraft.lightswitch.java.ex", "LightSwitch 
Example Model", "1.0"),
-            new 
NCModelPipelineBuilder().withLanguage("EN").withEntityParser(new 
NCEnSemanticEntityParser("lightswitch_model.yaml")).build()
+            new NCModelPipelineBuilder().withLanguage("EN").withSemantic("EN", 
"lightswitch_model.yaml").build()
         );
     }
 
diff --git 
a/nlpcraft-examples/lightswitch/src/main/java/org/apache/nlpcraft/examples/lightswitch/LightSwitchKotlinModel.kt
 
b/nlpcraft-examples/lightswitch/src/main/java/org/apache/nlpcraft/examples/lightswitch/LightSwitchKotlinModel.kt
index c115306..72a4e58 100644
--- 
a/nlpcraft-examples/lightswitch/src/main/java/org/apache/nlpcraft/examples/lightswitch/LightSwitchKotlinModel.kt
+++ 
b/nlpcraft-examples/lightswitch/src/main/java/org/apache/nlpcraft/examples/lightswitch/LightSwitchKotlinModel.kt
@@ -37,7 +37,7 @@ import java.util.stream.Collectors
  */
 class LightSwitchKotlinModel : NCModelAdapter(
     NCModelConfig("nlpcraft.lightswitch.kotlin.ex", "LightSwitch Example 
Model", "1.0"),
-    
NCModelPipelineBuilder().withLanguage("EN").withEntityParser(NCEnSemanticEntityParser("lightswitch_model.yaml")).build()
+    NCModelPipelineBuilder().withLanguage("EN").withSemantic("EN", 
"lightswitch_model.yaml").build()
 ) {
     /**
      * Intent and its on-match callback.
diff --git 
a/nlpcraft-examples/lightswitch/src/main/java/org/apache/nlpcraft/examples/lightswitch/LightSwitchScalaModel.scala
 
b/nlpcraft-examples/lightswitch/src/main/java/org/apache/nlpcraft/examples/lightswitch/LightSwitchScalaModel.scala
index fdbbc0e..451dc4d 100644
--- 
a/nlpcraft-examples/lightswitch/src/main/java/org/apache/nlpcraft/examples/lightswitch/LightSwitchScalaModel.scala
+++ 
b/nlpcraft-examples/lightswitch/src/main/java/org/apache/nlpcraft/examples/lightswitch/LightSwitchScalaModel.scala
@@ -21,7 +21,7 @@ import org.apache.nlpcraft.*
 import org.apache.nlpcraft.internal.util.NCResourceReader
 import org.apache.nlpcraft.nlp.*
 import org.apache.nlpcraft.nlp.entity.parser.semantic.NCSemanticEntityParser
-import org.apache.nlpcraft.nlp.entity.parser.{NCEnSemanticEntityParser, 
NCNLPEntityParser}
+import org.apache.nlpcraft.nlp.entity.parser.*
 import org.apache.nlpcraft.nlp.token.enricher.NCEnStopWordsTokenEnricher
 import org.apache.nlpcraft.nlp.token.parser.NCOpenNLPTokenParser
 
@@ -40,7 +40,7 @@ import 
org.apache.nlpcraft.nlp.token.parser.NCOpenNLPTokenParser
 
 class LightSwitchScalaModel extends NCModelAdapter(
     new NCModelConfig("nlpcraft.lightswitch.java.ex", "LightSwitch Example 
Model", "1.0"),
-    new NCModelPipelineBuilder().withLanguage("EN").withEntityParser(new 
NCEnSemanticEntityParser("lightswitch_model.yaml")).build()
+    new NCModelPipelineBuilder().withLanguage("EN").withSemantic("EN", 
"lightswitch_model.yaml").build()
 ):
     /**
       * Intent and its on-match callback.
diff --git 
a/nlpcraft-examples/time/src/main/java/org/apache/nlpcraft/examples/time/TimeModel.java
 
b/nlpcraft-examples/time/src/main/java/org/apache/nlpcraft/examples/time/TimeModel.java
index e76e667..365f503 100644
--- 
a/nlpcraft-examples/time/src/main/java/org/apache/nlpcraft/examples/time/TimeModel.java
+++ 
b/nlpcraft-examples/time/src/main/java/org/apache/nlpcraft/examples/time/TimeModel.java
@@ -75,7 +75,7 @@ public class TimeModel extends NCModelAdapter {
     public TimeModel() {
         super(
             new NCModelConfig("nlpcraft.time.ex", "Time Example Model", "1.0"),
-            new 
NCModelPipelineBuilder().withLanguage("EN").withEntityParser(new 
NCEnSemanticEntityParser("time_model.yaml")).build()
+            new NCModelPipelineBuilder().withLanguage("EN").withSemantic("EN", 
"time_model.yaml").build()
         );
     }
 
diff --git 
a/nlpcraft-stanford/src/test/scala/org/apache/nlpcraft/nlp/entity/parser/stanford/NCStanfordNLPEntityParserSpec.scala
 
b/nlpcraft-stanford/src/test/scala/org/apache/nlpcraft/nlp/entity/parser/stanford/NCStanfordNLPEntityParserSpec.scala
index d6102fb..49caefa 100644
--- 
a/nlpcraft-stanford/src/test/scala/org/apache/nlpcraft/nlp/entity/parser/stanford/NCStanfordNLPEntityParserSpec.scala
+++ 
b/nlpcraft-stanford/src/test/scala/org/apache/nlpcraft/nlp/entity/parser/stanford/NCStanfordNLPEntityParserSpec.scala
@@ -17,7 +17,8 @@
 
 package org.apache.nlpcraft.nlp.entity.parser.stanford
 
-import org.apache.nlpcraft.nlp.util.*
+import org.apache.nlpcraft.nlp.util.NCTestUtils
+import org.apache.nlpcraft.nlp.util.NCTestRequest
 import org.apache.nlpcraft.nlp.util.stanford.*
 import org.junit.jupiter.api.Test
 
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/NCModelPipelineBuilder.java 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/NCModelPipelineBuilder.java
index 49af889..b8c08fa 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/NCModelPipelineBuilder.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/NCModelPipelineBuilder.java
@@ -17,16 +17,22 @@
 
 package org.apache.nlpcraft;
 
+import opennlp.tools.stemmer.PorterStemmer;
 import org.apache.nlpcraft.internal.util.NCResourceReader;
+import org.apache.nlpcraft.nlp.entity.parser.semantic.NCSemanticElement;
+import org.apache.nlpcraft.nlp.entity.parser.semantic.NCSemanticEntityParser;
+import org.apache.nlpcraft.nlp.entity.parser.semantic.NCSemanticStemmer;
 import org.apache.nlpcraft.nlp.token.enricher.NCEnBracketsTokenEnricher;
 import org.apache.nlpcraft.nlp.token.enricher.NCEnDictionaryTokenEnricher;
 import org.apache.nlpcraft.nlp.token.enricher.NCEnQuotesTokenEnricher;
 import org.apache.nlpcraft.nlp.token.enricher.NCEnStopWordsTokenEnricher;
+import org.apache.nlpcraft.nlp.token.enricher.NCOpenNLPLemmaPosTokenEnricher;
 import org.apache.nlpcraft.nlp.token.enricher.NСEnSwearWordsTokenEnricher;
-import org.apache.nlpcraft.nlp.token.parser.NCENOpenNLPTokenParser;
+import org.apache.nlpcraft.nlp.token.parser.NCOpenNLPTokenParser;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 
@@ -195,10 +201,13 @@ public class NCModelPipelineBuilder {
 
         switch (lang.toUpperCase()) {
             case "EN":
-                tokParser = new NCENOpenNLPTokenParser();
+                tokParser = new 
NCOpenNLPTokenParser(NCResourceReader.getPath("opennlp/en-token.bin"));
 
-                //tokEnrichers.add(new NCEnOpenNLPLemmaPosTokenEnricher());
-                //tokEnrichers.add(new NCEnStopWordsTokenEnricher());
+                tokEnrichers.add(new NCOpenNLPLemmaPosTokenEnricher(
+                    NCResourceReader.getPath("opennlp/en-pos-maxent.bin"),
+                    NCResourceReader.getPath("opennlp/en-lemmatizer.dict")
+                ));
+                tokEnrichers.add(new NCEnStopWordsTokenEnricher());
                 tokEnrichers.add(new 
NСEnSwearWordsTokenEnricher(NCResourceReader.getPath("badfilter/swear_words.txt")));
                 tokEnrichers.add(new NCEnQuotesTokenEnricher());
                 tokEnrichers.add(new NCEnDictionaryTokenEnricher());
@@ -215,6 +224,84 @@ public class NCModelPipelineBuilder {
     }
 
     /**
+     *
+     * @param lang
+     * @param macros
+     * @param elms
+     * @return
+     */
+    public NCModelPipelineBuilder withSemantic(String lang, Map<String, 
String> macros, List<NCSemanticElement> elms) {
+        switch (lang.toUpperCase()) {
+            case "EN":
+                this.entParsers.add(
+                    new NCSemanticEntityParser(
+                        new NCSemanticStemmer() {
+                            private final PorterStemmer ps = new 
PorterStemmer();
+
+                            @Override
+                            public synchronized String stem(String txt) {
+                                return ps.stem(txt.toLowerCase()); // TODO:
+                            }
+                        },
+                        new 
NCOpenNLPTokenParser(NCResourceReader.getPath("opennlp/en-token.bin")),
+                        macros,
+                        elms
+                    )
+                );
+
+                break;
+
+            default:
+                throw new IllegalArgumentException("Unsupported language: " + 
lang);
+        }
+
+        return this;
+    }
+
+    /**
+     *
+     * @param lang
+     * @param elms
+     * @return
+     */
+    public NCModelPipelineBuilder withSemantic(String lang, 
List<NCSemanticElement> elms) {
+        return withSemantic(lang, null, elms);
+    }
+
+    /**
+     *
+     * @param lang
+     * @param src
+     * @return
+     */
+    public NCModelPipelineBuilder withSemantic(String lang, String src) {
+        switch (lang.toUpperCase()) {
+            case "EN":
+                this.entParsers.add(
+                    new NCSemanticEntityParser(
+                        new NCSemanticStemmer() {
+                            private final PorterStemmer ps = new 
PorterStemmer();
+
+                            @Override
+                            public synchronized String stem(String txt) {
+                                return ps.stem(txt.toLowerCase()); // TODO:
+                            }
+                        },
+                        new 
NCOpenNLPTokenParser(NCResourceReader.getPath("opennlp/en-token.bin")),
+                        src
+                    )
+                );
+
+                break;
+
+            default:
+                throw new IllegalArgumentException("Unsupported language: " + 
lang);
+        }
+
+        return this;
+    }
+
+    /**
      * @return
      */
     public NCModelPipeline build() {
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/util/NCResourceReader.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/util/NCResourceReader.scala
index 2f285f4..e4285f0 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/util/NCResourceReader.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/internal/util/NCResourceReader.scala
@@ -47,8 +47,8 @@ object NCResourceReader extends LazyLogging:
         val normDir = if dir != null then dir else DFLT_DIR
         val f = new File(normDir)
 
-        if f.exists then if !f.isDirectory then E(s"Invalid folder: $normDir")
-        else if !f.mkdirs then E(s"Cannot create folder: $normDir")
+        if f.exists && !f.isDirectory then E(s"Invalid folder: $normDir")
+        if !f.exists && !f.mkdirs then E(s"Cannot create folder: $normDir")
 
         f
 
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/nlp/entity/parser/impl/semantic/NCSemanticEntityParserImpl.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/nlp/entity/parser/impl/semantic/NCSemanticEntityParserImpl.scala
index 5b637f0..0f4c08b 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/nlp/entity/parser/impl/semantic/NCSemanticEntityParserImpl.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/nlp/entity/parser/impl/semantic/NCSemanticEntityParserImpl.scala
@@ -178,7 +178,7 @@ class NCSemanticEntityParserImpl(
     scrType: NCSemanticSourceType = null
 ) extends NCEntityParser with LazyLogging:
     require(stemmer != null && parser != null)
-    require(macros != null && elements != null || mdlSrc != null && scrType != 
null)
+    require(elements != null || mdlSrc != null && scrType != null)
 
     private var synsHolder: NCSemanticSynonymsHolder = _
     private var elemsMap: Map[String, NCSemanticElement] = _
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/nlp/token/parser/NCENOpenNLPTokenParser.java
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/nlp/token/parser/NCENOpenNLPTokenParser.java
deleted file mode 100644
index 832c093..0000000
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/nlp/token/parser/NCENOpenNLPTokenParser.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.nlpcraft.nlp.token.parser;
-
-import org.apache.nlpcraft.internal.util.NCResourceReader;
-import org.apache.nlpcraft.nlp.token.parser.NCOpenNLPTokenParser;
-
-/*
- *
- */
-public class NCENOpenNLPTokenParser extends NCOpenNLPTokenParser {
-    public NCENOpenNLPTokenParser() {
-        super(NCResourceReader.getPath("opennlp/en-token.bin"));
-    }
-}
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelCallbacksSpec.scala
 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelCallbacksSpec.scala
index b749f4e..6da1b1d 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelCallbacksSpec.scala
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelCallbacksSpec.scala
@@ -19,10 +19,9 @@ package org.apache.nlpcraft.internal.impl
 
 import org.apache.nlpcraft.*
 import org.apache.nlpcraft.NCResultType.*
-import org.apache.nlpcraft.nlp.entity.parser.NCEnSemanticEntityParser
+import org.apache.nlpcraft.nlp.entity.parser.*
 import org.apache.nlpcraft.nlp.entity.parser.semantic.*
-import org.apache.nlpcraft.nlp.util.NCTestModelAdapter
-import org.apache.nlpcraft.nlp.util.opennlp.*
+import org.apache.nlpcraft.nlp.util.*
 import org.junit.jupiter.api.*
 
 import scala.jdk.CollectionConverters.*
@@ -63,9 +62,7 @@ class NCModelCallbacksSpec:
             override def onRejection(ctx: NCIntentMatch, e: NCRejection): 
NCResult = getOrElse(RejectionNotNull, RESULT_REJECTION, null)
             override def onError(ctx: NCContext, e: Throwable): NCResult = 
getOrElse(ErrorNotNull, RESULT_ERROR, null)
 
-    MDL.getPipeline.getEntityParsers.add(
-        new NCEnSemanticEntityParser(Seq(NCSemanticTestElement("x")).asJava)
-    )
+    
MDL.getPipeline.getEntityParsers.add(NCTestUtils.mkENSemanticParser(Seq(NCSemanticTestElement("x")).asJava))
 
     /**
       *
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 acc0c8f..eb3df69 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
@@ -18,10 +18,9 @@
 package org.apache.nlpcraft.internal.impl
 
 import org.apache.nlpcraft.*
-import org.apache.nlpcraft.nlp.entity.parser.NCEnSemanticEntityParser
+import org.apache.nlpcraft.nlp.entity.parser.*
 import org.apache.nlpcraft.nlp.entity.parser.semantic.NCSemanticEntityParser
-import org.apache.nlpcraft.nlp.util.NCTestModelAdapter
-import org.apache.nlpcraft.nlp.util.opennlp.*
+import org.apache.nlpcraft.nlp.util.*
 import org.junit.jupiter.api.Test
 
 import scala.jdk.CollectionConverters.*
@@ -30,7 +29,7 @@ import scala.util.Using
 class NCModelClientSpec:
     private def test0(mdl: NCTestModelAdapter): Unit =
         mdl.getPipeline.getEntityParsers.add(
-            new NCEnSemanticEntityParser("models/lightswitch_model.yaml")
+            NCTestUtils.mkENSemanticParser("models/lightswitch_model.yaml")
         )
 
         Using.resource(new NCModelClient(mdl)) { client =>
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelPingPongSpec.scala
 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelPingPongSpec.scala
index 42ffc06..2650993 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelPingPongSpec.scala
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelPingPongSpec.scala
@@ -19,10 +19,9 @@ package org.apache.nlpcraft.internal.impl
 
 import org.apache.nlpcraft.*
 import org.apache.nlpcraft.NCResultType.*
-import org.apache.nlpcraft.nlp.entity.parser.NCEnSemanticEntityParser
+import org.apache.nlpcraft.nlp.entity.parser.*
 import org.apache.nlpcraft.nlp.entity.parser.semantic.{NCSemanticTestElement 
as STE, *}
-import org.apache.nlpcraft.nlp.util.NCTestModelAdapter
-import org.apache.nlpcraft.nlp.util.opennlp.*
+import org.apache.nlpcraft.nlp.util.*
 import org.junit.jupiter.api.*
 
 import scala.jdk.CollectionConverters.*
@@ -61,7 +60,7 @@ class NCModelPingPongSpec:
                 R(ASK_RESULT, s"Some request by: ${other.mkText()}")
 
     MDL.getPipeline.getEntityParsers.add(
-        new NCEnSemanticEntityParser(Seq(STE("command"), STE("confirm"), 
STE("other")).asJava)
+        NCTestUtils.mkENSemanticParser(Seq(STE("command"), STE("confirm"), 
STE("other")).asJava)
     )
 
     @BeforeEach
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelPipelineManagerSpec.scala
 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelPipelineManagerSpec.scala
index ef7861c..00e3c07 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelPipelineManagerSpec.scala
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/NCModelPipelineManagerSpec.scala
@@ -18,11 +18,10 @@
 package org.apache.nlpcraft.internal.impl
 
 import org.apache.nlpcraft.*
-import org.apache.nlpcraft.nlp.entity.parser.NCEnSemanticEntityParser
+import org.apache.nlpcraft.nlp.entity.parser.*
 import org.apache.nlpcraft.nlp.entity.parser.semantic.*
 import org.apache.nlpcraft.nlp.entity.parser.impl.NCNLPEntityParserImpl
 import org.apache.nlpcraft.nlp.util.*
-import org.apache.nlpcraft.nlp.util.opennlp.*
 import org.junit.jupiter.api.*
 import org.junit.jupiter.api.function.Executable
 
@@ -44,7 +43,7 @@ class NCModelPipelineManagerSpec:
         def test(txt: String, variantCnt: Int, elements: NCSemanticElement*): 
Unit =
             val pipeline = EN_PIPELINE.clone()
 
-            val parser = new NCEnSemanticEntityParser(elements.asJava)
+            val parser = NCTestUtils.mkENSemanticParser(elements.asJava)
             pipeline.getEntityParsers.clear()
             pipeline.getEntityParsers.add(parser)
 
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/scan/NCModelIntentsInvalidArgsSpec.scala
 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/scan/NCModelIntentsInvalidArgsSpec.scala
index ac5f7e7..a91542d 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/scan/NCModelIntentsInvalidArgsSpec.scala
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/scan/NCModelIntentsInvalidArgsSpec.scala
@@ -20,7 +20,6 @@ package org.apache.nlpcraft.internal.impl.scan
 import org.apache.nlpcraft.*
 import org.apache.nlpcraft.internal.impl.NCModelScanner
 import org.apache.nlpcraft.nlp.util.*
-import org.apache.nlpcraft.nlp.util.opennlp.*
 import org.junit.jupiter.api.Test
 
 import java.util
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/scan/NCModelIntentsInvalidIntentsSpec.scala
 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/scan/NCModelIntentsInvalidIntentsSpec.scala
index b23dc84..222fd61 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/scan/NCModelIntentsInvalidIntentsSpec.scala
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/scan/NCModelIntentsInvalidIntentsSpec.scala
@@ -20,7 +20,6 @@ package org.apache.nlpcraft.internal.impl.scan
 import org.apache.nlpcraft.*
 import org.apache.nlpcraft.internal.impl.NCModelScanner
 import org.apache.nlpcraft.nlp.util.*
-import org.apache.nlpcraft.nlp.util.opennlp.*
 import org.junit.jupiter.api.Test
 
 import java.util
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/scan/NCModelIntentsNestedSpec.scala
 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/scan/NCModelIntentsNestedSpec.scala
index 833832b..1ae14b9 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/scan/NCModelIntentsNestedSpec.scala
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/scan/NCModelIntentsNestedSpec.scala
@@ -20,7 +20,6 @@ package org.apache.nlpcraft.internal.impl.scan
 import org.apache.nlpcraft.*
 import org.apache.nlpcraft.internal.impl.NCModelScanner
 import org.apache.nlpcraft.nlp.util.*
-import org.apache.nlpcraft.nlp.util.opennlp.*
 import org.junit.jupiter.api.Test
 
 /**
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/scan/NCTestModelJava.java
 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/scan/NCTestModelJava.java
index 1f2763e..11ff772 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/scan/NCTestModelJava.java
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/scan/NCTestModelJava.java
@@ -25,7 +25,7 @@ import org.apache.nlpcraft.NCIntentTerm;
 import org.apache.nlpcraft.NCModel;
 import org.apache.nlpcraft.NCModelAdapter;
 import org.apache.nlpcraft.NCResult;
-import org.apache.nlpcraft.nlp.util.opennlp.NCTestConfigJava;
+import org.apache.nlpcraft.nlp.util.*;
 
 import java.util.List;
 import java.util.Optional;
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/scan/NCTestModelScala.scala
 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/scan/NCTestModelScala.scala
index 8adaa10..4f4cc51 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/scan/NCTestModelScala.scala
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/impl/scan/NCTestModelScala.scala
@@ -19,7 +19,7 @@ package org.apache.nlpcraft.internal.impl.scan
 
 import org.apache.nlpcraft.*
 import org.apache.nlpcraft.nlp.util.NCTestModelAdapter
-import org.apache.nlpcraft.nlp.util.opennlp.*
+import org.apache.nlpcraft.nlp.util.*
 
 /**
   *
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/intent/compiler/NCIDLCompilerSpec.scala
 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/intent/compiler/NCIDLCompilerSpec.scala
index 6214697..eb18e55 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/intent/compiler/NCIDLCompilerSpec.scala
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/intent/compiler/NCIDLCompilerSpec.scala
@@ -18,7 +18,7 @@
 package org.apache.nlpcraft.internal.intent.compiler
 
 import org.apache.nlpcraft.*
-import org.apache.nlpcraft.nlp.util.opennlp.*
+import org.apache.nlpcraft.nlp.util.*
 import org.junit.jupiter.api.Test
 
 /**
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/intent/compiler/functions/NCIDLFunctions.scala
 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/intent/compiler/functions/NCIDLFunctions.scala
index 4fe4b8c..2705f0a 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/intent/compiler/functions/NCIDLFunctions.scala
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/intent/compiler/functions/NCIDLFunctions.scala
@@ -22,7 +22,6 @@ import org.apache.nlpcraft.internal.intent.*
 import org.apache.nlpcraft.internal.intent.compiler.*
 import org.apache.nlpcraft.internal.intent.compiler.functions.*
 import org.apache.nlpcraft.nlp.util.*
-import org.apache.nlpcraft.nlp.util.opennlp.*
 import org.junit.jupiter.api.BeforeEach
 
 import java.util
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/intent/compiler/functions/NCIDLFunctionsModel.scala
 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/intent/compiler/functions/NCIDLFunctionsModel.scala
index 3f9dd12..fa2f41f 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/intent/compiler/functions/NCIDLFunctionsModel.scala
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/internal/intent/compiler/functions/NCIDLFunctionsModel.scala
@@ -18,7 +18,7 @@
 package org.apache.nlpcraft.internal.intent.compiler.functions
 
 import org.apache.nlpcraft.internal.intent.compiler.functions.NCIDLFunctions.*
-import org.apache.nlpcraft.nlp.util.opennlp.*
+import org.apache.nlpcraft.nlp.util.*
 import org.junit.jupiter.api.Test
 
 import scala.language.implicitConversions
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/entity/parser/nlp/NCNLPEntityParserSpec.scala
 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/entity/parser/nlp/NCNLPEntityParserSpec.scala
index ba64e56..e59c34a 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/entity/parser/nlp/NCNLPEntityParserSpec.scala
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/entity/parser/nlp/NCNLPEntityParserSpec.scala
@@ -21,7 +21,6 @@ import org.apache.nlpcraft.*
 import org.apache.nlpcraft.internal.util.NCUtils
 import org.apache.nlpcraft.nlp.entity.parser.*
 import org.apache.nlpcraft.nlp.util.*
-import org.apache.nlpcraft.nlp.util.opennlp.*
 import org.junit.jupiter.api.*
 
 import java.util
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/entity/parser/opennlp/NCOpenNLPEntityParserSpec.scala
 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/entity/parser/opennlp/NCOpenNLPEntityParserSpec.scala
index 1ee651c..0f34c0b 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/entity/parser/opennlp/NCOpenNLPEntityParserSpec.scala
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/entity/parser/opennlp/NCOpenNLPEntityParserSpec.scala
@@ -21,7 +21,6 @@ import org.apache.nlpcraft.*
 import org.apache.nlpcraft.internal.util.*
 import org.apache.nlpcraft.nlp.entity.parser.NCOpenNLPEntityParser
 import org.apache.nlpcraft.nlp.util.*
-import org.apache.nlpcraft.nlp.util.opennlp.*
 import org.junit.jupiter.api.*
 
 import java.util
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/entity/parser/semantic/NCSemanticEntityParserJsonSpec.scala
 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/entity/parser/semantic/NCSemanticEntityParserJsonSpec.scala
index 178908f..e588f4a 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/entity/parser/semantic/NCSemanticEntityParserJsonSpec.scala
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/entity/parser/semantic/NCSemanticEntityParserJsonSpec.scala
@@ -22,7 +22,6 @@ import org.apache.nlpcraft.internal.util.NCUtils
 import org.apache.nlpcraft.nlp.entity.parser.*
 import org.apache.nlpcraft.nlp.token.parser.NCOpenNLPTokenParser
 import org.apache.nlpcraft.nlp.util.*
-import org.apache.nlpcraft.nlp.util.opennlp.*
 import org.junit.jupiter.api.*
 
 import java.util
@@ -35,7 +34,7 @@ import scala.jdk.OptionConverters.RichOptional
   *
   */
 class NCSemanticEntityParserJsonSpec:
-    private val parser = new 
NCEnSemanticEntityParser("models/alarm_model.json")
+    private val parser = 
NCTestUtils.mkENSemanticParser("models/alarm_model.json")
 
     /**
       * 
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/entity/parser/semantic/NCSemanticEntityParserLemmaSpec.scala
 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/entity/parser/semantic/NCSemanticEntityParserLemmaSpec.scala
index 8ca532e..1ad67ef 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/entity/parser/semantic/NCSemanticEntityParserLemmaSpec.scala
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/entity/parser/semantic/NCSemanticEntityParserLemmaSpec.scala
@@ -21,11 +21,9 @@ import org.apache.nlpcraft.*
 import org.apache.nlpcraft.internal.impl.*
 import org.apache.nlpcraft.internal.util.*
 import org.apache.nlpcraft.nlp.entity.parser.*
-import 
org.apache.nlpcraft.nlp.token.enricher.{NCENOpenNlpLemmaPosTokenEnricher, 
NCENStopWordsTokenEnricher}
-import org.apache.nlpcraft.nlp.token.enricher.en.*
-import org.apache.nlpcraft.nlp.token.parser.NCENOpenNLPTokenParser
-import org.apache.nlpcraft.nlp.util.NCTestUtils
-import org.apache.nlpcraft.nlp.util.opennlp.*
+import org.apache.nlpcraft.nlp.token.enricher.*
+import org.apache.nlpcraft.nlp.token.parser.*
+import org.apache.nlpcraft.nlp.util.*
 import org.junit.jupiter.api.*
 
 import java.util
@@ -37,9 +35,12 @@ import scala.jdk.CollectionConverters.*
   *
   */
 class NCSemanticEntityParserLemmaSpec:
-    private val lemmaTokEnricher = new NCENOpenNlpLemmaPosTokenEnricher
-    private val swTokEnricher = new NCENStopWordsTokenEnricher
-    private val tokParser = new NCENOpenNLPTokenParser
+    private val lemmaTokEnricher = new NCOpenNLPLemmaPosTokenEnricher(
+        NCResourceReader.getPath("opennlp/en-pos-maxent.bin"),
+        NCResourceReader.getPath("opennlp/en-lemmatizer.dict")
+    )
+    private val swTokEnricher = new NCEnStopWordsTokenEnricher
+    private val tokParser = new 
NCOpenNLPTokenParser(NCResourceReader.getPath("opennlp/en-token.bin"))
     private val lemmaStemmer =
         new NCSemanticStemmer():
             override def stem(txt: String): String = if wrapped(txt) then 
unwrap(txt) else UUID.randomUUID().toString
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/entity/parser/semantic/NCSemanticEntityParserSpec.scala
 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/entity/parser/semantic/NCSemanticEntityParserSpec.scala
index 2275cab..e54a38a 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/entity/parser/semantic/NCSemanticEntityParserSpec.scala
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/entity/parser/semantic/NCSemanticEntityParserSpec.scala
@@ -21,9 +21,7 @@ import org.apache.nlpcraft.*
 import org.apache.nlpcraft.internal.util.*
 import org.apache.nlpcraft.nlp.entity.parser.*
 import org.apache.nlpcraft.nlp.token.enricher.*
-import org.apache.nlpcraft.nlp.token.enricher.en.*
 import org.apache.nlpcraft.nlp.util.*
-import org.apache.nlpcraft.nlp.util.opennlp.*
 import org.junit.jupiter.api.*
 
 import java.util
@@ -39,7 +37,7 @@ class NCSemanticEntityParserSpec:
     import NCSemanticTestElement as E
 
     private val parser =
-        new NCEnSemanticEntityParser(
+        NCTestUtils.mkENSemanticParser(
             Seq(
                 // Standard.
                 E("t1", synonyms = Set("t1")),
@@ -58,8 +56,11 @@ class NCSemanticEntityParserSpec:
             ).asJava
         )
 
-    private val stopWordsEnricher = new NCENStopWordsTokenEnricher()
-    private val lemmaPosEnricher = new NCENOpenNlpLemmaPosTokenEnricher()
+    private val stopWordsEnricher = new NCEnStopWordsTokenEnricher()
+    private val lemmaPosEnricher = new NCOpenNLPLemmaPosTokenEnricher(
+        NCResourceReader.getPath("opennlp/en-pos-maxent.bin"),
+        NCResourceReader.getPath("opennlp/en-lemmatizer.dict")
+    )
 
     /**
       *
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/entity/parser/semantic/NCSemanticEntityParserYamlSpec.scala
 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/entity/parser/semantic/NCSemanticEntityParserYamlSpec.scala
index e1022e7..9a1df76 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/entity/parser/semantic/NCSemanticEntityParserYamlSpec.scala
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/entity/parser/semantic/NCSemanticEntityParserYamlSpec.scala
@@ -21,7 +21,6 @@ import org.apache.nlpcraft.*
 import org.apache.nlpcraft.internal.util.NCUtils
 import org.apache.nlpcraft.nlp.entity.parser.*
 import org.apache.nlpcraft.nlp.util.*
-import org.apache.nlpcraft.nlp.util.opennlp.*
 import org.junit.jupiter.api.*
 
 import java.util
@@ -33,7 +32,7 @@ import scala.jdk.OptionConverters.RichOptional
   *
   */
 class NCSemanticEntityParserYamlSpec:
-    private val parser = new 
NCEnSemanticEntityParser("models/lightswitch_model.yaml")
+    private val parser = 
NCTestUtils.mkENSemanticParser("models/lightswitch_model.yaml")
 
     /**
       * 
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/entity/parser/semantic/NCSemanticTestElement.scala
 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/entity/parser/semantic/NCSemanticTestElement.scala
index 76528e3..9b24be3 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/entity/parser/semantic/NCSemanticTestElement.scala
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/entity/parser/semantic/NCSemanticTestElement.scala
@@ -17,7 +17,7 @@
 
 package org.apache.nlpcraft.nlp.entity.parser.semantic
 
-import org.apache.nlpcraft.nlp.entity.parser.NCSemanticElement
+import org.apache.nlpcraft.nlp.entity.parser.*
 import org.apache.nlpcraft.*
 
 import java.util
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/token/enricher/en/NCBracketsTokenEnricherSpec.scala
 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/token/enricher/en/NCBracketsTokenEnricherSpec.scala
index 78ae9d4..e7cbc3e 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/token/enricher/en/NCBracketsTokenEnricherSpec.scala
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/token/enricher/en/NCBracketsTokenEnricherSpec.scala
@@ -21,7 +21,6 @@ import org.apache.nlpcraft.*
 import org.apache.nlpcraft.nlp.token.enricher.*
 import org.apache.nlpcraft.nlp.token.enricher.en.*
 import org.apache.nlpcraft.nlp.util.*
-import org.apache.nlpcraft.nlp.util.opennlp.*
 import org.junit.jupiter.api.*
 
 import scala.jdk.CollectionConverters.*
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/token/enricher/en/NCDictionaryTokenEnricherSpec.scala
 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/token/enricher/en/NCDictionaryTokenEnricherSpec.scala
index 3cc706e..86d1eb3 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/token/enricher/en/NCDictionaryTokenEnricherSpec.scala
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/token/enricher/en/NCDictionaryTokenEnricherSpec.scala
@@ -21,7 +21,6 @@ import org.apache.nlpcraft.internal.util.NCResourceReader
 import org.apache.nlpcraft.nlp.token.enricher.en.*
 import org.apache.nlpcraft.nlp.token.enricher.*
 import org.apache.nlpcraft.nlp.util.*
-import org.apache.nlpcraft.nlp.util.opennlp.*
 import org.junit.jupiter.api.*
 
 import scala.jdk.CollectionConverters.*
@@ -32,7 +31,11 @@ import scala.jdk.CollectionConverters.*
 class NCDictionaryTokenEnricherSpec:
     private val dictEnricher = new NCEnDictionaryTokenEnricher()
 
-    private val lemmaPosEnricher = new NCEnOpenNLPLemmaPosTokenEnricher()
+    private val lemmaPosEnricher =
+        new NCOpenNLPLemmaPosTokenEnricher(
+            NCResourceReader.getPath("opennlp/en-pos-maxent.bin"),
+            NCResourceReader.getPath("opennlp/en-lemmatizer.dict")
+        )
 
     @Test
     def test(): Unit =
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/token/enricher/en/NCQuotesTokenEnricherSpec.scala
 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/token/enricher/en/NCQuotesTokenEnricherSpec.scala
index 28f7547..1aaa7b7 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/token/enricher/en/NCQuotesTokenEnricherSpec.scala
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/token/enricher/en/NCQuotesTokenEnricherSpec.scala
@@ -22,7 +22,6 @@ import org.apache.nlpcraft.internal.util.NCResourceReader
 import org.apache.nlpcraft.nlp.token.enricher.en.*
 import org.apache.nlpcraft.nlp.token.enricher.*
 import org.apache.nlpcraft.nlp.util.*
-import org.apache.nlpcraft.nlp.util.opennlp.*
 import org.junit.jupiter.api.*
 
 import scala.jdk.CollectionConverters.*
@@ -31,7 +30,11 @@ import scala.jdk.CollectionConverters.*
   *
   */
 class NCQuotesTokenEnricherSpec:
-    private val lemmaPosEnricher = new NCEnOpenNLPLemmaPosTokenEnricher
+    private val lemmaPosEnricher = 
+        new NCOpenNLPLemmaPosTokenEnricher(
+            NCResourceReader.getPath("opennlp/en-pos-maxent.bin"), 
+            NCResourceReader.getPath("opennlp/en-lemmatizer.dict")
+        )
     private val quoteEnricher = new NCEnQuotesTokenEnricher
 
     /**
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/token/enricher/en/NCStopWordsEnricherSpec.scala
 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/token/enricher/en/NCStopWordsEnricherSpec.scala
index 3b0f4a3..3ca27cb 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/token/enricher/en/NCStopWordsEnricherSpec.scala
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/token/enricher/en/NCStopWordsEnricherSpec.scala
@@ -19,10 +19,9 @@ package org.apache.nlpcraft.nlp.token.enricher.en
 
 import org.apache.nlpcraft.*
 import org.apache.nlpcraft.internal.util.NCResourceReader
-import org.apache.nlpcraft.nlp.token.enricher.en.*
 import org.apache.nlpcraft.nlp.token.enricher.*
+import org.apache.nlpcraft.nlp.token.enricher.en.*
 import org.apache.nlpcraft.nlp.util.*
-import org.apache.nlpcraft.nlp.util.opennlp.*
 import org.junit.jupiter.api.*
 
 import java.util
@@ -32,7 +31,10 @@ import scala.jdk.CollectionConverters.*
   *
   */
 class NCStopWordsEnricherSpec:
-    private val lemmaPosEnricher = new NCEnOpenNLPLemmaPosTokenEnricher
+    private val lemmaPosEnricher = new NCOpenNLPLemmaPosTokenEnricher(
+        NCResourceReader.getPath("opennlp/en-pos-maxent.bin"), 
+        NCResourceReader.getPath("opennlp/en-lemmatizer.dict")
+    )
 
     /**
       *
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/token/enricher/en/NCSwearWordsTokenEnricherSpec.scala
 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/token/enricher/en/NCSwearWordsTokenEnricherSpec.scala
index 48fb6e8..2f1b242 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/token/enricher/en/NCSwearWordsTokenEnricherSpec.scala
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/token/enricher/en/NCSwearWordsTokenEnricherSpec.scala
@@ -21,7 +21,6 @@ import org.apache.nlpcraft.internal.util.NCResourceReader
 import org.apache.nlpcraft.nlp.token.enricher.NСEnSwearWordsTokenEnricher
 import org.apache.nlpcraft.nlp.token.enricher.en.*
 import org.apache.nlpcraft.nlp.util.*
-import org.apache.nlpcraft.nlp.util.opennlp.*
 import org.junit.jupiter.api.*
 
 import scala.jdk.CollectionConverters.*
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/token/enricher/en/impl/NCStopWordsImplSpec.scala
 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/token/enricher/en/impl/NCStopWordsImplSpec.scala
index 3cb8bea..e30a6dc 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/token/enricher/en/impl/NCStopWordsImplSpec.scala
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/token/enricher/en/impl/NCStopWordsImplSpec.scala
@@ -21,7 +21,6 @@ import org.apache.nlpcraft.*
 import 
org.apache.nlpcraft.nlp.token.enricher.impl.NCEnStopWordsTokenEnricherImpl
 import org.apache.nlpcraft.nlp.token.enricher.en.*
 import org.apache.nlpcraft.nlp.util.*
-import org.apache.nlpcraft.nlp.util.opennlp.*
 import org.junit.jupiter.api.*
 
 import scala.jdk.CollectionConverters.*
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/token/parser/opennlp/NCOpenNLPTokenParserSpec.scala
 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/token/parser/opennlp/NCOpenNLPTokenParserSpec.scala
index b606464..d558f54 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/token/parser/opennlp/NCOpenNLPTokenParserSpec.scala
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/token/parser/opennlp/NCOpenNLPTokenParserSpec.scala
@@ -23,7 +23,6 @@ import org.apache.nlpcraft.internal.util.NCResourceReader
 import org.apache.nlpcraft.nlp.token.enricher.en.*
 import org.apache.nlpcraft.nlp.token.enricher.*
 import org.apache.nlpcraft.nlp.util.*
-import org.apache.nlpcraft.nlp.util.opennlp.*
 import org.junit.jupiter.api.*
 
 import java.util
@@ -33,7 +32,11 @@ import scala.jdk.CollectionConverters.*
   *
   */
 class NCOpenNLPTokenParserSpec:
-    private val lemmaPosEnricher = new NCEnOpenNLPLemmaPosTokenEnricher
+    private val lemmaPosEnricher =
+        new NCOpenNLPLemmaPosTokenEnricher(
+            NCResourceReader.getPath("opennlp/en-pos-maxent.bin"),
+            NCResourceReader.getPath("opennlp/en-lemmatizer.dict")
+        )
     private val stopEnricher = new NCEnStopWordsTokenEnricher(null, null)
 
     private def isStopWord(t: NCToken): Boolean = t.get[Boolean]("stopword")
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/util/opennlp/NCTestConfig.scala
 b/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/util/NCTestConfig.scala
similarity index 95%
rename from 
nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/util/opennlp/NCTestConfig.scala
rename to 
nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/util/NCTestConfig.scala
index 42b885e..bb0dfdf 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/util/opennlp/NCTestConfig.scala
+++ b/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/util/NCTestConfig.scala
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.nlpcraft.nlp.util.opennlp
+package org.apache.nlpcraft.nlp.util
 
 import org.apache.nlpcraft.NCModelConfig
 import org.apache.nlpcraft.nlp.token.parser.NCOpenNLPTokenParser
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/util/opennlp/NCTestConfigJava.java
 b/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/util/NCTestConfigJava.java
similarity index 96%
rename from 
nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/util/opennlp/NCTestConfigJava.java
rename to 
nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/util/NCTestConfigJava.java
index e11b77b..3ddeed2 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/util/opennlp/NCTestConfigJava.java
+++ b/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/util/NCTestConfigJava.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.nlpcraft.nlp.util.opennlp;
+package org.apache.nlpcraft.nlp.util;
 
 import org.apache.nlpcraft.NCModelConfig;
 import org.apache.nlpcraft.internal.util.NCResourceReader;
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/util/NCTestModelAdapter.scala 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/util/NCTestModelAdapter.scala
index 2151173..f088130 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/util/NCTestModelAdapter.scala
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/util/NCTestModelAdapter.scala
@@ -18,7 +18,7 @@
 package org.apache.nlpcraft.nlp.util
 
 import org.apache.nlpcraft.*
-import org.apache.nlpcraft.nlp.util.opennlp.*
+import org.apache.nlpcraft.nlp.util.*
 
 /**
   *
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/util/NCTestUtils.scala 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/util/NCTestUtils.scala
index 971ad4f..cf5aed4 100644
--- a/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/util/NCTestUtils.scala
+++ b/nlpcraft/src/test/scala/org/apache/nlpcraft/nlp/util/NCTestUtils.scala
@@ -19,9 +19,12 @@ package org.apache.nlpcraft.nlp.util
 
 import org.apache.nlpcraft.*
 import org.apache.nlpcraft.internal.ascii.NCAsciiTable
+import org.apache.nlpcraft.internal.util.NCResourceReader
+import org.apache.nlpcraft.nlp.entity.parser.semantic.*
+import org.apache.nlpcraft.nlp.token.parser.NCOpenNLPTokenParser
 
 import java.util
-import java.util.List as JList
+import java.util.{Map, List as JList}
 import scala.jdk.CollectionConverters.*
 import scala.jdk.OptionConverters.RichOptional
 import scala.util.Using
@@ -116,4 +119,38 @@ object NCTestUtils:
                     ask()
                     require(false)
                 catch case e: Exception => println(s"Expected error: 
${e.getMessage}")
-        }
\ No newline at end of file
+        }
+
+    /**
+      *
+      * @param elms
+      * @param macros
+      * @return
+      */
+    def mkENSemanticParser(elms: util.List[NCSemanticElement], macros: 
util.Map[String, String] = null): NCSemanticEntityParser =
+        val s = new opennlp.tools.stemmer.PorterStemmer
+
+        new NCSemanticEntityParser(
+            new NCSemanticStemmer():
+                override def stem(txt: String): String = 
s.stem(txt.toLowerCase)
+            ,
+            new 
NCOpenNLPTokenParser(NCResourceReader.getPath("opennlp/en-token.bin")),
+            macros,
+            elms
+        )
+
+    /**
+      *
+      * @param src
+      * @return
+      */
+    def mkENSemanticParser(src: String): NCSemanticEntityParser =
+        val s = new opennlp.tools.stemmer.PorterStemmer
+
+        new NCSemanticEntityParser(
+            new NCSemanticStemmer():
+                override def stem(txt: String): String = 
s.stem(txt.toLowerCase)
+            ,
+            new 
NCOpenNLPTokenParser(NCResourceReader.getPath("opennlp/en-token.bin")),
+            src
+        )

Reply via email to