You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@opennlp.apache.org by ko...@apache.org on 2018/01/09 01:47:44 UTC
[opennlp] branch master updated: OPENNLP-1159: avoid letting users
specify AggregatedFeatureGeneratorFactory in XML config (#300)
This is an automated email from the ASF dual-hosted git repository.
koji pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/opennlp.git
The following commit(s) were added to refs/heads/master by this push:
new 6b08874 OPENNLP-1159: avoid letting users specify AggregatedFeatureGeneratorFactory in XML config (#300)
6b08874 is described below
commit 6b08874607dd51c9d8f600a96650a330cd9e6b95
Author: Koji Sekiguchi <ko...@rondhuit.com>
AuthorDate: Tue Jan 9 10:47:42 2018 +0900
OPENNLP-1159: avoid letting users specify AggregatedFeatureGeneratorFactory in XML config (#300)
---
.../util/featuregen/CachedFeatureGenerator.java | 10 +++
.../tools/util/featuregen/GeneratorFactory.java | 45 ++++++++++----
.../tools/namefind/ner-default-features.xml | 4 --
.../opennlp/tools/postag/pos-default-features.xml | 4 --
.../GeneratorFactoryClassicFormatTest.java | 2 +-
.../util/featuregen/GeneratorFactoryTest.java | 72 ++++++++++++++++++++++
...omaticallyInsertAggregatedFeatureGenerator.xml} | 13 ++--
...lyInsertAggregatedFeatureGeneratorChildren.xml} | 15 +++--
.../util/featuregen/TestFeatureGeneratorConfig.xml | 9 +--
...omaticallyInsertAggregatedFeatureGenerator.xml} | 11 ++--
...callyInsertAggregatedFeatureGeneratorChild.xml} | 13 ++--
.../TestTokenClassFeatureGeneratorConfig.xml | 10 ++-
12 files changed, 155 insertions(+), 53 deletions(-)
diff --git a/opennlp-tools/src/main/java/opennlp/tools/util/featuregen/CachedFeatureGenerator.java b/opennlp-tools/src/main/java/opennlp/tools/util/featuregen/CachedFeatureGenerator.java
index d3f0705..f02a47e 100644
--- a/opennlp-tools/src/main/java/opennlp/tools/util/featuregen/CachedFeatureGenerator.java
+++ b/opennlp-tools/src/main/java/opennlp/tools/util/featuregen/CachedFeatureGenerator.java
@@ -37,11 +37,17 @@ public class CachedFeatureGenerator implements AdaptiveFeatureGenerator {
private long numberOfCacheHits;
private long numberOfCacheMisses;
+ @Deprecated
public CachedFeatureGenerator(AdaptiveFeatureGenerator... generators) {
this.generator = new AggregatedFeatureGenerator(generators);
contextsCache = new Cache<>(100);
}
+ public CachedFeatureGenerator(AdaptiveFeatureGenerator generator) {
+ this.generator = generator;
+ contextsCache = new Cache<>(100);
+ }
+
public void createFeatures(List<String> features, String[] tokens, int index,
String[] previousOutcomes) {
@@ -103,4 +109,8 @@ public class CachedFeatureGenerator implements AdaptiveFeatureGenerator {
+ " misses=" + numberOfCacheMisses + " hit%" + (numberOfCacheHits > 0 ?
(double) numberOfCacheHits / (numberOfCacheMisses + numberOfCacheHits) : 0);
}
+
+ public AdaptiveFeatureGenerator getCachedFeatureGenerator() {
+ return generator;
+ }
}
diff --git a/opennlp-tools/src/main/java/opennlp/tools/util/featuregen/GeneratorFactory.java b/opennlp-tools/src/main/java/opennlp/tools/util/featuregen/GeneratorFactory.java
index 26de2f9..867c1e0 100644
--- a/opennlp-tools/src/main/java/opennlp/tools/util/featuregen/GeneratorFactory.java
+++ b/opennlp-tools/src/main/java/opennlp/tools/util/featuregen/GeneratorFactory.java
@@ -52,10 +52,9 @@ import opennlp.tools.util.model.POSModelSerializer;
* Creates a set of feature generators based on a provided XML descriptor.
*
* Example of an XML descriptor:
- *<p>
- * <generator class="opennlp.tools.util.featuregen.AggregatedFeatureGeneratorFactory">
+ * <p>
+ * <featureGenerators name="namefind">
* <generator class="opennlp.tools.util.featuregen.CachedFeatureGeneratorFactory">
- * <generator class="opennlp.tools.util.featuregen.AggregatedFeatureGeneratorFactory">
* <generator class="opennlp.tools.util.featuregen.WindowFeatureGeneratorFactory">
* <int name="prevLength">2</int>
* <int name="nextLength">2</int>
@@ -73,9 +72,8 @@ import opennlp.tools.util.model.POSModelSerializer;
* <bool name="begin">true</bool>
* <bool name="end">false</bool>
* </generator>
- * </generator>
* </generator>
- * </generator>
+ * </featureGenerators>
* </p>
*
* Each XML element is mapped to a {@link GeneratorFactory.XmlFeatureGeneratorFactory} which
@@ -140,7 +138,7 @@ public class GeneratorFactory {
throws InvalidFormatException {
this.generatorElement = element;
this.resourceManager = resourceManager;
- int generators = 0;
+ List<AdaptiveFeatureGenerator> generators = new ArrayList<>();
NodeList childNodes = generatorElement.getChildNodes();
for (int i = 0; i < childNodes.getLength(); i++) {
Node childNode = childNodes.item(i);
@@ -148,8 +146,9 @@ public class GeneratorFactory {
Element elem = (Element)childNode;
String type = elem.getTagName();
if (type.equals("generator")) {
- String key = "generator#" + Integer.toString(generators++);
+ String key = "generator#" + Integer.toString(generators.size());
AdaptiveFeatureGenerator afg = buildGenerator(elem, resourceManager);
+ generators.add(afg);
if (afg != null)
args.put(key, afg);
}
@@ -185,6 +184,13 @@ public class GeneratorFactory {
}
}
}
+
+ if (generators.size() > 1) {
+ AdaptiveFeatureGenerator aggregatedFeatureGenerator =
+ new AggregatedFeatureGenerator(generators.toArray(
+ new AdaptiveFeatureGenerator[generators.size()]));
+ args.put("generator#0", aggregatedFeatureGenerator);
+ }
}
public int getInt(String name) throws InvalidFormatException {
@@ -447,14 +453,27 @@ public class GeneratorFactory {
// check it is new format?
if (elementName.equals("featureGenerators")) {
- Element firstElem = getFirstChild(generatorElement);
- if (firstElem != null) {
- if (firstElem.getTagName().equals("generator")) {
- return buildGenerator(firstElem, resourceManager);
+
+ List<AdaptiveFeatureGenerator> generators = new ArrayList<>();
+ NodeList childNodes = generatorElement.getChildNodes();
+ for (int i = 0; i < childNodes.getLength(); i++) {
+ Node childNode = childNodes.item(i);
+ if (childNode instanceof Element) {
+ Element elem = (Element)childNode;
+ String type = elem.getTagName();
+ if (type.equals("generator")) {
+ generators.add(buildGenerator(elem, resourceManager));
+ }
+ else
+ throw new InvalidFormatException("Unexpected element: " + elementName);
}
- else
- throw new InvalidFormatException("Unexpected element: " + elementName);
}
+
+ if (generators.size() == 1)
+ return generators.get(0);
+ else if (generators.size() > 1)
+ return new AggregatedFeatureGenerator(generators.toArray(
+ new AdaptiveFeatureGenerator[generators.size()]));
else
throw new InvalidFormatException("featureGenerators must have one or more generators");
}
diff --git a/opennlp-tools/src/main/resources/opennlp/tools/namefind/ner-default-features.xml b/opennlp-tools/src/main/resources/opennlp/tools/namefind/ner-default-features.xml
index 58288e1..32887cf 100644
--- a/opennlp-tools/src/main/resources/opennlp/tools/namefind/ner-default-features.xml
+++ b/opennlp-tools/src/main/resources/opennlp/tools/namefind/ner-default-features.xml
@@ -19,9 +19,7 @@
<!-- Default name finder feature generator configuration -->
<featureGenerators name="nameFinder">
- <generator class="opennlp.tools.util.featuregen.AggregatedFeatureGeneratorFactory">
<generator class="opennlp.tools.util.featuregen.CachedFeatureGeneratorFactory">
- <generator class="opennlp.tools.util.featuregen.AggregatedFeatureGeneratorFactory">
<generator class="opennlp.tools.util.featuregen.WindowFeatureGeneratorFactory">
<int name="prevLength">2</int>
<int name="nextLength">2</int>
@@ -39,7 +37,5 @@
<bool name="begin">true</bool>
<bool name="end">false</bool>
</generator>
- </generator>
</generator>
- </generator>
</featureGenerators>
diff --git a/opennlp-tools/src/main/resources/opennlp/tools/postag/pos-default-features.xml b/opennlp-tools/src/main/resources/opennlp/tools/postag/pos-default-features.xml
index 466cba7..c1be8ee 100644
--- a/opennlp-tools/src/main/resources/opennlp/tools/postag/pos-default-features.xml
+++ b/opennlp-tools/src/main/resources/opennlp/tools/postag/pos-default-features.xml
@@ -19,9 +19,7 @@
<!-- Default pos tagger feature generator configuration -->
<featureGenerators name="posTagger">
- <generator class="opennlp.tools.util.featuregen.AggregatedFeatureGeneratorFactory">
<generator class="opennlp.tools.util.featuregen.CachedFeatureGeneratorFactory">
- <generator class="opennlp.tools.util.featuregen.AggregatedFeatureGeneratorFactory">
<generator class="opennlp.tools.util.featuregen.DefinitionFeatureGeneratorFactory"/>
<generator class="opennlp.tools.util.featuregen.SuffixFeatureGeneratorFactory"/>
<generator class="opennlp.tools.util.featuregen.PrefixFeatureGeneratorFactory"/>
@@ -40,7 +38,5 @@
</generator>
<generator class="opennlp.tools.util.featuregen.TokenClassFeatureGeneratorFactory"/>
<generator class="opennlp.tools.util.featuregen.PosTaggerFeatureGeneratorFactory"/>
- </generator>
</generator>
- </generator>
</featureGenerators>
diff --git a/opennlp-tools/src/test/java/opennlp/tools/util/featuregen/GeneratorFactoryClassicFormatTest.java b/opennlp-tools/src/test/java/opennlp/tools/util/featuregen/GeneratorFactoryClassicFormatTest.java
index cdf1404..ffc6b97 100644
--- a/opennlp-tools/src/test/java/opennlp/tools/util/featuregen/GeneratorFactoryClassicFormatTest.java
+++ b/opennlp-tools/src/test/java/opennlp/tools/util/featuregen/GeneratorFactoryClassicFormatTest.java
@@ -55,7 +55,7 @@ public class GeneratorFactoryClassicFormatTest {
@Test
public void testCreationWihtSimpleDescriptor() throws Exception {
InputStream generatorDescriptorIn = getClass().getResourceAsStream(
- "/opennlp/tools/util/featuregen/TestFeatureGeneratorConfig.xml");
+ "/opennlp/tools/util/featuregen/TestFeatureGeneratorConfig_classic.xml");
// If this fails the generator descriptor could not be found
// at the expected location
diff --git a/opennlp-tools/src/test/java/opennlp/tools/util/featuregen/GeneratorFactoryTest.java b/opennlp-tools/src/test/java/opennlp/tools/util/featuregen/GeneratorFactoryTest.java
index f974011..35a58bb 100644
--- a/opennlp-tools/src/test/java/opennlp/tools/util/featuregen/GeneratorFactoryTest.java
+++ b/opennlp-tools/src/test/java/opennlp/tools/util/featuregen/GeneratorFactoryTest.java
@@ -172,4 +172,76 @@ public class GeneratorFactoryTest {
Assert.assertTrue(featureGenerator.bp);
Assert.assertEquals("HELLO", featureGenerator.sp);
}
+
+ @Test
+ public void testNotAutomaticallyInsertAggregatedFeatureGenerator() throws Exception {
+ InputStream generatorDescriptorIn = getClass().getResourceAsStream(
+ "/opennlp/tools/util/featuregen/TestNotAutomaticallyInsertAggregatedFeatureGenerator.xml");
+
+ // If this fails the generator descriptor could not be found
+ // at the expected location
+ Assert.assertNotNull(generatorDescriptorIn);
+
+ AdaptiveFeatureGenerator featureGenerator = GeneratorFactory.create(generatorDescriptorIn, null);
+ Assert.assertTrue(featureGenerator instanceof OutcomePriorFeatureGenerator);
+ }
+
+ @Test
+ public void testAutomaticallyInsertAggregatedFeatureGenerator() throws Exception {
+ InputStream generatorDescriptorIn = getClass().getResourceAsStream(
+ "/opennlp/tools/util/featuregen/TestAutomaticallyInsertAggregatedFeatureGenerator.xml");
+
+ // If this fails the generator descriptor could not be found
+ // at the expected location
+ Assert.assertNotNull(generatorDescriptorIn);
+
+ AdaptiveFeatureGenerator featureGenerator = GeneratorFactory.create(generatorDescriptorIn, null);
+ Assert.assertTrue(featureGenerator instanceof AggregatedFeatureGenerator);
+
+ AggregatedFeatureGenerator aggregatedFeatureGenerator = (AggregatedFeatureGenerator)featureGenerator;
+ Assert.assertEquals(3, aggregatedFeatureGenerator.getGenerators().size());
+ for (AdaptiveFeatureGenerator afg: aggregatedFeatureGenerator.getGenerators()) {
+ Assert.assertTrue(afg instanceof OutcomePriorFeatureGenerator);
+ }
+ }
+
+ @Test
+ public void testNotAutomaticallyInsertAggregatedFeatureGeneratorChild() throws Exception {
+ InputStream generatorDescriptorIn = getClass().getResourceAsStream(
+ "/opennlp/tools/util/featuregen/TestNotAutomaticallyInsertAggregatedFeatureGeneratorChild.xml");
+
+ // If this fails the generator descriptor could not be found
+ // at the expected location
+ Assert.assertNotNull(generatorDescriptorIn);
+
+ AdaptiveFeatureGenerator featureGenerator = GeneratorFactory.create(generatorDescriptorIn, null);
+ Assert.assertTrue(featureGenerator instanceof CachedFeatureGenerator);
+
+ CachedFeatureGenerator cachedFeatureGenerator = (CachedFeatureGenerator)featureGenerator;
+ Assert.assertTrue(cachedFeatureGenerator.getCachedFeatureGenerator()
+ instanceof OutcomePriorFeatureGenerator);
+ }
+
+ @Test
+ public void testAutomaticallyInsertAggregatedFeatureGeneratorChildren() throws Exception {
+ InputStream generatorDescriptorIn = getClass().getResourceAsStream(
+ "/opennlp/tools/util/featuregen/TestAutomaticallyInsertAggregatedFeatureGeneratorChildren.xml");
+
+ // If this fails the generator descriptor could not be found
+ // at the expected location
+ Assert.assertNotNull(generatorDescriptorIn);
+
+ AdaptiveFeatureGenerator featureGenerator = GeneratorFactory.create(generatorDescriptorIn, null);
+ Assert.assertTrue(featureGenerator instanceof CachedFeatureGenerator);
+
+ CachedFeatureGenerator cachedFeatureGenerator = (CachedFeatureGenerator)featureGenerator;
+ AdaptiveFeatureGenerator afg = cachedFeatureGenerator.getCachedFeatureGenerator();
+ Assert.assertTrue(afg instanceof AggregatedFeatureGenerator);
+
+ AggregatedFeatureGenerator aggregatedFeatureGenerator = (AggregatedFeatureGenerator)afg;
+ Assert.assertEquals(3, aggregatedFeatureGenerator.getGenerators().size());
+ for (AdaptiveFeatureGenerator afgen: aggregatedFeatureGenerator.getGenerators()) {
+ Assert.assertTrue(afgen instanceof OutcomePriorFeatureGenerator);
+ }
+ }
}
diff --git a/opennlp-tools/src/test/resources/opennlp/tools/util/featuregen/TestFeatureGeneratorConfig.xml b/opennlp-tools/src/test/resources/opennlp/tools/util/featuregen/TestAutomaticallyInsertAggregatedFeatureGenerator.xml
similarity index 72%
copy from opennlp-tools/src/test/resources/opennlp/tools/util/featuregen/TestFeatureGeneratorConfig.xml
copy to opennlp-tools/src/test/resources/opennlp/tools/util/featuregen/TestAutomaticallyInsertAggregatedFeatureGenerator.xml
index 6518948..82e2a74 100644
--- a/opennlp-tools/src/test/resources/opennlp/tools/util/featuregen/TestFeatureGeneratorConfig.xml
+++ b/opennlp-tools/src/test/resources/opennlp/tools/util/featuregen/TestAutomaticallyInsertAggregatedFeatureGenerator.xml
@@ -8,9 +8,9 @@
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
@@ -19,7 +19,8 @@
under the License.
-->
-<generators>
- <definition/>
-</generators>
-
+<featureGenerators name="test">
+ <generator class="opennlp.tools.util.featuregen.DefinitionFeatureGeneratorFactory"/>
+ <generator class="opennlp.tools.util.featuregen.DefinitionFeatureGeneratorFactory"/>
+ <generator class="opennlp.tools.util.featuregen.DefinitionFeatureGeneratorFactory"/>
+</featureGenerators>
diff --git a/opennlp-tools/src/test/resources/opennlp/tools/util/featuregen/TestFeatureGeneratorConfig.xml b/opennlp-tools/src/test/resources/opennlp/tools/util/featuregen/TestAutomaticallyInsertAggregatedFeatureGeneratorChildren.xml
similarity index 66%
copy from opennlp-tools/src/test/resources/opennlp/tools/util/featuregen/TestFeatureGeneratorConfig.xml
copy to opennlp-tools/src/test/resources/opennlp/tools/util/featuregen/TestAutomaticallyInsertAggregatedFeatureGeneratorChildren.xml
index 6518948..7dbed59 100644
--- a/opennlp-tools/src/test/resources/opennlp/tools/util/featuregen/TestFeatureGeneratorConfig.xml
+++ b/opennlp-tools/src/test/resources/opennlp/tools/util/featuregen/TestAutomaticallyInsertAggregatedFeatureGeneratorChildren.xml
@@ -8,9 +8,9 @@
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
@@ -19,7 +19,10 @@
under the License.
-->
-<generators>
- <definition/>
-</generators>
-
+<featureGenerators name="test">
+ <generator class="opennlp.tools.util.featuregen.CachedFeatureGeneratorFactory">
+ <generator class="opennlp.tools.util.featuregen.DefinitionFeatureGeneratorFactory"/>
+ <generator class="opennlp.tools.util.featuregen.DefinitionFeatureGeneratorFactory"/>
+ <generator class="opennlp.tools.util.featuregen.DefinitionFeatureGeneratorFactory"/>
+ </generator>
+</featureGenerators>
diff --git a/opennlp-tools/src/test/resources/opennlp/tools/util/featuregen/TestFeatureGeneratorConfig.xml b/opennlp-tools/src/test/resources/opennlp/tools/util/featuregen/TestFeatureGeneratorConfig.xml
index 6518948..8ebb56f 100644
--- a/opennlp-tools/src/test/resources/opennlp/tools/util/featuregen/TestFeatureGeneratorConfig.xml
+++ b/opennlp-tools/src/test/resources/opennlp/tools/util/featuregen/TestFeatureGeneratorConfig.xml
@@ -19,7 +19,8 @@
under the License.
-->
-<generators>
- <definition/>
-</generators>
-
+<featureGenerators name="test">
+ <generator class="opennlp.tools.util.featuregen.AggregatedFeatureGeneratorFactory">
+ <generator class="opennlp.tools.util.featuregen.DefinitionFeatureGeneratorFactory"/>
+ </generator>
+</featureGenerators>
diff --git a/opennlp-tools/src/test/resources/opennlp/tools/util/featuregen/TestFeatureGeneratorConfig.xml b/opennlp-tools/src/test/resources/opennlp/tools/util/featuregen/TestNotAutomaticallyInsertAggregatedFeatureGenerator.xml
similarity index 85%
copy from opennlp-tools/src/test/resources/opennlp/tools/util/featuregen/TestFeatureGeneratorConfig.xml
copy to opennlp-tools/src/test/resources/opennlp/tools/util/featuregen/TestNotAutomaticallyInsertAggregatedFeatureGenerator.xml
index 6518948..7a15b99 100644
--- a/opennlp-tools/src/test/resources/opennlp/tools/util/featuregen/TestFeatureGeneratorConfig.xml
+++ b/opennlp-tools/src/test/resources/opennlp/tools/util/featuregen/TestNotAutomaticallyInsertAggregatedFeatureGenerator.xml
@@ -8,9 +8,9 @@
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
@@ -19,7 +19,6 @@
under the License.
-->
-<generators>
- <definition/>
-</generators>
-
+<featureGenerators name="test">
+ <generator class="opennlp.tools.util.featuregen.DefinitionFeatureGeneratorFactory"/>
+</featureGenerators>
diff --git a/opennlp-tools/src/test/resources/opennlp/tools/util/featuregen/TestFeatureGeneratorConfig.xml b/opennlp-tools/src/test/resources/opennlp/tools/util/featuregen/TestNotAutomaticallyInsertAggregatedFeatureGeneratorChild.xml
similarity index 77%
copy from opennlp-tools/src/test/resources/opennlp/tools/util/featuregen/TestFeatureGeneratorConfig.xml
copy to opennlp-tools/src/test/resources/opennlp/tools/util/featuregen/TestNotAutomaticallyInsertAggregatedFeatureGeneratorChild.xml
index 6518948..ed7f2f6 100644
--- a/opennlp-tools/src/test/resources/opennlp/tools/util/featuregen/TestFeatureGeneratorConfig.xml
+++ b/opennlp-tools/src/test/resources/opennlp/tools/util/featuregen/TestNotAutomaticallyInsertAggregatedFeatureGeneratorChild.xml
@@ -8,9 +8,9 @@
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
@@ -19,7 +19,8 @@
under the License.
-->
-<generators>
- <definition/>
-</generators>
-
+<featureGenerators name="test">
+ <generator class="opennlp.tools.util.featuregen.CachedFeatureGeneratorFactory">
+ <generator class="opennlp.tools.util.featuregen.DefinitionFeatureGeneratorFactory"/>
+ </generator>
+</featureGenerators>
diff --git a/opennlp-tools/src/test/resources/opennlp/tools/util/featuregen/TestTokenClassFeatureGeneratorConfig.xml b/opennlp-tools/src/test/resources/opennlp/tools/util/featuregen/TestTokenClassFeatureGeneratorConfig.xml
index e384a7e..63b7b7c 100644
--- a/opennlp-tools/src/test/resources/opennlp/tools/util/featuregen/TestTokenClassFeatureGeneratorConfig.xml
+++ b/opennlp-tools/src/test/resources/opennlp/tools/util/featuregen/TestTokenClassFeatureGeneratorConfig.xml
@@ -19,6 +19,10 @@
under the License.
-->
-<generators>
- <tokenclass wordAndClass="true"/>
-</generators>
\ No newline at end of file
+<featureGenerators name="test">
+ <generator class="opennlp.tools.util.featuregen.AggregatedFeatureGeneratorFactory">
+ <generator class="opennlp.tools.util.featuregen.TokenClassFeatureGeneratorFactory">
+ <bool name="wordAndClass">true</bool>
+ </generator>
+ </generator>
+</featureGenerators>
--
To stop receiving notification emails like this one, please contact
['"commits@opennlp.apache.org" <co...@opennlp.apache.org>'].