Jörn,

Can you please review my change to the ExtensionLoader? I modified it to
accept singletons (private constructor and the field INSTANCE).

Thank you,
William


2014-04-16 12:26 GMT-03:00 <co...@apache.org>:

> Author: colen
> Date: Wed Apr 16 15:26:24 2014
> New Revision: 1587944
>
> URL: http://svn.apache.org/r1587944
> Log:
> OPENNLP-674 Added factory to Doccat
>
> Added:
>
> opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/doccat/DoccatFactory.java
>   (with props)
>
> opennlp/trunk/opennlp-tools/src/test/java/opennlp/tools/doccat/DoccatFactoryTest.java
>   (with props)
>     opennlp/trunk/opennlp-tools/src/test/resources/opennlp/tools/doccat/
>
> opennlp/trunk/opennlp-tools/src/test/resources/opennlp/tools/doccat/DoccatSample.txt
>   (with props)
> Modified:
>
> opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/cmdline/doccat/DoccatCrossValidatorTool.java
>
> opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/cmdline/doccat/DoccatTrainerTool.java
>
> opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/cmdline/doccat/TrainingParams.java
>
> opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/doccat/DoccatCrossValidator.java
>
> opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/doccat/DoccatModel.java
>
> opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/doccat/DocumentCategorizerME.java
>
> opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/sentdetect/SentenceDetectorFactory.java
>
> opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/util/ext/ExtensionLoader.java
>
> Modified:
> opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/cmdline/doccat/DoccatCrossValidatorTool.java
> URL:
> http://svn.apache.org/viewvc/opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/cmdline/doccat/DoccatCrossValidatorTool.java?rev=1587944&r1=1587943&r2=1587944&view=diff
>
> ==============================================================================
> ---
> opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/cmdline/doccat/DoccatCrossValidatorTool.java
> (original)
> +++
> opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/cmdline/doccat/DoccatCrossValidatorTool.java
> Wed Apr 16 15:26:24 2014
> @@ -34,8 +34,10 @@ import opennlp.tools.cmdline.doccat.Docc
>  import opennlp.tools.cmdline.params.CVParams;
>  import opennlp.tools.doccat.DoccatCrossValidator;
>  import opennlp.tools.doccat.DoccatEvaluationMonitor;
> +import opennlp.tools.doccat.DoccatFactory;
>  import opennlp.tools.doccat.DocumentSample;
>  import opennlp.tools.doccat.FeatureGenerator;
> +import opennlp.tools.tokenize.Tokenizer;
>  import opennlp.tools.util.eval.EvaluationMonitor;
>  import opennlp.tools.util.model.ModelUtil;
>
> @@ -88,13 +90,18 @@ public final class DoccatCrossValidatorT
>      FeatureGenerator[] featureGenerators = DoccatTrainerTool
>          .createFeatureGenerators(params.getFeatureGenerators());
>
> +    Tokenizer tokenizer = DoccatTrainerTool.createTokenizer(params
> +        .getTokenizer());
> +
>      DoccatEvaluationMonitor[] listenersArr = listeners
>          .toArray(new DoccatEvaluationMonitor[listeners.size()]);
>
>      DoccatCrossValidator validator;
>      try {
> +      DoccatFactory factory = DoccatFactory.create(params.getFactory(),
> +          tokenizer, featureGenerators);
>        validator = new DoccatCrossValidator(params.getLang(), mlParams,
> -          featureGenerators, listenersArr);
> +          factory, listenersArr);
>
>        validator.evaluate(sampleStream, params.getFolds());
>      } catch (IOException e) {
>
> Modified:
> opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/cmdline/doccat/DoccatTrainerTool.java
> URL:
> http://svn.apache.org/viewvc/opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/cmdline/doccat/DoccatTrainerTool.java?rev=1587944&r1=1587943&r2=1587944&view=diff
>
> ==============================================================================
> ---
> opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/cmdline/doccat/DoccatTrainerTool.java
> (original)
> +++
> opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/cmdline/doccat/DoccatTrainerTool.java
> Wed Apr 16 15:26:24 2014
> @@ -26,16 +26,19 @@ import opennlp.tools.cmdline.TerminateTo
>  import opennlp.tools.cmdline.doccat.DoccatTrainerTool.TrainerToolParams;
>  import opennlp.tools.cmdline.params.TrainingToolParams;
>  import opennlp.tools.doccat.BagOfWordsFeatureGenerator;
> +import opennlp.tools.doccat.DoccatFactory;
>  import opennlp.tools.doccat.DoccatModel;
>  import opennlp.tools.doccat.DocumentCategorizerME;
>  import opennlp.tools.doccat.DocumentSample;
>  import opennlp.tools.doccat.FeatureGenerator;
> +import opennlp.tools.tokenize.Tokenizer;
> +import opennlp.tools.tokenize.WhitespaceTokenizer;
>  import opennlp.tools.util.ext.ExtensionLoader;
>  import opennlp.tools.util.model.ModelUtil;
>
>  public class DoccatTrainerTool
>      extends AbstractTrainerTool<DocumentSample, TrainerToolParams> {
> -
> +
>    interface TrainerToolParams extends TrainingParams, TrainingToolParams {
>    }
>
> @@ -47,7 +50,7 @@ public class DoccatTrainerTool
>    public String getShortDescription() {
>      return "trainer for the learnable document categorizer";
>    }
> -
> +
>    @Override
>    public void run(String format, String[] args) {
>      super.run(format, args);
> @@ -64,10 +67,14 @@ public class DoccatTrainerTool
>      FeatureGenerator[] featureGenerators = createFeatureGenerators(params
>          .getFeatureGenerators());
>
> +    Tokenizer tokenizer = createTokenizer(params.getTokenizer());
> +
>      DoccatModel model;
>      try {
> +      DoccatFactory factory = DoccatFactory.create(params.getFactory(),
> +          tokenizer, featureGenerators);
>        model = DocumentCategorizerME.train(params.getLang(), sampleStream,
> -          mlParams, featureGenerators);
> +          mlParams, factory);
>      } catch (IOException e) {
>        throw new TerminateToolException(-1, "IO error while reading
> training data or indexing data: " +
>            e.getMessage(), e);
> @@ -79,10 +86,17 @@ public class DoccatTrainerTool
>          // sorry that this can fail
>        }
>      }
> -
> +
>      CmdLineUtil.writeModel("document categorizer", modelOutFile, model);
>    }
>
> +  static Tokenizer createTokenizer(String tokenizer) {
> +    if(tokenizer != null) {
> +      return ExtensionLoader.instantiateExtension(Tokenizer.class,
> tokenizer);
> +    }
> +    return WhitespaceTokenizer.INSTANCE;
> +  }
> +
>    static FeatureGenerator[] createFeatureGenerators(String
> featureGeneratorsNames) {
>      if(featureGeneratorsNames == null) {
>        FeatureGenerator[] def = {new BagOfWordsFeatureGenerator()};
>
> Modified:
> opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/cmdline/doccat/TrainingParams.java
> URL:
> http://svn.apache.org/viewvc/opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/cmdline/doccat/TrainingParams.java?rev=1587944&r1=1587943&r2=1587944&view=diff
>
> ==============================================================================
> ---
> opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/cmdline/doccat/TrainingParams.java
> (original)
> +++
> opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/cmdline/doccat/TrainingParams.java
> Wed Apr 16 15:26:24 2014
> @@ -32,4 +32,12 @@ interface TrainingParams extends BasicTr
>    @OptionalParameter
>    String getFeatureGenerators();
>
> +  @ParameterDescription(valueName = "tokenizer", description = "Tokenizer
> implementation. WhitespaceTokenizer is used if not specified.")
> +  @OptionalParameter
> +  String getTokenizer();
> +
> +  @ParameterDescription(valueName = "factoryName", description = "A
> sub-class of DoccatFactory where to get implementation and resources.")
> +  @OptionalParameter
> +  String getFactory();
> +
>  }
>
> Modified:
> opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/doccat/DoccatCrossValidator.java
> URL:
> http://svn.apache.org/viewvc/opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/doccat/DoccatCrossValidator.java?rev=1587944&r1=1587943&r2=1587944&view=diff
>
> ==============================================================================
> ---
> opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/doccat/DoccatCrossValidator.java
> (original)
> +++
> opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/doccat/DoccatCrossValidator.java
> Wed Apr 16 15:26:24 2014
> @@ -34,18 +34,19 @@ public class DoccatCrossValidator {
>
>    private DoccatEvaluationMonitor[] listeners;
>
> -  private FeatureGenerator[] featureGenarators;
> +  private DoccatFactory factory;
> +
>
>    /**
>     * Creates a {@link DoccatCrossValidator} with the given
>     * {@link FeatureGenerator}s.
>     */
>    public DoccatCrossValidator(String languageCode, TrainingParameters
> mlParams,
> -      FeatureGenerator[] featureGenerators, DoccatEvaluationMonitor[]
> listeners) {
> +      DoccatFactory factory, DoccatEvaluationMonitor ... listeners) {
>      this.languageCode = languageCode;
>      this.params = mlParams;
>      this.listeners = listeners;
> -    this.featureGenarators = featureGenerators;
> +    this.factory = factory;
>    }
>
>    /**
> @@ -70,7 +71,7 @@ public class DoccatCrossValidator {
>            .next();
>
>        DoccatModel model = DocumentCategorizerME.train(languageCode,
> -          trainingSampleStream, params, featureGenarators);
> +          trainingSampleStream, params, factory);
>
>        DocumentCategorizerEvaluator evaluator = new
> DocumentCategorizerEvaluator(
>            new DocumentCategorizerME(model), listeners);
>
> Added:
> opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/doccat/DoccatFactory.java
> URL:
> http://svn.apache.org/viewvc/opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/doccat/DoccatFactory.java?rev=1587944&view=auto
>
> ==============================================================================
> ---
> opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/doccat/DoccatFactory.java
> (added)
> +++
> opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/doccat/DoccatFactory.java
> Wed Apr 16 15:26:24 2014
> @@ -0,0 +1,174 @@
> +/*
> + * 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 opennlp.tools.doccat;
> +
> +import java.util.Arrays;
> +import java.util.Iterator;
> +import java.util.List;
> +import java.util.Map;
> +
> +import opennlp.tools.tokenize.Tokenizer;
> +import opennlp.tools.tokenize.WhitespaceTokenizer;
> +import opennlp.tools.util.BaseToolFactory;
> +import opennlp.tools.util.InvalidFormatException;
> +import opennlp.tools.util.ext.ExtensionLoader;
> +
> +/**
> + * The factory that provides Doccat default implementations and resources
> + */
> +public class DoccatFactory extends BaseToolFactory {
> +
> +  private static final String FEATURE_GENERATORS =
> "doccat.featureGenerators";
> +  private static final String TOKENIZER_NAME = "doccat.tokenizer";
> +
> +  private FeatureGenerator[] featureGenerators;
> +  private Tokenizer tokenizer;
> +
> +  /**
> +   * Creates a {@link DoccatFactory} that provides the default
> implementation of
> +   * the resources.
> +   */
> +  public DoccatFactory() {
> +  }
> +
> +  /**
> +   * Creates a {@link DoccatFactory}. Use this constructor to
> programmatically
> +   * create a factory.
> +   *
> +   * @param tokenizer
> +   * @param featureGenerators
> +   */
> +  public DoccatFactory(Tokenizer tokenizer, FeatureGenerator[]
> featureGenerators) {
> +    this.init(tokenizer, featureGenerators);
> +  }
> +
> +  protected void init(Tokenizer tokenizer, FeatureGenerator[]
> featureGenerators) {
> +
> +    this.featureGenerators = featureGenerators;
> +    this.tokenizer = tokenizer;
> +  }
> +
> +  @Override
> +  public Map<String, String> createManifestEntries() {
> +    Map<String, String> manifestEntries = super.createManifestEntries();
> +
> +    if (getTokenizer() != null) {
> +      manifestEntries.put(TOKENIZER_NAME, getTokenizer().getClass()
> +          .getCanonicalName());
> +    }
> +
> +    if (getFeatureGenerators() != null) {
> +      manifestEntries.put(FEATURE_GENERATORS,
> featureGeneratorsAsString());
> +    }
> +
> +    return manifestEntries;
> +  }
> +
> +  private String featureGeneratorsAsString() {
> +    List<FeatureGenerator> fgs = Arrays.asList(getFeatureGenerators());
> +    Iterator<FeatureGenerator> iter = fgs.iterator();
> +    StringBuilder sb = new StringBuilder();
> +    if (iter.hasNext()) {
> +      sb.append(iter.next().getClass().getCanonicalName());
> +      while (iter.hasNext()) {
> +        sb.append(',').append(iter.next().getClass().getCanonicalName());
> +      }
> +    }
> +    return sb.toString();
> +  }
> +
> +  @Override
> +  public void validateArtifactMap() throws InvalidFormatException {
> +    // nothing to validate
> +  }
> +
> +  public static DoccatFactory create(String subclassName, Tokenizer
> tokenizer,
> +      FeatureGenerator[] featureGenerators) throws InvalidFormatException
> {
> +    if (subclassName == null) {
> +      // will create the default factory
> +      return new DoccatFactory(tokenizer, featureGenerators);
> +    }
> +    try {
> +      DoccatFactory theFactory = ExtensionLoader.instantiateExtension(
> +          DoccatFactory.class, subclassName);
> +      theFactory.init(tokenizer, featureGenerators);
> +      return theFactory;
> +    } catch (Exception e) {
> +      String msg = "Could not instantiate the " + subclassName
> +          + ". The initialization throw an exception.";
> +      System.err.println(msg);
> +      e.printStackTrace();
> +      throw new InvalidFormatException(msg, e);
> +    }
> +
> +  }
> +
> +  private FeatureGenerator[] loadFeatureGenerators(String classNames) {
> +    String[] classes = classNames.split(",");
> +    FeatureGenerator[] fgs = new FeatureGenerator[classes.length];
> +
> +    for (int i = 0; i < classes.length; i++) {
> +      fgs[i] =
> ExtensionLoader.instantiateExtension(FeatureGenerator.class,
> +          classes[i]);
> +    }
> +    return fgs;
> +  }
> +
> +  public FeatureGenerator[] getFeatureGenerators() {
> +    if (featureGenerators == null) {
> +      if (artifactProvider != null) {
> +        String classNames = artifactProvider
> +            .getManifestProperty(FEATURE_GENERATORS);
> +        if (classNames != null) {
> +          this.featureGenerators = loadFeatureGenerators(classNames);
> +        }
> +      }
> +      if (featureGenerators == null) { // could not load using artifact
> provider
> +        // load bag of words as default
> +        FeatureGenerator[] bow = { new BagOfWordsFeatureGenerator() };
> +        this.featureGenerators = bow;
> +      }
> +    }
> +    return featureGenerators;
> +  }
> +
> +  public void setFeatureGenerators(FeatureGenerator[] featureGenerators) {
> +    this.featureGenerators = featureGenerators;
> +  }
> +
> +  public Tokenizer getTokenizer() {
> +    if (this.tokenizer == null) {
> +      if (artifactProvider != null) {
> +        String className =
> artifactProvider.getManifestProperty(TOKENIZER_NAME);
> +        if (className != null) {
> +          this.tokenizer = ExtensionLoader.instantiateExtension(
> +              Tokenizer.class, className);
> +        }
> +      }
> +      if (this.tokenizer == null) { // could not load using artifact
> provider
> +        this.tokenizer = WhitespaceTokenizer.INSTANCE;
> +      }
> +    }
> +    return tokenizer;
> +  }
> +
> +  public void setTokenizer(Tokenizer tokenizer) {
> +    this.tokenizer = tokenizer;
> +  }
> +
> +}
>
> Propchange:
> opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/doccat/DoccatFactory.java
>
> ------------------------------------------------------------------------------
>     svn:mime-type = text/plain
>
> Modified:
> opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/doccat/DoccatModel.java
> URL:
> http://svn.apache.org/viewvc/opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/doccat/DoccatModel.java?rev=1587944&r1=1587943&r2=1587944&view=diff
>
> ==============================================================================
> ---
> opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/doccat/DoccatModel.java
> (original)
> +++
> opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/doccat/DoccatModel.java
> Wed Apr 16 15:26:24 2014
> @@ -25,34 +25,50 @@ import java.util.Map;
>
>  import opennlp.tools.ml.model.AbstractModel;
>  import opennlp.tools.ml.model.MaxentModel;
> +import opennlp.tools.util.BaseToolFactory;
>  import opennlp.tools.util.InvalidFormatException;
>  import opennlp.tools.util.model.BaseModel;
>
>  public class DoccatModel extends BaseModel {
> -
> +
>    private static final String COMPONENT_NAME = "DocumentCategorizerME";
>    private static final String DOCCAT_MODEL_ENTRY_NAME = "doccat.model";
> -
> -  protected DoccatModel(String languageCode, MaxentModel doccatModel,
> -      Map<String, String> manifestInfoEntries) {
> -    super(COMPONENT_NAME, languageCode, manifestInfoEntries);
> -
> +
> +  public DoccatModel(String languageCode, MaxentModel doccatModel,
> +      Map<String, String> manifestInfoEntries, DoccatFactory factory) {
> +    super(COMPONENT_NAME, languageCode, manifestInfoEntries, factory);
> +
>      artifactMap.put(DOCCAT_MODEL_ENTRY_NAME, doccatModel);
>      checkArtifactMap();
>    }
> -
> +
> +  /**
> +   * @deprecated Use
> +   *             {@link #DoccatModel(String, MaxentModel, Map,
> DoccatFactory)}
> +   *             instead and pass in a {@link DoccatFactory}
> +   */
> +  protected DoccatModel(String languageCode, MaxentModel doccatModel,
> +      Map<String, String> manifestInfoEntries) {
> +    this(languageCode, doccatModel, manifestInfoEntries, new
> DoccatFactory());
> +  }
> +
> +  /**
> +   * @deprecated Use
> +   *             {@link #DoccatModel(String, MaxentModel, Map,
> DoccatFactory)}
> +   *             instead and pass in a {@link DoccatFactory}
> +   */
>    public DoccatModel(String languageCode, MaxentModel doccatModel) {
>      this(languageCode, doccatModel, null);
>    }
> -
> +
>    public DoccatModel(InputStream in) throws IOException,
> InvalidFormatException {
>      super(COMPONENT_NAME, in);
>    }
> -
> +
>    public DoccatModel(File modelFile) throws IOException,
> InvalidFormatException {
>      super(COMPONENT_NAME, modelFile);
>    }
> -
> +
>    public DoccatModel(URL modelURL) throws IOException,
> InvalidFormatException {
>      super(COMPONENT_NAME, modelURL);
>    }
> @@ -66,7 +82,23 @@ public class DoccatModel extends BaseMod
>      }
>    }
>
> +  public DoccatFactory getFactory() {
> +    return (DoccatFactory) this.toolFactory;
> +  }
> +
> +  @Override
> +  protected Class<? extends BaseToolFactory> getDefaultFactory() {
> +    return DoccatFactory.class;
> +  }
> +
> +  /**
> +   * @deprecated Use {@link #getMaxentModel()} instead.
> +   */
>    public MaxentModel getChunkerModel() {
>      return (MaxentModel) artifactMap.get(DOCCAT_MODEL_ENTRY_NAME);
>    }
> +
> +  public MaxentModel getMaxentModel() {
> +    return (MaxentModel) artifactMap.get(DOCCAT_MODEL_ENTRY_NAME);
> +  }
>  }
>
> Modified:
> opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/doccat/DocumentCategorizerME.java
> URL:
> http://svn.apache.org/viewvc/opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/doccat/DocumentCategorizerME.java?rev=1587944&r1=1587943&r2=1587944&view=diff
>
> ==============================================================================
> ---
> opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/doccat/DocumentCategorizerME.java
> (original)
> +++
> opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/doccat/DocumentCategorizerME.java
> Wed Apr 16 15:26:24 2014
> @@ -25,7 +25,6 @@ import java.util.Map;
>
>  import opennlp.tools.ml.model.MaxentModel;
>  import opennlp.tools.ml.model.TrainUtil;
> -import opennlp.tools.tokenize.SimpleTokenizer;
>  import opennlp.tools.tokenize.Tokenizer;
>  import opennlp.tools.util.ObjectStream;
>  import opennlp.tools.util.TrainingParameters;
> @@ -40,29 +39,35 @@ public class DocumentCategorizerME imple
>     * Shared default thread safe feature generator.
>     */
>    private static FeatureGenerator defaultFeatureGenerator = new
> BagOfWordsFeatureGenerator();
> -
> -  private MaxentModel model;
> +
> +  private DoccatModel model;
>    private DocumentCategorizerContextGenerator mContextGenerator;
>
>    /**
> -   * Initializes a the current instance with a doccat model and custom
> feature generation.
> -   * The feature generation must be identical to the configuration at
> training time.
> -   *
> +   * Initializes a the current instance with a doccat model and custom
> feature
> +   * generation. The feature generation must be identical to the
> configuration
> +   * at training time.
> +   *
>     * @param model
>     * @param featureGenerators
> +   *
> +   * @deprecated train a {@link DoccatModel} with a specific
> +   *             {@link DoccatFactory} to customize the {@link
> FeatureGenerator}s
>     */
>    public DocumentCategorizerME(DoccatModel model, FeatureGenerator...
> featureGenerators) {
> -    this.model = model.getChunkerModel();
> +    this.model = model;
>      this.mContextGenerator = new
> DocumentCategorizerContextGenerator(featureGenerators);
>    }
> -
> +
>    /**
>     * Initializes the current instance with a doccat model. Default
> feature generation is used.
> -   *
> +   *
>     * @param model
>     */
>    public DocumentCategorizerME(DoccatModel model) {
> -    this(model, defaultFeatureGenerator);
> +    this.model = model;
> +    this.mContextGenerator = new
> DocumentCategorizerContextGenerator(this.model
> +        .getFactory().getFeatureGenerators());
>    }
>
>    /**
> @@ -71,7 +76,7 @@ public class DocumentCategorizerME imple
>     * @param text
>     */
>    public double[] categorize(String text[]) {
> -    return model.eval(mContextGenerator.getContext(text));
> +    return
> model.getMaxentModel().eval(mContextGenerator.getContext(text));
>    }
>
>    /**
> @@ -79,57 +84,79 @@ public class DocumentCategorizerME imple
>     * is passed to the feature generation.
>     */
>    public double[] categorize(String documentText) {
> -    Tokenizer tokenizer = SimpleTokenizer.INSTANCE;
> +    Tokenizer tokenizer = model.getFactory().getTokenizer();
>      return categorize(tokenizer.tokenize(documentText));
>    }
>
>    public String getBestCategory(double[] outcome) {
> -    return model.getBestOutcome(outcome);
> +    return model.getMaxentModel().getBestOutcome(outcome);
>    }
>
>    public int getIndex(String category) {
> -    return model.getIndex(category);
> +    return model.getMaxentModel().getIndex(category);
>    }
>
>    public String getCategory(int index) {
> -    return model.getOutcome(index);
> +    return model.getMaxentModel().getOutcome(index);
>    }
>
>    public int getNumberOfCategories() {
> -    return model.getNumOutcomes();
> +    return model.getMaxentModel().getNumOutcomes();
>    }
>
>    public String getAllResults(double results[]) {
> -    return model.getAllOutcomes(results);
> +    return model.getMaxentModel().getAllOutcomes(results);
>    }
>
> +   /**
> +   * @deprecated Use
> +   *             {@link #train(String, ObjectStream, TrainingParameters,
> DoccatFactory)}
> +   *             instead.
> +   */
>     public static DoccatModel train(String languageCode,
> ObjectStream<DocumentSample> samples,
>         TrainingParameters mlParams, FeatureGenerator... featureGenerators)
>     throws IOException {
> -
> +
>       if (featureGenerators.length == 0) {
>         featureGenerators = new
> FeatureGenerator[]{defaultFeatureGenerator};
>       }
> -
> +
>       Map<String, String> manifestInfoEntries = new HashMap<String,
> String>();
> -
> +
>       MaxentModel model = TrainUtil.train(
>           new DocumentCategorizerEventStream(samples, featureGenerators),
>           mlParams.getSettings(), manifestInfoEntries);
> -
> +
>       return new DoccatModel(languageCode, model, manifestInfoEntries);
>     }
> -
> +
> +   public static DoccatModel train(String languageCode,
> ObjectStream<DocumentSample> samples,
> +       TrainingParameters mlParams, DoccatFactory factory)
> +   throws IOException {
> +
> +     Map<String, String> manifestInfoEntries = new HashMap<String,
> String>();
> +
> +     MaxentModel model = TrainUtil.train(
> +         new DocumentCategorizerEventStream(samples,
> factory.getFeatureGenerators()),
> +         mlParams.getSettings(), manifestInfoEntries);
> +
> +     return new DoccatModel(languageCode, model, manifestInfoEntries,
> factory);
> +   }
> +
>    /**
>     * Trains a doccat model with default feature generation.
> -   *
> +   *
>     * @param languageCode
>     * @param samples
> -   *
> +   *
>     * @return the trained doccat model
> -   *
> +   *
>     * @throws IOException
> -   * @throws ObjectStreamException
> +   * @throws ObjectStreamException
> +   *
> +   * @deprecated Use
> +   *             {@link #train(String, ObjectStream, TrainingParameters,
> DoccatFactory)}
> +   *             instead.
>     */
>    public static DoccatModel train(String languageCode,
> ObjectStream<DocumentSample> samples) throws IOException {
>      return train(languageCode, samples,
> ModelUtil.createDefaultTrainingParameters(), defaultFeatureGenerator);
>
> Modified:
> opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/sentdetect/SentenceDetectorFactory.java
> URL:
> http://svn.apache.org/viewvc/opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/sentdetect/SentenceDetectorFactory.java?rev=1587944&r1=1587943&r2=1587944&view=diff
>
> ==============================================================================
> ---
> opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/sentdetect/SentenceDetectorFactory.java
> (original)
> +++
> opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/sentdetect/SentenceDetectorFactory.java
> Wed Apr 16 15:26:24 2014
> @@ -52,7 +52,7 @@ public class SentenceDetectorFactory ext
>    /**
>     * Creates a {@link SentenceDetectorFactory}. Use this constructor to
>     * programmatically create a factory.
> -   *
> +   *
>     * @param languageCode
>     * @param abbreviationDictionary
>     * @param eosCharacters
> @@ -61,7 +61,7 @@ public class SentenceDetectorFactory ext
>        Dictionary abbreviationDictionary, char[] eosCharacters) {
>      this.init(languageCode, useTokenEnd, abbreviationDictionary,
> eosCharacters);
>    }
> -
> +
>    protected void init(String languageCode, boolean useTokenEnd,
>        Dictionary abbreviationDictionary, char[] eosCharacters) {
>      this.languageCode = languageCode;
>
> Modified:
> opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/util/ext/ExtensionLoader.java
> URL:
> http://svn.apache.org/viewvc/opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/util/ext/ExtensionLoader.java?rev=1587944&r1=1587943&r2=1587944&view=diff
>
> ==============================================================================
> ---
> opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/util/ext/ExtensionLoader.java
> (original)
> +++
> opennlp/trunk/opennlp-tools/src/main/java/opennlp/tools/util/ext/ExtensionLoader.java
> Wed Apr 16 15:26:24 2014
> @@ -17,6 +17,8 @@
>
>  package opennlp.tools.util.ext;
>
> +import java.lang.reflect.Field;
> +
>  /**
>   * The {@link ExtensionLoader} is responsible to load extensions to the
> OpenNLP library.
>   * <p>
> @@ -64,6 +66,24 @@ public class ExtensionLoader {
>          } catch (InstantiationException e) {
>            throw new ExtensionNotLoadedException(e);
>          } catch (IllegalAccessException e) {
> +          // constructor is private. Try to load using INSTANCE
> +          Field instanceField;
> +          try {
> +            instanceField = extClazz.getDeclaredField("INSTANCE");
> +          } catch (NoSuchFieldException e1) {
> +            throw new ExtensionNotLoadedException(e1);
> +          } catch (SecurityException e1) {
> +            throw new ExtensionNotLoadedException(e1);
> +          }
> +          if(instanceField != null) {
> +            try {
> +              return (T) instanceField.get(null);
> +            } catch (IllegalArgumentException e1) {
> +              throw new ExtensionNotLoadedException(e1);
> +            } catch (IllegalAccessException e1) {
> +              throw new ExtensionNotLoadedException(e1);
> +            }
> +          }
>            throw new ExtensionNotLoadedException(e);
>          }
>        }
>
> Added:
> opennlp/trunk/opennlp-tools/src/test/java/opennlp/tools/doccat/DoccatFactoryTest.java
> URL:
> http://svn.apache.org/viewvc/opennlp/trunk/opennlp-tools/src/test/java/opennlp/tools/doccat/DoccatFactoryTest.java?rev=1587944&view=auto
>
> ==============================================================================
> ---
> opennlp/trunk/opennlp-tools/src/test/java/opennlp/tools/doccat/DoccatFactoryTest.java
> (added)
> +++
> opennlp/trunk/opennlp-tools/src/test/java/opennlp/tools/doccat/DoccatFactoryTest.java
> Wed Apr 16 15:26:24 2014
> @@ -0,0 +1,100 @@
> +package opennlp.tools.doccat;
> +
> +import static org.junit.Assert.assertEquals;
> +import static org.junit.Assert.assertNotNull;
> +
> +import java.io.ByteArrayInputStream;
> +import java.io.ByteArrayOutputStream;
> +import java.io.IOException;
> +
> +import opennlp.tools.formats.ResourceAsStreamFactory;
> +import opennlp.tools.tokenize.SimpleTokenizer;
> +import opennlp.tools.tokenize.WhitespaceTokenizer;
> +import opennlp.tools.util.InputStreamFactory;
> +import opennlp.tools.util.ObjectStream;
> +import opennlp.tools.util.PlainTextByLineStream;
> +import opennlp.tools.util.TrainingParameters;
> +
> +import org.junit.Test;
> +
> +/**
> + * Tests for the {@link DoccatFactory} class.
> + */
> +public class DoccatFactoryTest {
> +
> +  private static ObjectStream<DocumentSample> createSampleStream()
> +      throws IOException {
> +
> +    InputStreamFactory isf = new ResourceAsStreamFactory(
> +        DoccatFactoryTest.class,
> "/opennlp/tools/doccat/DoccatSample.txt");
> +
> +    return new DocumentSampleStream(new PlainTextByLineStream(isf,
> "UTF-8"));
> +  }
> +
> +  private static DoccatModel train() throws IOException {
> +    return DocumentCategorizerME.train("x-unspecified",
> createSampleStream(),
> +        TrainingParameters.defaultParams());
> +  }
> +
> +  private static DoccatModel train(DoccatFactory factory) throws
> IOException {
> +    return DocumentCategorizerME.train("x-unspecified",
> createSampleStream(),
> +        TrainingParameters.defaultParams(), factory);
> +  }
> +
> +  @Test
> +  public void testDefault() throws IOException {
> +    DoccatModel model = train();
> +
> +    assertNotNull(model);
> +
> +    ByteArrayOutputStream out = new ByteArrayOutputStream();
> +    model.serialize(out);
> +    ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
> +
> +    DoccatModel fromSerialized = new DoccatModel(in);
> +
> +    DoccatFactory factory = fromSerialized.getFactory();
> +
> +    assertNotNull(factory);
> +
> +    assertEquals(1, factory.getFeatureGenerators().length);
> +    assertEquals(BagOfWordsFeatureGenerator.class,
> +        factory.getFeatureGenerators()[0].getClass());
> +
> +    assertEquals(WhitespaceTokenizer.INSTANCE, factory.getTokenizer());
> +
> +  }
> +
> +  @Test
> +  public void testCustom() throws IOException {
> +    FeatureGenerator[] featureGenerators = { new
> BagOfWordsFeatureGenerator(),
> +        new NGramFeatureGenerator() };
> +    DoccatFactory factory = new DoccatFactory(SimpleTokenizer.INSTANCE,
> +        featureGenerators);
> +
> +    DoccatModel model = train(factory);
> +
> +    assertNotNull(model);
> +
> +    ByteArrayOutputStream out = new ByteArrayOutputStream();
> +    model.serialize(out);
> +    ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
> +
> +    DoccatModel fromSerialized = new DoccatModel(in);
> +
> +    factory = fromSerialized.getFactory();
> +
> +    assertNotNull(factory);
> +
> +    assertEquals(2, factory.getFeatureGenerators().length);
> +    assertEquals(BagOfWordsFeatureGenerator.class,
> +        factory.getFeatureGenerators()[0].getClass());
> +    assertEquals(NGramFeatureGenerator.class,
> +        factory.getFeatureGenerators()[1].getClass());
> +
> +    assertEquals(SimpleTokenizer.INSTANCE.getClass(),
> factory.getTokenizer()
> +        .getClass());
> +
> +  }
> +
> +}
>
> Propchange:
> opennlp/trunk/opennlp-tools/src/test/java/opennlp/tools/doccat/DoccatFactoryTest.java
>
> ------------------------------------------------------------------------------
>     svn:mime-type = text/plain
>
>
>

Reply via email to