This is an automated email from the ASF dual-hosted git repository. mawiesne pushed a commit to branch OPENNLP-1652-Add-additional-constructors-for-ThreadSafePOSTaggerME in repository https://gitbox.apache.org/repos/asf/opennlp.git
commit 0130f9b9d645cd8b081b532f6bd030a14e30e628 Author: Martin Wiesner <[email protected]> AuthorDate: Sat Nov 23 22:56:15 2024 +0100 OPENNLP-1652 Add additional constructors for ThreadSafePOSTaggerME --- .../tools/postag/ThreadSafePOSTaggerME.java | 52 ++++++++++++++++++++-- 1 file changed, 49 insertions(+), 3 deletions(-) diff --git a/opennlp-tools/src/main/java/opennlp/tools/postag/ThreadSafePOSTaggerME.java b/opennlp-tools/src/main/java/opennlp/tools/postag/ThreadSafePOSTaggerME.java index b567f1ea..36984212 100644 --- a/opennlp-tools/src/main/java/opennlp/tools/postag/ThreadSafePOSTaggerME.java +++ b/opennlp-tools/src/main/java/opennlp/tools/postag/ThreadSafePOSTaggerME.java @@ -17,12 +17,15 @@ package opennlp.tools.postag; +import java.io.IOException; + import opennlp.tools.commons.ThreadSafe; +import opennlp.tools.util.DownloadUtil; import opennlp.tools.util.Sequence; /** - * A thread-safe version of the POSTaggerME. Using it is completely transparent. You can use it in - * a single-threaded context as well, it only incurs a minimal overhead. + * A thread-safe version of the {@link POSTaggerME}. Using it is completely transparent. + * You can use it in a single-threaded context as well, it only incurs a minimal overhead. * <p> * Note, however, that this implementation uses a {@link ThreadLocal}. Although the implementation is * lightweight because the model is not duplicated, if you have many long-running threads, @@ -32,23 +35,66 @@ import opennlp.tools.util.Sequence; * Be careful when using this in a Jakarta EE application, for example. * </p> * The user is responsible for clearing the {@link ThreadLocal}. + * + * @see POSTagger */ @ThreadSafe public class ThreadSafePOSTaggerME implements POSTagger, AutoCloseable { private final POSModel model; + private final POSTagFormat posTagFormat; + private final ThreadLocal<POSTaggerME> threadLocal = new ThreadLocal<>(); + /** + * Initializes a {@link ThreadSafePOSTaggerME} by downloading a default model for a given + * {@code language}. + * + * @param language An ISO conform language code. + * @throws IOException Thrown if the model could not be downloaded or saved. + */ + public ThreadSafePOSTaggerME(String language) throws IOException { + this(language, POSTagFormat.UD); + } + + /** + * Initializes a {@link ThreadSafePOSTaggerME} by downloading a default model + * for a given {@code language}. + * + * @param language An ISO conform language code. + * @param format A valid {@link POSTagFormat}. + * @throws IOException Thrown if the model could not be downloaded or saved. + */ + public ThreadSafePOSTaggerME(String language, POSTagFormat format) throws IOException { + this(DownloadUtil.downloadModel(language, DownloadUtil.ModelType.POS, POSModel.class), format); + } + + /** + * Initializes a {@link ThreadSafePOSTaggerME} with the specified {@code model}. + * + * @param model A valid {@link POSModel}. + */ public ThreadSafePOSTaggerME(POSModel model) { + this(model, POSTagFormat.UD); + } + + /** + * Initializes a {@link ThreadSafePOSTaggerME} with the specified {@link POSModel model}. + * + * @param model A valid {@link POSModel}. + * @param format A valid {@link POSTagFormat}. + */ + public ThreadSafePOSTaggerME(POSModel model, POSTagFormat format) { super(); this.model = model; + this.posTagFormat = format; } private POSTaggerME getTagger() { POSTaggerME tagger = threadLocal.get(); if (tagger == null) { - tagger = new POSTaggerME(model); + tagger = new POSTaggerME(model, posTagFormat); threadLocal.set(tagger); } return tagger;
