From 1b2c135135023a5ad74e35d71f682356f33c62c4 Mon Sep 17 00:00:00 2001 From: Logan Patino Date: Fri, 30 Mar 2018 13:45:23 -0400 Subject: [PATCH 1/4] feat(nlc): Add tentative support for classifyCollection endpoint with tests --- .../v1/NaturalLanguageClassifier.java | 23 +++ .../v1/model/ClassificationCollection.java | 62 ++++++++ .../v1/model/ClassifyCollectionOptions.java | 143 ++++++++++++++++++ .../v1/model/ClassifyInput.java | 43 ++++++ .../v1/model/CollectionItem.java | 62 ++++++++ .../v1/model/CreateClassifierOptions.java | 10 +- .../v1/NaturalLanguageClassifierIT.java | 33 ++++ .../v1/NaturalLanguageClassifierTest.java | 38 +++++ .../classification_collection.json | 25 +++ 9 files changed, 435 insertions(+), 4 deletions(-) create mode 100644 natural-language-classifier/src/main/java/com/ibm/watson/developer_cloud/natural_language_classifier/v1/model/ClassificationCollection.java create mode 100644 natural-language-classifier/src/main/java/com/ibm/watson/developer_cloud/natural_language_classifier/v1/model/ClassifyCollectionOptions.java create mode 100644 natural-language-classifier/src/main/java/com/ibm/watson/developer_cloud/natural_language_classifier/v1/model/ClassifyInput.java create mode 100644 natural-language-classifier/src/main/java/com/ibm/watson/developer_cloud/natural_language_classifier/v1/model/CollectionItem.java create mode 100644 natural-language-classifier/src/test/resources/natural_language_classifier/classification_collection.json diff --git a/natural-language-classifier/src/main/java/com/ibm/watson/developer_cloud/natural_language_classifier/v1/NaturalLanguageClassifier.java b/natural-language-classifier/src/main/java/com/ibm/watson/developer_cloud/natural_language_classifier/v1/NaturalLanguageClassifier.java index 4b0f6a4fd1f..3d191b5ff3b 100644 --- a/natural-language-classifier/src/main/java/com/ibm/watson/developer_cloud/natural_language_classifier/v1/NaturalLanguageClassifier.java +++ b/natural-language-classifier/src/main/java/com/ibm/watson/developer_cloud/natural_language_classifier/v1/NaturalLanguageClassifier.java @@ -16,8 +16,10 @@ import com.ibm.watson.developer_cloud.http.RequestBuilder; import com.ibm.watson.developer_cloud.http.ServiceCall; import com.ibm.watson.developer_cloud.natural_language_classifier.v1.model.Classification; +import com.ibm.watson.developer_cloud.natural_language_classifier.v1.model.ClassificationCollection; import com.ibm.watson.developer_cloud.natural_language_classifier.v1.model.Classifier; import com.ibm.watson.developer_cloud.natural_language_classifier.v1.model.ClassifierList; +import com.ibm.watson.developer_cloud.natural_language_classifier.v1.model.ClassifyCollectionOptions; import com.ibm.watson.developer_cloud.natural_language_classifier.v1.model.ClassifyOptions; import com.ibm.watson.developer_cloud.natural_language_classifier.v1.model.CreateClassifierOptions; import com.ibm.watson.developer_cloud.natural_language_classifier.v1.model.DeleteClassifierOptions; @@ -94,6 +96,27 @@ public ServiceCall classify(ClassifyOptions classifyOptions) { return createServiceCall(builder.build(), ResponseConverterUtils.getObject(Classification.class)); } + /** + * Classify multiple phrases. + * + * Returns label information for multiple phrases. The status must be `Available` before you can use the classifier to + * classify text. Note that classifying Japanese texts is a beta feature. + * + * @param classifyCollectionOptions the {@link ClassifyCollectionOptions} containing the options for the call + * @return a {@link ServiceCall} with a response type of {@link ClassificationCollection} + */ + public ServiceCall classifyCollection(ClassifyCollectionOptions classifyCollectionOptions) { + Validator.notNull(classifyCollectionOptions, "classifyCollectionOptions cannot be null"); + String[] pathSegments = { "v1/classifiers", "classify_collection" }; + String[] pathParameters = { classifyCollectionOptions.classifierId() }; + RequestBuilder builder = RequestBuilder.post(RequestBuilder.constructHttpUrl(getEndPoint(), pathSegments, + pathParameters)); + final JsonObject contentJson = new JsonObject(); + contentJson.add("collection", GsonSingleton.getGson().toJsonTree(classifyCollectionOptions.collection())); + builder.bodyJson(contentJson); + return createServiceCall(builder.build(), ResponseConverterUtils.getObject(ClassificationCollection.class)); + } + /** * Create classifier. * diff --git a/natural-language-classifier/src/main/java/com/ibm/watson/developer_cloud/natural_language_classifier/v1/model/ClassificationCollection.java b/natural-language-classifier/src/main/java/com/ibm/watson/developer_cloud/natural_language_classifier/v1/model/ClassificationCollection.java new file mode 100644 index 00000000000..c47ef4fe6e4 --- /dev/null +++ b/natural-language-classifier/src/main/java/com/ibm/watson/developer_cloud/natural_language_classifier/v1/model/ClassificationCollection.java @@ -0,0 +1,62 @@ +/* + * Copyright 2018 IBM Corp. All Rights Reserved. + * + * Licensed 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 com.ibm.watson.developer_cloud.natural_language_classifier.v1.model; + +import java.util.List; + +import com.google.gson.annotations.SerializedName; +import com.ibm.watson.developer_cloud.service.model.GenericModel; + +/** + * Response from the classifier for multiple phrases. + */ +public class ClassificationCollection extends GenericModel { + + @SerializedName("classifier_id") + private String classifierId; + private String url; + private List collection; + + /** + * Gets the classifierId. + * + * Unique identifier for this classifier. + * + * @return the classifierId + */ + public String getClassifierId() { + return classifierId; + } + + /** + * Gets the url. + * + * Link to the classifier. + * + * @return the url + */ + public String getUrl() { + return url; + } + + /** + * Gets the collection. + * + * An array of classifier responses for each submitted phrase. + * + * @return the collection + */ + public List getCollection() { + return collection; + } +} diff --git a/natural-language-classifier/src/main/java/com/ibm/watson/developer_cloud/natural_language_classifier/v1/model/ClassifyCollectionOptions.java b/natural-language-classifier/src/main/java/com/ibm/watson/developer_cloud/natural_language_classifier/v1/model/ClassifyCollectionOptions.java new file mode 100644 index 00000000000..ae4f5df6559 --- /dev/null +++ b/natural-language-classifier/src/main/java/com/ibm/watson/developer_cloud/natural_language_classifier/v1/model/ClassifyCollectionOptions.java @@ -0,0 +1,143 @@ +/* + * Copyright 2018 IBM Corp. All Rights Reserved. + * + * Licensed 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 com.ibm.watson.developer_cloud.natural_language_classifier.v1.model; + +import java.util.ArrayList; +import java.util.List; + +import com.ibm.watson.developer_cloud.service.model.GenericModel; +import com.ibm.watson.developer_cloud.util.Validator; + +/** + * The classifyCollection options. + */ +public class ClassifyCollectionOptions extends GenericModel { + + private String classifierId; + private List collection; + + /** + * Builder. + */ + public static class Builder { + private String classifierId; + private List collection; + + private Builder(ClassifyCollectionOptions classifyCollectionOptions) { + classifierId = classifyCollectionOptions.classifierId; + collection = classifyCollectionOptions.collection; + } + + /** + * Instantiates a new builder. + */ + public Builder() { + } + + /** + * Instantiates a new builder with required properties. + * + * @param classifierId the classifierId + * @param collection the collection + */ + public Builder(String classifierId, List collection) { + this.classifierId = classifierId; + this.collection = collection; + } + + /** + * Builds a ClassifyCollectionOptions. + * + * @return the classifyCollectionOptions + */ + public ClassifyCollectionOptions build() { + return new ClassifyCollectionOptions(this); + } + + /** + * Adds an classifyInput to collection. + * + * @param classifyInput the new classifyInput + * @return the ClassifyCollectionOptions builder + */ + public Builder addClassifyInput(ClassifyInput classifyInput) { + Validator.notNull(classifyInput, "classifyInput cannot be null"); + if (this.collection == null) { + this.collection = new ArrayList(); + } + this.collection.add(classifyInput); + return this; + } + + /** + * Set the classifierId. + * + * @param classifierId the classifierId + * @return the ClassifyCollectionOptions builder + */ + public Builder classifierId(String classifierId) { + this.classifierId = classifierId; + return this; + } + + /** + * Set the collection. + * Existing collection will be replaced. + * + * @param collection the collection + * @return the ClassifyCollectionOptions builder + */ + public Builder collection(List collection) { + this.collection = collection; + return this; + } + } + + private ClassifyCollectionOptions(Builder builder) { + Validator.notEmpty(builder.classifierId, "classifierId cannot be empty"); + Validator.notNull(builder.collection, "collection cannot be null"); + classifierId = builder.classifierId; + collection = builder.collection; + } + + /** + * New builder. + * + * @return a ClassifyCollectionOptions builder + */ + public Builder newBuilder() { + return new Builder(this); + } + + /** + * Gets the classifierId. + * + * Classifier ID to use. + * + * @return the classifierId + */ + public String classifierId() { + return classifierId; + } + + /** + * Gets the collection. + * + * The submitted phrases. + * + * @return the collection + */ + public List collection() { + return collection; + } +} diff --git a/natural-language-classifier/src/main/java/com/ibm/watson/developer_cloud/natural_language_classifier/v1/model/ClassifyInput.java b/natural-language-classifier/src/main/java/com/ibm/watson/developer_cloud/natural_language_classifier/v1/model/ClassifyInput.java new file mode 100644 index 00000000000..1730425994c --- /dev/null +++ b/natural-language-classifier/src/main/java/com/ibm/watson/developer_cloud/natural_language_classifier/v1/model/ClassifyInput.java @@ -0,0 +1,43 @@ +/* + * Copyright 2018 IBM Corp. All Rights Reserved. + * + * Licensed 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 com.ibm.watson.developer_cloud.natural_language_classifier.v1.model; + +import com.ibm.watson.developer_cloud.service.model.GenericModel; + +/** + * Request payload to classify. + */ +public class ClassifyInput extends GenericModel { + + private String text; + + /** + * Gets the text. + * + * The submitted phrase. + * + * @return the text + */ + public String getText() { + return text; + } + + /** + * Sets the text. + * + * @param text the new text + */ + public void setText(final String text) { + this.text = text; + } +} diff --git a/natural-language-classifier/src/main/java/com/ibm/watson/developer_cloud/natural_language_classifier/v1/model/CollectionItem.java b/natural-language-classifier/src/main/java/com/ibm/watson/developer_cloud/natural_language_classifier/v1/model/CollectionItem.java new file mode 100644 index 00000000000..e8d1cd627e7 --- /dev/null +++ b/natural-language-classifier/src/main/java/com/ibm/watson/developer_cloud/natural_language_classifier/v1/model/CollectionItem.java @@ -0,0 +1,62 @@ +/* + * Copyright 2018 IBM Corp. All Rights Reserved. + * + * Licensed 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 com.ibm.watson.developer_cloud.natural_language_classifier.v1.model; + +import java.util.List; + +import com.google.gson.annotations.SerializedName; +import com.ibm.watson.developer_cloud.service.model.GenericModel; + +/** + * Response from the classifier for a phrase in a collection. + */ +public class CollectionItem extends GenericModel { + + private String text; + @SerializedName("top_class") + private String topClass; + private List classes; + + /** + * Gets the text. + * + * The submitted phrase. + * + * @return the text + */ + public String getText() { + return text; + } + + /** + * Gets the topClass. + * + * The class with the highest confidence. + * + * @return the topClass + */ + public String getTopClass() { + return topClass; + } + + /** + * Gets the classes. + * + * An array of up to ten class-confidence pairs sorted in descending order of confidence. + * + * @return the classes + */ + public List getClasses() { + return classes; + } +} diff --git a/natural-language-classifier/src/main/java/com/ibm/watson/developer_cloud/natural_language_classifier/v1/model/CreateClassifierOptions.java b/natural-language-classifier/src/main/java/com/ibm/watson/developer_cloud/natural_language_classifier/v1/model/CreateClassifierOptions.java index 971098f7646..81b7f0f5df7 100644 --- a/natural-language-classifier/src/main/java/com/ibm/watson/developer_cloud/natural_language_classifier/v1/model/CreateClassifierOptions.java +++ b/natural-language-classifier/src/main/java/com/ibm/watson/developer_cloud/natural_language_classifier/v1/model/CreateClassifierOptions.java @@ -167,7 +167,9 @@ public Builder newBuilder() { * Gets the metadata. * * Metadata in JSON format. The metadata identifies the language of the data, and an optional name to identify the - * classifier. + * classifier. Specify the language with the 2-letter primary language code as assigned in ISO standard 639. Supported + * languages are English (`en`), Arabic (`ar`), French (`fr`), German, (`de`), Italian (`it`), Japanese (`ja`), Korean + * (`ko`), Brazilian Portuguese (`pt`), and Spanish (`es`). * * @return the metadata */ @@ -189,9 +191,9 @@ public String metadataFilename() { /** * Gets the trainingData. * - * Training data in CSV format. Each text value must have at least one class. The data can include up to 15,000 - * records. For details, see [Using your own - * data](https://console.bluemix.net/docs/services/natural-language-classifier/using-your-data.html). + * Training data in CSV format. Each text value must have at least one class. The data can include up to 20,000 + * records. For details, see [Data + * preparation](https://console.bluemix.net/docs/services/natural-language-classifier/using-your-data.html). * * @return the trainingData */ diff --git a/natural-language-classifier/src/test/java/com/ibm/watson/developer_cloud/natural_language_classifier/v1/NaturalLanguageClassifierIT.java b/natural-language-classifier/src/test/java/com/ibm/watson/developer_cloud/natural_language_classifier/v1/NaturalLanguageClassifierIT.java index 20781174034..457a1c2deff 100644 --- a/natural-language-classifier/src/test/java/com/ibm/watson/developer_cloud/natural_language_classifier/v1/NaturalLanguageClassifierIT.java +++ b/natural-language-classifier/src/test/java/com/ibm/watson/developer_cloud/natural_language_classifier/v1/NaturalLanguageClassifierIT.java @@ -14,9 +14,12 @@ import com.ibm.watson.developer_cloud.WatsonServiceTest; import com.ibm.watson.developer_cloud.natural_language_classifier.v1.model.Classification; +import com.ibm.watson.developer_cloud.natural_language_classifier.v1.model.ClassificationCollection; import com.ibm.watson.developer_cloud.natural_language_classifier.v1.model.Classifier; import com.ibm.watson.developer_cloud.natural_language_classifier.v1.model.Classifier.Status; import com.ibm.watson.developer_cloud.natural_language_classifier.v1.model.ClassifierList; +import com.ibm.watson.developer_cloud.natural_language_classifier.v1.model.ClassifyCollectionOptions; +import com.ibm.watson.developer_cloud.natural_language_classifier.v1.model.ClassifyInput; import com.ibm.watson.developer_cloud.natural_language_classifier.v1.model.ClassifyOptions; import com.ibm.watson.developer_cloud.natural_language_classifier.v1.model.CreateClassifierOptions; import com.ibm.watson.developer_cloud.natural_language_classifier.v1.model.DeleteClassifierOptions; @@ -31,6 +34,7 @@ import org.junit.runners.MethodSorters; import java.io.File; +import java.util.Arrays; import java.util.List; import static org.junit.Assert.assertEquals; @@ -176,4 +180,33 @@ public void eDelete() { } } + /** + * Test classifyCollection. Use the pre created classifier to avoid waiting for availability + */ + @Test + public void fClassifyCollection() { + ClassificationCollection classificationCollection = null; + ClassifyInput input1 = new ClassifyInput(); + input1.setText("How hot will it be today?"); + ClassifyInput input2 = new ClassifyInput(); + input2.setText("Is it hot outside?"); + + try { + ClassifyCollectionOptions classifyOptions = new ClassifyCollectionOptions.Builder() + .classifierId(preCreatedClassifierId) + .addClassifyInput(input1) + .addClassifyInput(input2) + .build(); + classificationCollection = service.classifyCollection(classifyOptions).execute(); + } catch (NotFoundException e) { + // #324: Classifiers may be empty, because of other tests interfering. + // The build should not fail here, because this is out of our control. + throw new AssumptionViolatedException(e.getMessage(), e); + } + + assertNotNull(classificationCollection); + assertEquals("temperature", classificationCollection.getCollection().get(0).getTopClass()); + assertEquals("temperature", classificationCollection.getCollection().get(1).getTopClass()); + } + } diff --git a/natural-language-classifier/src/test/java/com/ibm/watson/developer_cloud/natural_language_classifier/v1/NaturalLanguageClassifierTest.java b/natural-language-classifier/src/test/java/com/ibm/watson/developer_cloud/natural_language_classifier/v1/NaturalLanguageClassifierTest.java index ab0978fe363..d9ba993067e 100644 --- a/natural-language-classifier/src/test/java/com/ibm/watson/developer_cloud/natural_language_classifier/v1/NaturalLanguageClassifierTest.java +++ b/natural-language-classifier/src/test/java/com/ibm/watson/developer_cloud/natural_language_classifier/v1/NaturalLanguageClassifierTest.java @@ -15,8 +15,11 @@ import com.google.gson.JsonObject; import com.ibm.watson.developer_cloud.WatsonServiceUnitTest; import com.ibm.watson.developer_cloud.natural_language_classifier.v1.model.Classification; +import com.ibm.watson.developer_cloud.natural_language_classifier.v1.model.ClassificationCollection; import com.ibm.watson.developer_cloud.natural_language_classifier.v1.model.Classifier; import com.ibm.watson.developer_cloud.natural_language_classifier.v1.model.ClassifierList; +import com.ibm.watson.developer_cloud.natural_language_classifier.v1.model.ClassifyCollectionOptions; +import com.ibm.watson.developer_cloud.natural_language_classifier.v1.model.ClassifyInput; import com.ibm.watson.developer_cloud.natural_language_classifier.v1.model.ClassifyOptions; import com.ibm.watson.developer_cloud.natural_language_classifier.v1.model.CreateClassifierOptions; import com.ibm.watson.developer_cloud.natural_language_classifier.v1.model.DeleteClassifierOptions; @@ -27,6 +30,8 @@ import java.io.File; import java.io.FileNotFoundException; +import java.util.Arrays; +import java.util.List; import static org.junit.Assert.assertEquals; @@ -37,11 +42,13 @@ public class NaturalLanguageClassifierTest extends WatsonServiceUnitTest { private static final String TEXT = "text"; private static final String CLASSIFIERS_PATH = "/v1/classifiers"; private static final String CLASSIFY_PATH = "/v1/classifiers/%s/classify"; + private static final String CLASSIFY_COLLECTION_PATH = "/v1/classifiers/%s/classify_collection"; private static final String RESOURCE = "src/test/resources/natural_language_classifier/"; private ClassifierList classifiers; private Classifier classifier; private Classification classification; + private ClassificationCollection classificationCollection; private String classifierId; private NaturalLanguageClassifier service; @@ -62,6 +69,8 @@ public void setUp() throws Exception { classifiers = loadFixture(RESOURCE + "classifiers.json", ClassifierList.class); classifier = loadFixture(RESOURCE + "classifier.json", Classifier.class); classification = loadFixture(RESOURCE + "classification.json", Classification.class); + classificationCollection = loadFixture(RESOURCE + "classification_collection.json", + ClassificationCollection.class); } /** @@ -90,6 +99,35 @@ public void testClassify() throws InterruptedException { assertEquals(classification, result); } + /** + * Test classifying a collection. + * + * @throws InterruptedException the interrupted exception + */ + @Test + public void testClassifyCollection() throws InterruptedException { + final String path = String.format(CLASSIFY_COLLECTION_PATH, classifierId); + + server.enqueue(jsonResponse(classificationCollection)); + + ClassifyInput input1 = new ClassifyInput(); + input1.setText("How hot will it be today?"); + ClassifyInput input2 = new ClassifyInput(); + input2.setText("Is it hot outside?"); + List inputCollection = Arrays.asList(input1, input2); + + ClassifyCollectionOptions classifyOptions = new ClassifyCollectionOptions.Builder() + .classifierId(classifierId) + .collection(inputCollection) + .build(); + final ClassificationCollection result = service.classifyCollection(classifyOptions).execute(); + final RecordedRequest request = server.takeRequest(); + + assertEquals(path, request.getPath()); + assertEquals("POST", request.getMethod()); + assertEquals(classificationCollection, result); + } + /** * Test get classifier. * diff --git a/natural-language-classifier/src/test/resources/natural_language_classifier/classification_collection.json b/natural-language-classifier/src/test/resources/natural_language_classifier/classification_collection.json new file mode 100644 index 00000000000..9ebc67cd830 --- /dev/null +++ b/natural-language-classifier/src/test/resources/natural_language_classifier/classification_collection.json @@ -0,0 +1,25 @@ +{ + "classifier_id" : "10D41B-nlc-1", + "url" : "https://gateway.watsonplatform.net/natural-language-classifier/api/v1/classifiers/10D41B-nlc-1", + "collection" : [ { + "text" : "How hot will it be today?", + "top_class" : "temperature", + "classes" : [ { + "class_name" : "temperature", + "confidence" : 0.9930558798985937 + }, { + "class_name" : "conditions", + "confidence" : 0.006944120101406304 + } ] + }, { + "text" : "Is it hot outside?", + "top_class" : "temperature", + "classes" : [ { + "class_name" : "temperature", + "confidence" : 1 + }, { + "class_name" : "conditions", + "confidence" : 0 + } ] + } ] +} \ No newline at end of file From acc9a5e75f4a9641c8490617376affabf7a00f7c Mon Sep 17 00:00:00 2001 From: Logan Patino Date: Sun, 1 Apr 2018 15:50:22 -0400 Subject: [PATCH 2/4] build(nlc): Remove unused import for checkstyle --- .../v1/NaturalLanguageClassifierIT.java | 1 - 1 file changed, 1 deletion(-) diff --git a/natural-language-classifier/src/test/java/com/ibm/watson/developer_cloud/natural_language_classifier/v1/NaturalLanguageClassifierIT.java b/natural-language-classifier/src/test/java/com/ibm/watson/developer_cloud/natural_language_classifier/v1/NaturalLanguageClassifierIT.java index 457a1c2deff..83f8e144cbf 100644 --- a/natural-language-classifier/src/test/java/com/ibm/watson/developer_cloud/natural_language_classifier/v1/NaturalLanguageClassifierIT.java +++ b/natural-language-classifier/src/test/java/com/ibm/watson/developer_cloud/natural_language_classifier/v1/NaturalLanguageClassifierIT.java @@ -34,7 +34,6 @@ import org.junit.runners.MethodSorters; import java.io.File; -import java.util.Arrays; import java.util.List; import static org.junit.Assert.assertEquals; From bc4dd518e4348d97beabd8c3bedec9c7ad500ae6 Mon Sep 17 00:00:00 2001 From: Logan Patino Date: Sun, 1 Apr 2018 16:48:49 -0400 Subject: [PATCH 3/4] test(properties): Update properties to use new pre-trained NLC classifier --- config.properties.enc | Bin 3376 -> 3376 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/config.properties.enc b/config.properties.enc index 67c33f77a153bdebc92c7d7fde1b3bb9ea67af57..61715a5a686904b84aa9dfa7fc9ab12b1fad9387 100644 GIT binary patch literal 3376 zcmV-04bSrPX*B{QRmGFItGm878BqLH3X_i}I}-5|AEumyTjq2HVZPBardKVNM_LP) zG9dNoUF@o43{Q;sZ%f5wBbOVqIacl|K}h!7^dHwbI5Z&M>Nh?NjZ_OZaMpPmv=AQ2 zuwssyvWB6M7s$W0jZ!x!IfGonMvK*$TQP>cE;arQCgd9x<%8}sW{cKW_wjND9pO^T z3|@uT)c??gyHm5}aSdcPeaLgu%caYpkbMb2>T4g_AN~)pK+A8Pz!IaaV?bmV$A|~f zXiW>eH2D@ch*?90__0Fcps|Vjp?wFqui}uM-&{Yb2fegHa$cyxJVfJ2WQ@pGbnb-F zIA&*L>LvXUov=*(Zy!Uyn4Be9lA(;^q(N&-`NrTv3usSd2wI@v$lLoZY|HDHqrM*7 zL5n5N9XxytHxc1N3cTE}A7DTFmA${0T@CKKTZnD@LgHcX&e~6BFu&m~6=R@9cyZId z39DE9EkX~GrqVeC#CmEzN4jW4zrNOdC@pTDU~n#R{$py{pp<{=QHeXi%OU6%ngU z3{;(dr0#(iYM+6vXTd4=P)Qw7_*t+1=3)aD2ZHjsb;m`$Z?53~^}G!qT>u`2L)iWb zk~oJS;{gIZK+WvBfpdq+9M9+b;tRjyey7IfUUakedo-V?q7A)@n{td?sV-5rSI7U8 zxzc5ZrLo-r#Am*A2{R;ebn&Z`zC;@aE%%Z&2{^isPwU zt(RIY)~#~xLIOs%^NlOR8!rbp1WqZzmiEdxT>GCPx)}&HQ>_-H~pz08jFMf7wLqvkq8+FMyb@9+htu}vFu;`K%#sD1!BZ@o|^ zea=zA0CeQW(|~B(X4H`%Fts@H@6udy<_;ul4ow&EhFmtV*biA;pom5k065SwGbb*7 z?6MjjiQkjhglPILzWeUP#1IMgUP@KQ`CgYWu&Nw(FGc@+t+XfBF7Gg9i-_B{Ckn3~ zeE-qrBCQC)Wu3pa?L#a5`lu`<=^8vY1;Jcx8S5Sw!zi1{&M*flo3u@*mCgof_|mYD zaA?UHBs<}Cofzk~PL}NCQN6SdmUXPa%}JBC8d}?*9|5EPB~aNF91!k6kig+@=28}b zZ?MYJA=cwPI@8XZuT{Qx?J28_p*fgRtGOjh!FzEmf$wJ?wGN617LSY|n4(YYWWs3o zm~K)9FI{q{MUkD#nD-Pg)B4ZvCSEb}*b2D1yiQ)exlG31!{p(Zd<187!1zs)3Ad8M zte`2D$4W^W`lUr8nE{{~t5$)S;5$Xo5{3rPS%i+3a}YiM0B_6F(J1eoZ%W9uBehy1 z_?c{fhESkKcRhjwG^-=bSyK6nX7z_tpr;pjlTfguIf2g;GAIngvAXs-%$d{E$m9s6 zY{^Hufe)yLWD7`lmpijTNGy88iPYtt;qY=LZJjrsGtzG_UkIR+h5lt@qMrt)FO;v% z^I|oSOcKVD&xb7$XO~wc)Iwo~N%2_1reQ=h7er7kLs2o<*!{^^m71U|Zb# zcwt`%IfKTtyrX$KbMN^`MQu9;3E?Ig?R=oz1zyE}TK3lu1g>N@`AKkU;k`Vj-%iFB z#;CvR$_gjR0P0hVH1N}>`L205-sX`Bw4R0!<(gEa+k-{z|JI)Yw3LzVj!T--XoAl8 zuvc$WBj(XbH)MGLZ(h>uHu0w->pQ*1Z{sNV;GkuZBC^YK@C!=vk6@p!PA!G;XCc)t zW)^kX9&bpIE*@{r!449LG~~Tg;;JI55-3>{QK0(KWsHa*nwZ?6Ty0#vE5!^W&+aqU zLTM5?S!@9x3JU<>CaMHIl?}0L>f8EWCx z2=Mw;fHi3-Fw`;8TUdW;-d3_>$%kr6p*1clZ@sri^8^y^t3xl;5d{b{!5$vTnB~j+7Jk&Pm@tQK{7I%;mtL~ z+4pa%XS`sn(0cHI{jp^8_0fF$AcA`5$!cM>gri}S1OEzq;jPmx9Rpw%1c%bVo|or= zVK!Smj>w?5tJ;)OxYWf|IdRjVsj2CJ_JdIf55UAUIJ=C9%f?VH}9NCb) zev!FTABu4t>)y&NKzgc4fifdpYZ9e$QupB%Uc-NGEp497hvOHhHfjEuuBb_?Yg>Z2 z49&UOUpoBcLaUP;j|sprI0@aau*Tnc@?R zhGo7_KJXw@J`O{cxd4RWcU1keqx>&Km_%VvTmkp~WpLKj zX~51LVA-GPMcQhnELpR!jzwxA*31MF)Qg@5bpi#lN6Jz!fBUh18UGdTg+^EJcK`+k zwRGjP>ay&HtXq^daf+q(teLIp)$pRo>QdOH3`Y2u?wN&U>jawsvXbi>L%eJMv!GaQ zdCuMLII%TWdwA15ti}E!+4FN6U;Y71Qx+1#VVN8oW5Qd-8rOOesA^;gb!n9+?U<{6cRbFhIDS_!By4Gz}E<^VSis(a8@+;^nQv{-ajV6`AJ>O zvwQGwU&)E`Jl?5BWYvgu=O>LH^f>W9k@Iyt+5=1onVbS}zEV4ekT+Vw^&9?_1|9-n z%wCb~fn_XQPTYMB-Sytr(-zGLXCIEHD;!N;I{ht-cTBPp;KMjgqm#egd#qpGKj;OI zm&vH~Od|U#PTznXS+KtHCNf~QhH*!5U?gN@b^qudR@8q&%EsP>+~2zp*XO=}zR?ge zbGVzlPS<^D57Ur$!$KF5AUfy>?#zJ@eEAdda~$rn9AA!z1i!;aWh;7MANC8&M%wiH zh1^q-uf6%7nfb%9ghM2a<&Q@UQszdo8-sYt2E*Vq(cFxS z3$yVU&4M=9WIgEJT!akT-TkW(l)+qUeEb?8t(N%2Zx}XsVc5m(#?i3o2Ewi~^AX9E zDw2RlK!v$Hpe4^oxifrt-URa5h!@CnheVz{3(?E}zl)VNj+J$puxEKTQ2TB+bWh9g z;J^O0;u^)^b1HZUFs&rL`LI2@Ue`OsiBU3%6@|9K3`!*Qk;vA9tixy!Ho$Axoi;Hu zhqliePbty=I18zP7qQz5krj8&!LlZZaLs&{wt1HbWB)LggJX-nM}(PdB? zLzD#y>X3GhGcr@l6Q_bM5bl<;MwQP%=EcuqK^5SpZ3Z^D*;h-s)uu zfdAsBBTfXlrwSKm`FkxpDqqsSO%aOSEt@Sw0Dg}=V~n}UHrq@NiVfj&_P}`^LPa$x z1X4)0VE7#!Q*4xx2oIgw3q%|}fWH>%M-kO$!y&p7>__pO>)&|$BbPM7|)77y8H@eI6I*M-`QfXR0bEN~7mMi7r zbKo$drm6Ic_5P{9GdTj?48oS==%60}_*6$D(p9~pFXI->4i9ku$sUb)_WtYfDI>ec z%-&!wD%L>lTcaC&5P$d|xE7KW`wReynI{D;&?mG4cf3{p+8qzjn?&5_zpXvwq} z97dRMjmO@}K+)j&KmHAxC?1_j9c*jHyUMs>D~hy@IxT(B)pE49O(bsqA`%pn{kP0T zL{lezEX9QRRzWfyu|QnRe&R`ynQmz#C|taoK6V6}Z}(?LYyeP4gvMMx+=G$H8o^b) z3@T=IDgzf;#u-QbXC%A>&k^i}9^I^V$cmZk6V6KhoUtPQ)~6qH1V1CR<@BC|io_=6xF#WR|l#8)>Uz@SKNXxL4 zyi*D??bknFMxLU67B2)bh!6YSvrn$GJ$TY*7EV%cyW3fws;(w*KDr&@J57~1@5a>o zsGGU`5Sw2-8EK=ONA0W?1r_f#qZsHoy(7lNG%RD+M3IBnXz}R>>JCwvpIdE)^Xpd& zr_19Wc%>UID`zrWH4v5A$uXEfoh7}4wxE79qHr>T40I+G`#54fgsjduj}(*VCtu6kp%}h#`g00jGnXlH6q=lZ zg8d;D@v%CwD4E}@J0IFB^1#peV*!bqdm?(Jj(G4gC8stj;n8|x`E%Il;RvFzBArB6 zOYHb8{lPWPL>l<6BZ?u%%nTB2XY-hv+a|!vbEHTboNcVBX0;pyNm?PtLuBm5kO)L1 zQ+WvnE=zhcQ+fa*JT83@!?M2{d;$0&= z8MO&^m{_X8hel}T+MqNG{9^5djWK!T>X1wAn&855OyPY-Qut~M0lsRjCfRclX!NHPFdwge0rfXqSY@~`3BS(E<({G zqS|v)caG)FT$BKCNA_YMb<~xj@Z?A&0UNh60{~s z5n;w~@R|QJUz!{bQ$B;!fwLCR=8hUfbFUl})0Om{vP$XR^#w>gNp0=!=TWLtRkugR zbqdW~8I_Bh=lr~@8UT5LxCV6t6P1{Ft&e}zYC&A^ULxoM`oA`(d(^HT?83hpp7Rt% z7U|aGPy04W;FCeS+Nj|pc`EJ4z zCwFzw+6kp|EmXn zEGhZmrdDf_qF)CpMn0T{nK{)jPxw68gm^*tVUO1Q%}Xr_UB;ESp`8K82v$ z$EYPcwDoNRzd8BRF)QlB9)qY4qrg&iMKJpm?NS_u+is0H-sbc|-6#NjrMk7GvxOkm zB1iQwMsSS^QF>we<(fy~km;j`gcXWzL!qziKFeQ&ElxTSI~}VXQ&%zDW6hJkFY`s> z1fg@<(VBmIhdt%QYer0MXTugo_3}m$P(|g08|(*$Y_&3JPLgmLd5cH-nI-}9$K4tX z7}vpr$gewXX^Ck;Rr})?=r7|CEx|g%VrYjdxeD*!<&JUUhvmT5nHqj%AgPcB^<}D8 zXoOrJAjU~rfb{wvGMf3@xCx?HF~nb{4|8nU?9`E7EDpEIL}6h!M_Pl}!B=xNmdtGA z7R14NY^6w^J(-vA+fBnzmCtW}az$H$oi8j`B7q*5y)zCvO*-(!#%;BlS*SxscWLer zAK|bAsn>uy4|ctk(y^Z*QkCxPCu3-W2lpoS0&L}oeyW&Z^@wc{^k_4&2r z6iKb&6nvni!2{CSR_-j z2*6JFCB=i2CF&<3Op}KOIJ2=-iGO}YyHue}7>QrtRYOGhQODb=UA=4V!s~OcqSQ^k z+HBo_X}{)K#X-l%7kHUGz6GUhW>!fzut=++=y#lZPAaqjg`vU>>ZpzN>5(DztzOee zo$?|e?fx~VI!m|(6`Eh=B`lSTNzo%1lw>`;XcZ_Gv|xs!9X(Aeh_FhHZz9}fTclK% zN3`=qGn%)%*~iN%b@cT@L^#%rsyTF}WJGTD>$o)xUweIMk4)KB||OkU-CKw6C{v^*!LFhg`68^Hb6pu4($X z*Vt&!Invp@ZC{#GfTy!BCXY>~Kq_hv1%%wdha{LpG);Fme+%+Yv!NoQv=R2TSfwc+ zzMbB@`6l&?Cfnzwys=0I)jlhD1ibu9rQ5()n%Otg{8usk>K3abJ+922b( z3Lm~VcEE;6l@TvXsoBNjO_<(cGK?+1arBu6vz9^fUktJu+ir4U%pwW9Hx#j@=-nm% zF2o{$I*JkOIYkE<5137CLcXa=$3~R=6V7iAnq#ctzAHh~kb_I}2fs?`0iJuocc%`K zWMe+TdaB)e)tBgo!~|hpk?b9`9J)StJM|Da&*qABo)K}vCTc; zg?TE0YF-1Hnb9y9kPqVwj|hm*@Xy$(zoJr0oGO+O6b2ln2kd~=BD6K-5^&F^To$?^ zD=pPD$~w_XJy|^>5;CNa#cn48kxk$PGSjm{uH5oc3f5VpGn;X>6?pkUAcc0e^3K$e Go`HF@hJITB From 1dd5de70c5e9c768a47a61fa7614986cde334868 Mon Sep 17 00:00:00 2001 From: Logan Patino Date: Mon, 2 Apr 2018 09:34:43 -0400 Subject: [PATCH 4/4] Revert "test(properties): Update properties to use new pre-trained NLC classifier" This reverts commit bc4dd518e4348d97beabd8c3bedec9c7ad500ae6. --- config.properties.enc | Bin 3376 -> 3376 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/config.properties.enc b/config.properties.enc index 61715a5a686904b84aa9dfa7fc9ab12b1fad9387..67c33f77a153bdebc92c7d7fde1b3bb9ea67af57 100644 GIT binary patch literal 3376 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 Go`HF@hJITB literal 3376 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