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>
- *   &lt;generator class="opennlp.tools.util.featuregen.AggregatedFeatureGeneratorFactory"&gt;
+ * <p>
+ * &lt;featureGenerators name="namefind"&gt;
  *     &lt;generator class="opennlp.tools.util.featuregen.CachedFeatureGeneratorFactory"&gt;
- *       &lt;generator class="opennlp.tools.util.featuregen.AggregatedFeatureGeneratorFactory"&gt;
  *         &lt;generator class="opennlp.tools.util.featuregen.WindowFeatureGeneratorFactory"&gt;
  *           &lt;int name="prevLength"&gt;2&lt;/int&gt;
  *           &lt;int name="nextLength"&gt;2&lt;/int&gt;
@@ -73,9 +72,8 @@ import opennlp.tools.util.model.POSModelSerializer;
  *           &lt;bool name="begin"&gt;true&lt;/bool&gt;
  *           &lt;bool name="end"&gt;false&lt;/bool&gt;
  *         &lt;/generator&gt;
- *       &lt;/generator&gt;
  *     &lt;/generator&gt;
- *   &lt;/generator&gt;
+ * &lt;/featureGenerators&gt;
  * </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>'].