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

sergeykamov pushed a commit to branch NLPCRAFT-468
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git


The following commit(s) were added to refs/heads/NLPCRAFT-468 by this push:
     new bef3404  WIP.
bef3404 is described below

commit bef3404946b82509b369a24840ccd6042f533178
Author: Sergey Kamov <[email protected]>
AuthorDate: Tue Oct 12 22:51:00 2021 +0300

    WIP.
---
 .../org/apache/nlpcraft/spring/NlpCraftConfig.java |   1 +
 .../org/apache/nlpcraft/model/NCConversation.java  |   2 +-
 .../org/apache/nlpcraft/model/NCMetadata.java      | 120 +++++++++++++++++++++
 .../org/apache/nlpcraft/model/NCModelConfig.java   |  13 +--
 .../scala/org/apache/nlpcraft/model/NCRequest.java |   1 -
 .../scala/org/apache/nlpcraft/model/NCToken.java   |  19 +---
 .../model/builders/NCModelConfigBuilder.java       |   8 +-
 .../detectors/NCDefaultStopWordsDetector.java      |   4 +-
 .../detectors/NCDefaultSwearWordsDetector.java     |   4 +-
 .../detectors/NCSimpleWordsDetector.java           |   4 +-
 .../ner/synonyms/NCSynonymsNerElement.java         |   3 +-
 .../org/apache/nlpcraft/model/nlp/NCNlpToken.java  |   7 +-
 ...{NCNlpDetector.java => NCNlpWordsDetector.java} |   2 +-
 .../org/apache/nlpcraft/rest/NCAskRequest.java     |   2 +-
 .../src/test/java/org/apache/nlpcraft/NCSpec.java  |  46 +++++++-
 15 files changed, 189 insertions(+), 47 deletions(-)

diff --git 
a/nlpcraft-spring/src/test/java/org/apache/nlpcraft/spring/NlpCraftConfig.java 
b/nlpcraft-spring/src/test/java/org/apache/nlpcraft/spring/NlpCraftConfig.java
index f2469e6..08b2c8a 100644
--- 
a/nlpcraft-spring/src/test/java/org/apache/nlpcraft/spring/NlpCraftConfig.java
+++ 
b/nlpcraft-spring/src/test/java/org/apache/nlpcraft/spring/NlpCraftConfig.java
@@ -47,6 +47,7 @@ public class NlpCraftConfig {
             new NCModelBuilder().
                 withConfig(cfg).
                 withIntents(Arrays.asList(intent1, intent2)).
+                withIntentsClasses(Arrays.asList(NlpCraftConfig.class)).
                 getModel();
     }
 
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCConversation.java 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCConversation.java
index fd30366..6de2333 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCConversation.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCConversation.java
@@ -23,7 +23,7 @@ import java.util.List;
 import java.util.function.Predicate;
 
 /**
- * TODO: drop reference to NCSynonymsNerElement.
+ * TODO: javadoc. drop reference to NCSynonymsNerElement.
  * Conversation container for unique combination of user and data model.
  * <p>
  * Conversation management is based on idea of a short-term-memory (STM). STM 
can be viewed as a condensed
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCMetadata.java 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCMetadata.java
new file mode 100644
index 0000000..91c10f4
--- /dev/null
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCMetadata.java
@@ -0,0 +1,120 @@
+/*
+ * 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
+ *
+ *      http://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.model;
+
+import org.apache.nlpcraft.common.*;
+import java.util.*;
+
+/**
+ * Provides support for mutable runtime-only metadata.
+ * <p>
+ * Read full documentation in <a target=_ 
href="https://nlpcraft.apache.org/data-model.html";>Data Model</a> section and 
review
+ * <a target=_ 
href="https://github.com/apache/incubator-nlpcraft/tree/master/nlpcraft-examples";>examples</a>.
+ */
+public interface NCMetadata {
+    /**
+     * Factory for creating metadata out of standard map.
+     *
+     * @param map Map to convert to metadata.
+     * @return Newly created metadata container.
+     */
+    static NCMetadata apply(Map<String, Object> map) {
+        return () -> map;
+    }
+
+    /**
+     * Gets mutable metadata underlying container.
+     * Returned map can be used to mutate the metadata or perform any other 
operations.
+     *
+     * @return Mutable, underlying metadata container.
+     * @see #meta(String)
+     * @see #metaOpt(String)
+     * @see #meta(String, Object)
+     */
+    Map<String, Object> getMetadata();
+
+    /**
+     * Shortcut method to get given optional metadata property. Equivalent to:
+     * <pre class="brush: java">
+     *      Optional.ofNullable((T)getMetadata().get(prop));
+     * </pre>
+     *
+     * @param prop Metadata property name.
+     * @param <T> Type of the metadata property.
+     * @return Metadata optional property value.
+     */
+    @SuppressWarnings("unchecked")
+    default <T> Optional<T> metaOpt(String prop) {
+        return Optional.ofNullable((T)getMetadata().get(prop));
+    }
+
+    /**
+     * Shortcut method to get given metadata property. Equivalent to:
+     * <pre class="brush: java">
+     *      (T)getMetadata().get(prop);
+     * </pre>
+     *
+     * @param prop Metadata property name.
+     * @param <T> Type of the metadata property.
+     * @return Metadata property value or {@code null} if given metadata 
property not found.
+     */
+    @SuppressWarnings("unchecked")
+    default <T> T meta(String prop) {
+        return (T)getMetadata().get(prop);
+    }
+
+    /**
+     * Shortcut method to get given mandatory metadata property. Equivalent to:
+     * <pre class="brush: java">
+     *     T t = (T)getMetadata().get(prop);
+     *     if (t == null)
+     *         throw new NCException("Mandatory metadata property not found: " 
+ prop);
+     *     else
+     *         return t;
+     * </pre>
+     *
+     * @param prop Metadata property name.
+     * @param <T> Type of the metadata property.
+     * @return Metadata property value or throws an exception if given 
metadata property not found.
+     * @throws NCException Thrown if given metadata property not found.
+     */
+    default <T> T metax(String prop) throws NCException {
+        T t = meta(prop);
+
+        if (t == null)
+            throw new NCException("Mandatory metadata property not found: " + 
prop);
+        else
+            return t;
+    }
+
+    /**
+     * Shortcut method to get given metadata property. Equivalent to:
+     * <pre class="brush: java">
+     *      getMetadata().get(tokId, prop, dflt);
+     * </pre>
+     *
+     * @param prop Metadata property name.
+     * @param dflt Default value to return if specified one isn't set.
+     * @param <T> Type of the metadata property.
+     * @return Metadata property value or default value if one isn't set.
+     */
+    @SuppressWarnings("unchecked")
+    default <T> T meta(String prop, T dflt) {
+        return (T)getMetadata().getOrDefault(prop, dflt);
+    }
+}
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCModelConfig.java 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCModelConfig.java
index d8d8856..25f437c 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCModelConfig.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCModelConfig.java
@@ -23,7 +23,7 @@ import 
org.apache.nlpcraft.model.components.ner.synonyms.NCSynonymsNerElement;
 import org.apache.nlpcraft.model.components.tokenizer.NCOpenNlpTokenizer;
 import org.apache.nlpcraft.model.nlp.NCNlpNerParser;
 import org.apache.nlpcraft.model.nlp.NCNlpTokenizer;
-import org.apache.nlpcraft.model.nlp.NCNlpDetector;
+import org.apache.nlpcraft.model.nlp.NCNlpWordsDetector;
 
 import java.time.Duration;
 import java.util.Collections;
@@ -699,17 +699,14 @@ public interface NCModelConfig {
     }
 
     // TODO: dropped. getSuspiciousWords,
-    //  TODO: dropped - getAdditionalStopWords, getExcludedStopWords - just 
override if necessary getStopWordsDetector.
-
-    default NCNlpDetector getStopWordsDetector() {
+    // TODO: dropped - getAdditionalStopWords, getExcludedStopWords - just 
override if necessary getStopWordsDetector.
+    default NCNlpWordsDetector getStopWordsDetector() {
         return new NCDefaultStopWordsDetector();
     }
-
-    default NCNlpDetector getSwearWordsDetector() {
+    default NCNlpWordsDetector getSwearWordsDetector() {
         return new NCDefaultSwearWordsDetector();
     }
-
-    default NCNlpDetector getSuspiciousWordsDetector() {
+    default NCNlpWordsDetector getSuspiciousWordsDetector() {
         return null;
     }
 
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCRequest.java 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCRequest.java
index d8db100..74e7ede 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCRequest.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCRequest.java
@@ -27,7 +27,6 @@ import java.util.Optional;
  */
 public interface NCRequest {
     /**
-     * TODO: optional?
      * Gets descriptor of the user on behalf of which this request was 
submitted.
      *
      * @return User descriptor.
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCToken.java 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCToken.java
index e9517d4..a7ca808 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCToken.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCToken.java
@@ -29,21 +29,13 @@ import java.util.Map;
  *
  * @see NCDefaultNerElement
  */
-public interface NCToken {
-    /**
-     * TODO: drop it.
-     * Gets reference to the model this token belongs to.
-     *
-     * @return Model reference.
-     */
-    NCModel getModel();
-
+public interface NCToken extends NCMetadata {
     /**
      * Gets ID of the server request this token is part of.
      *
      * @return ID of the server request this token is part of.
      */
-    String getServerRequestId();
+    String getRequestId();
 
     /**
      * If this token represents user defined model element this method returns
@@ -275,11 +267,6 @@ public interface NCToken {
      */
     String getUnid();
 
-    // TODO: maybe add it?
+    // TODO: javadoc
     List<Integer> getWordsIndexes();
-
-    // TODO: maybe add it?
-    default Map<String, Object> getMetadata() {
-        return Collections.emptyMap();
-    }
 }
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/builders/NCModelConfigBuilder.java
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/builders/NCModelConfigBuilder.java
index ecb6a06..b622753 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/builders/NCModelConfigBuilder.java
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/builders/NCModelConfigBuilder.java
@@ -18,7 +18,7 @@
 package org.apache.nlpcraft.model.builders;
 
 import org.apache.nlpcraft.model.NCModelConfig;
-import org.apache.nlpcraft.model.nlp.NCNlpDetector;
+import org.apache.nlpcraft.model.nlp.NCNlpWordsDetector;
 import org.apache.nlpcraft.model.nlp.NCNlpNerParser;
 import org.apache.nlpcraft.model.nlp.NCNlpTokenizer;
 
@@ -79,17 +79,17 @@ public class NCModelConfigBuilder {
 
     // 2. Specail words detectors. Free implementation supported.
     // Has default.
-    public NCModelConfigBuilder withStopWordsDetector(NCNlpDetector detector) {
+    public NCModelConfigBuilder withStopWordsDetector(NCNlpWordsDetector 
detector) {
         return this;
     }
 
     // Has default.
-    public NCModelConfigBuilder withSwearWordsDetector(NCNlpDetector detector) 
{
+    public NCModelConfigBuilder withSwearWordsDetector(NCNlpWordsDetector 
detector) {
         return this;
     }
 
     // Empty by default.
-    public NCModelConfigBuilder withSuspiciousWordsDetector(NCNlpDetector 
detector) {
+    public NCModelConfigBuilder withSuspiciousWordsDetector(NCNlpWordsDetector 
detector) {
         return this;
     }
 
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/components/detectors/NCDefaultStopWordsDetector.java
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/components/detectors/NCDefaultStopWordsDetector.java
index b736117..b81fd1f 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/components/detectors/NCDefaultStopWordsDetector.java
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/components/detectors/NCDefaultStopWordsDetector.java
@@ -18,7 +18,7 @@
 package org.apache.nlpcraft.model.components.detectors;
 
 import org.apache.nlpcraft.model.nlp.NCNlpWord;
-import org.apache.nlpcraft.model.nlp.NCNlpDetector;
+import org.apache.nlpcraft.model.nlp.NCNlpWordsDetector;
 
 import java.util.Collections;
 import java.util.List;
@@ -26,7 +26,7 @@ import java.util.List;
 /**
  * Stopwords detector default implementation.
  */
-public class NCDefaultStopWordsDetector implements NCNlpDetector {
+public class NCDefaultStopWordsDetector implements NCNlpWordsDetector {
     @Override
     public List<NCNlpWord> detect(List<NCNlpWord> sen) {
         return Collections.emptyList();
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/components/detectors/NCDefaultSwearWordsDetector.java
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/components/detectors/NCDefaultSwearWordsDetector.java
index 69026a6..a51c8f1 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/components/detectors/NCDefaultSwearWordsDetector.java
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/components/detectors/NCDefaultSwearWordsDetector.java
@@ -18,7 +18,7 @@
 package org.apache.nlpcraft.model.components.detectors;
 
 import org.apache.nlpcraft.model.nlp.NCNlpWord;
-import org.apache.nlpcraft.model.nlp.NCNlpDetector;
+import org.apache.nlpcraft.model.nlp.NCNlpWordsDetector;
 
 import java.util.Collections;
 import java.util.List;
@@ -26,7 +26,7 @@ import java.util.List;
 /**
  * Swearwords detector default implementation.
  */
-public class NCDefaultSwearWordsDetector implements NCNlpDetector {
+public class NCDefaultSwearWordsDetector implements NCNlpWordsDetector {
     @Override
     public List<NCNlpWord> detect(List<NCNlpWord> sen) {
         return Collections.emptyList();
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/components/detectors/NCSimpleWordsDetector.java
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/components/detectors/NCSimpleWordsDetector.java
index 0c471af..712bdb6 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/components/detectors/NCSimpleWordsDetector.java
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/components/detectors/NCSimpleWordsDetector.java
@@ -18,7 +18,7 @@
 package org.apache.nlpcraft.model.components.detectors;
 
 import org.apache.nlpcraft.model.nlp.NCNlpWord;
-import org.apache.nlpcraft.model.nlp.NCNlpDetector;
+import org.apache.nlpcraft.model.nlp.NCNlpWordsDetector;
 
 import java.util.Collections;
 import java.util.List;
@@ -28,7 +28,7 @@ import java.util.stream.Collectors;
 /**
  *
  */
-public class NCSimpleWordsDetector implements NCNlpDetector {
+public class NCSimpleWordsDetector implements NCNlpWordsDetector {
     private final Set<String> words;
 
     public NCSimpleWordsDetector(Set<String> words) {
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/components/ner/synonyms/NCSynonymsNerElement.java
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/components/ner/synonyms/NCSynonymsNerElement.java
index 58ab8e7..4850d50 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/components/ner/synonyms/NCSynonymsNerElement.java
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/components/ner/synonyms/NCSynonymsNerElement.java
@@ -18,6 +18,7 @@
 package org.apache.nlpcraft.model.components.ner.synonyms;
 
 import org.apache.nlpcraft.model.NCConversation;
+import org.apache.nlpcraft.model.NCMetadata;
 import org.apache.nlpcraft.model.NCToken;
 
 import java.util.Collections;
@@ -38,7 +39,7 @@ import java.util.Optional;
  *
  * @see NCCustomParser
  */
-public interface NCSynonymsNerElement {
+public interface NCSynonymsNerElement extends NCMetadata {
     /**
      * Gets unique ID of this element.
      * <p>
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/nlp/NCNlpToken.java 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/nlp/NCNlpToken.java
index e6888f9..e28fb38 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/nlp/NCNlpToken.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/nlp/NCNlpToken.java
@@ -17,6 +17,7 @@
 
 package org.apache.nlpcraft.model.nlp;
 
+import org.apache.nlpcraft.model.NCMetadata;
 import org.apache.nlpcraft.model.NCModel;
 import org.apache.nlpcraft.model.NCModelConfig;
 import org.apache.nlpcraft.model.NCRequest;
@@ -27,14 +28,14 @@ import java.util.List;
 import java.util.Map;
 
 // NCNlpNerTokensParser parsing result.
-public interface NCNlpToken {
+public interface NCNlpToken extends NCMetadata {
     /**
      * Gets ID of the detected model element. Note that it <b>must 
correspond</b> to one of the elements
      * defined in the model. In other words, the parser doesn't define a new 
model element but rather
      * references the element that's already defined in the model.
      *
      * @return ID of the detected model element.
-     * @see NCSynonymsNerElement#getId() TODO: drop it.
+     * @see NCSynonymsNerElement#getId() TODO: javadoc drop it.
      * @see NCModel#getElements()
      */
     String getId();
@@ -86,7 +87,7 @@ public interface NCNlpToken {
         return null;
     }
 
-    // TODO:
+    // TODO: metadata.
     default Map<String, Object> getMetadata() {
         return Collections.emptyMap();
     }
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/nlp/NCNlpDetector.java 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/nlp/NCNlpWordsDetector.java
similarity index 97%
rename from 
nlpcraft/src/main/scala/org/apache/nlpcraft/model/nlp/NCNlpDetector.java
rename to 
nlpcraft/src/main/scala/org/apache/nlpcraft/model/nlp/NCNlpWordsDetector.java
index 222aab1..bd79078 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/nlp/NCNlpDetector.java
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/nlp/NCNlpWordsDetector.java
@@ -33,7 +33,7 @@ import java.util.List;
  * Custom and language related solutions should be implemented and set in 
model configuration.
  *
  */
-public interface NCNlpDetector {
+public interface NCNlpWordsDetector {
     /**
      * Finds words by some criteria in given words list.
      *
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/rest/NCAskRequest.java 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/rest/NCAskRequest.java
index 120c11d..84ca125 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/rest/NCAskRequest.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/rest/NCAskRequest.java
@@ -3,7 +3,7 @@ package org.apache.nlpcraft.rest;
 import java.util.Map;
 
 public class NCAskRequest {
-    // TODO: add all validations.
+    // TODO: add all Spring validations.
     public String txt;
     public Map<String, Object> data;
     public boolean enableLog;
diff --git a/nlpcraft/src/test/java/org/apache/nlpcraft/NCSpec.java 
b/nlpcraft/src/test/java/org/apache/nlpcraft/NCSpec.java
index 11a2b0b..880e466 100644
--- a/nlpcraft/src/test/java/org/apache/nlpcraft/NCSpec.java
+++ b/nlpcraft/src/test/java/org/apache/nlpcraft/NCSpec.java
@@ -24,6 +24,8 @@ import org.apache.nlpcraft.model.NCRejection;
 import org.apache.nlpcraft.model.NCModelConfig;
 import org.apache.nlpcraft.model.NCResult;
 import org.apache.nlpcraft.model.builders.NCModelConfigBuilder;
+import 
org.apache.nlpcraft.model.components.detectors.NCDefaultStopWordsDetector;
+import org.apache.nlpcraft.model.components.detectors.NCSimpleWordsDetector;
 import org.apache.nlpcraft.model.components.ner.synonyms.NCSynonymsNerValue;
 import org.apache.nlpcraft.model.builders.NCModelBuilder;
 import org.apache.nlpcraft.model.components.ner.synonyms.NCSynonymsNerElement;
@@ -33,21 +35,58 @@ import 
org.apache.nlpcraft.model.components.ner.synonyms.builders.NCSynonymsNerE
 import 
org.apache.nlpcraft.model.components.ner.synonyms.builders.NCSynonymsNerParserBuilder;
 import org.apache.nlpcraft.model.components.ner.opennlp.NCOpenNlpNerParser;
 import org.apache.nlpcraft.model.components.tokenizer.NCOpenNlpTokenizer;
+import org.apache.nlpcraft.model.nlp.NCNlpWordsDetector;
+import org.apache.nlpcraft.model.nlp.NCNlpWord;
 import org.junit.jupiter.api.Test;
 
 import java.io.File;
 import java.net.URL;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
 import org.apache.nlpcraft.model.NCIntentRef;
 
 public class NCSpec {
     private static class SomeClassWithIntents {
         @NCIntentRef("remove:waypoint")
         public void x() {
+            // No-op.
+        }
+    }
 
+    private static class CustomStopWordsDetector implements NCNlpWordsDetector 
{
+        private final static Set<String> ADDITIONAL = new HashSet<>() {
+            {
+                add("stop1");
+                add("stop2");
+            }
+        };
+
+        private final static NCNlpWordsDetector STANDARD = new 
NCDefaultStopWordsDetector();
+
+        @Override
+        public List<NCNlpWord> detect(List<NCNlpWord> sen) {
+            return
+                Stream.concat(
+                        STANDARD.detect(sen).stream(),
+                        sen.stream().filter(p -> 
ADDITIONAL.contains(p.getWord()))
+                    ).
+                    distinct().
+                    sorted(
+                        new Comparator<NCNlpWord>() {
+                            @Override
+                            public int compare(NCNlpWord w1, NCNlpWord w2) {
+                                return Integer.compare(w1.getStart(), 
w2.getStart());
+                            }
+                        }
+                    ).collect(Collectors.toList());
         }
     }
 
@@ -86,10 +125,8 @@ public class NCSpec {
                 // Common.
                 withId("modleId").
                 withName("name").
-                // TODO:
-//                withSwearWordsAllowed(true).
-//                // Stopwords etc.
-//                withAdditionalStopWords(new HashSet<>(Arrays.asList("x1", 
"x2"))).
+                withSuspiciousWordsDetector(new 
NCSimpleWordsDetector(Collections.singleton("bad"))).
+                withStopWordsDetector(new CustomStopWordsDetector()).
                 // Nlp tokenizer.
                 withTokenizer(new NCOpenNlpTokenizer()).
                 // NERs.
@@ -102,7 +139,6 @@ public class NCSpec {
                 // Intents.
                 withIntentsFromUrls(Collections.singletonList(new 
URL("http://urls.com";))).
                 
withIntentsClasses(Collections.singletonList(SomeClassWithIntents.class)).
-                // You can set link on this if prepare model without builder.
                 withIntentsObjects(Collections.singletonList(new 
SomeClassWithIntents())).
                 withIntentsSamples(
                     new HashMap<>() { { put("intent1", 
Arrays.asList(Arrays.asList("sample1", "sample2"))); } }

Reply via email to