You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ctakes.apache.org by se...@apache.org on 2017/11/26 15:56:24 UTC
svn commit: r1816385 [2/2] - in /ctakes/trunk:
ctakes-assertion-res/src/main/resources/org/apache/ctakes/assertion/pipeline/
ctakes-chunker-res/src/main/resources/org/apache/ctakes/chunker/pipeline/
ctakes-chunker/src/main/java/org/apache/ctakes/chunke...
Added: ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/concurrent/ThreadSafeMarkableSalienceAnnotator.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/concurrent/ThreadSafeMarkableSalienceAnnotator.java?rev=1816385&view=auto
==============================================================================
--- ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/concurrent/ThreadSafeMarkableSalienceAnnotator.java (added)
+++ ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/concurrent/ThreadSafeMarkableSalienceAnnotator.java Sun Nov 26 15:56:23 2017
@@ -0,0 +1,117 @@
+package org.apache.ctakes.coreference.concurrent;
+
+import org.apache.ctakes.core.concurrent.ThreadSafeWrapper;
+import org.apache.ctakes.core.pipeline.PipeBitInfo;
+import org.apache.ctakes.coreference.ae.MarkableSalienceAnnotator;
+import org.apache.uima.UimaContext;
+import org.apache.uima.analysis_engine.AnalysisEngineDescription;
+import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
+import org.apache.uima.fit.factory.AnalysisEngineFactory;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.resource.ResourceInitializationException;
+import org.cleartk.ml.CleartkAnnotator;
+import org.cleartk.ml.DataWriter;
+import org.cleartk.ml.jar.DefaultDataWriterFactory;
+import org.cleartk.ml.jar.DirectoryDataWriterFactory;
+import org.cleartk.ml.jar.GenericJarClassifierFactory;
+
+import java.io.File;
+import java.util.logging.Logger;
+
+/**
+ * Normally I would use composition and a singleton, but here extension is done for @ConfigurationParameter discovery.
+ * Made a singleton mostly for model memory.
+ *
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 11/20/2017
+ */
+@PipeBitInfo(
+ name = "Thread safe Markable Salience Annotator",
+ description = "Annotates Markable Salience.",
+ role = PipeBitInfo.Role.ANNOTATOR,
+ dependencies = { PipeBitInfo.TypeProduct.PARAGRAPH, PipeBitInfo.TypeProduct.SENTENCE,
+ PipeBitInfo.TypeProduct.MARKABLE, PipeBitInfo.TypeProduct.DEPENDENCY_NODE },
+ usables = { PipeBitInfo.TypeProduct.IDENTIFIED_ANNOTATION }
+)
+public class ThreadSafeMarkableSalienceAnnotator extends MarkableSalienceAnnotator {
+
+ static private final Logger LOGGER = Logger.getLogger( "ThreadSafeMarkableSalienceAnnotator" );
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void initialize( final UimaContext context ) throws ResourceInitializationException {
+ MsSingleton.getInstance().initialize( context );
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void process( final JCas jCas ) throws AnalysisEngineProcessException {
+ MsSingleton.getInstance().process( jCas );
+ }
+
+ public static AnalysisEngineDescription createDataWriterDescription(
+ Class<? extends DataWriter<Boolean>> dataWriterClass,
+ File outputDirectory ) throws ResourceInitializationException {
+ return AnalysisEngineFactory.createEngineDescription(
+ ThreadSafeMarkableSalienceAnnotator.class,
+ CleartkAnnotator.PARAM_IS_TRAINING,
+ true,
+ DefaultDataWriterFactory.PARAM_DATA_WRITER_CLASS_NAME,
+ dataWriterClass,
+ DirectoryDataWriterFactory.PARAM_OUTPUT_DIRECTORY,
+ outputDirectory );
+ }
+
+ public static AnalysisEngineDescription createAnnotatorDescription( final String modelPath )
+ throws ResourceInitializationException {
+ return AnalysisEngineFactory.createEngineDescription(
+ ThreadSafeMarkableSalienceAnnotator.class,
+ CleartkAnnotator.PARAM_IS_TRAINING, false,
+ GenericJarClassifierFactory.PARAM_CLASSIFIER_JAR_PATH, modelPath );
+ }
+
+
+ private enum MsSingleton implements ThreadSafeWrapper<MarkableSalienceAnnotator> {
+ INSTANCE;
+
+ static public MsSingleton getInstance() {
+ return INSTANCE;
+ }
+
+ private final MarkableSalienceAnnotator _delegate;
+ private boolean _initialized;
+
+ MsSingleton() {
+ _delegate = new MarkableSalienceAnnotator();
+ }
+
+ final private Object LOCK = new Object();
+
+ @Override
+ public Object getLock() {
+ return LOCK;
+ }
+
+ @Override
+ public MarkableSalienceAnnotator getDelegate() {
+ return _delegate;
+ }
+
+ @Override
+ public boolean isInitialized() {
+ return _initialized;
+ }
+
+ @Override
+ public void setInitialized( final boolean initialized ) {
+ _initialized = initialized;
+ }
+ }
+
+
+}
Added: ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/concurrent/ThreadSafeMentionClusterCoreferencer.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/concurrent/ThreadSafeMentionClusterCoreferencer.java?rev=1816385&view=auto
==============================================================================
--- ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/concurrent/ThreadSafeMentionClusterCoreferencer.java (added)
+++ ctakes/trunk/ctakes-coreference/src/main/java/org/apache/ctakes/coreference/concurrent/ThreadSafeMentionClusterCoreferencer.java Sun Nov 26 15:56:23 2017
@@ -0,0 +1,131 @@
+package org.apache.ctakes.coreference.concurrent;
+
+import org.apache.ctakes.core.concurrent.ThreadSafeWrapper;
+import org.apache.ctakes.core.pipeline.PipeBitInfo;
+import org.apache.ctakes.coreference.ae.MentionClusterCoreferenceAnnotator;
+import org.apache.uima.UimaContext;
+import org.apache.uima.analysis_engine.AnalysisEngineDescription;
+import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
+import org.apache.uima.fit.factory.AnalysisEngineFactory;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.resource.ResourceInitializationException;
+import org.cleartk.ml.CleartkAnnotator;
+import org.cleartk.ml.DataWriter;
+import org.cleartk.ml.jar.DefaultDataWriterFactory;
+import org.cleartk.ml.jar.DirectoryDataWriterFactory;
+import org.cleartk.ml.jar.GenericJarClassifierFactory;
+
+import java.io.File;
+import java.util.logging.Logger;
+
+import static org.apache.ctakes.core.pipeline.PipeBitInfo.TypeProduct.*;
+
+/**
+ * Normally I would use composition and a singleton, but here extension is done for @ConfigurationParameter discovery.
+ * Made a singleton mostly for model memory.
+ *
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 11/20/2017
+ */
+@PipeBitInfo(
+ name = "Thread safe Coreference (Clusters)",
+ description = "Coreference annotator using mention-synchronous paradigm.",
+ dependencies = { BASE_TOKEN, SENTENCE, SECTION, IDENTIFIED_ANNOTATION, MARKABLE },
+ products = { COREFERENCE_RELATION }
+)
+public class ThreadSafeMentionClusterCoreferencer extends MentionClusterCoreferenceAnnotator {
+
+ static private final Logger LOGGER = Logger.getLogger( "ThreadSafeMentionClusterCoreferencer" );
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void initialize( final UimaContext context ) throws ResourceInitializationException {
+ MccSingleton.getInstance().initialize( context );
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void process( final JCas jCas ) throws AnalysisEngineProcessException {
+ MccSingleton.getInstance().process( jCas );
+ }
+
+ public static AnalysisEngineDescription createDataWriterDescription(
+ Class<? extends DataWriter<String>> dataWriterClass,
+ File outputDirectory,
+ float downsamplingRate ) throws ResourceInitializationException {
+ return AnalysisEngineFactory.createEngineDescription(
+ ThreadSafeMentionClusterCoreferencer.class,
+ CleartkAnnotator.PARAM_IS_TRAINING,
+ true,
+ MentionClusterCoreferenceAnnotator.PARAM_PROBABILITY_OF_KEEPING_A_NEGATIVE_EXAMPLE,
+ downsamplingRate,
+ DefaultDataWriterFactory.PARAM_DATA_WRITER_CLASS_NAME,
+ dataWriterClass,
+ DirectoryDataWriterFactory.PARAM_OUTPUT_DIRECTORY,
+ outputDirectory,
+ MentionClusterCoreferenceAnnotator.PARAM_SINGLE_DOCUMENT,
+ false );
+ }
+
+ public static AnalysisEngineDescription createAnnotatorDescription( final String modelPath )
+ throws ResourceInitializationException {
+ return AnalysisEngineFactory.createEngineDescription(
+ ThreadSafeMentionClusterCoreferencer.class,
+ CleartkAnnotator.PARAM_IS_TRAINING, false,
+ GenericJarClassifierFactory.PARAM_CLASSIFIER_JAR_PATH, modelPath );
+ }
+
+ public static AnalysisEngineDescription createMultidocAnnotatorDescription( final String modelPath )
+ throws ResourceInitializationException {
+ return AnalysisEngineFactory.createEngineDescription(
+ ThreadSafeMentionClusterCoreferencer.class,
+ CleartkAnnotator.PARAM_IS_TRAINING, false,
+ GenericJarClassifierFactory.PARAM_CLASSIFIER_JAR_PATH, modelPath,
+ MentionClusterCoreferenceAnnotator.PARAM_SINGLE_DOCUMENT, false );
+ }
+
+
+ private enum MccSingleton implements ThreadSafeWrapper<MentionClusterCoreferenceAnnotator> {
+ INSTANCE;
+
+ static public MccSingleton getInstance() {
+ return INSTANCE;
+ }
+
+ private final MentionClusterCoreferenceAnnotator _delegate;
+ private boolean _initialized;
+
+ MccSingleton() {
+ _delegate = new MentionClusterCoreferenceAnnotator();
+ }
+
+ final private Object LOCK = new Object();
+
+ @Override
+ public Object getLock() {
+ return LOCK;
+ }
+
+ @Override
+ public MentionClusterCoreferenceAnnotator getDelegate() {
+ return _delegate;
+ }
+
+ @Override
+ public boolean isInitialized() {
+ return _initialized;
+ }
+
+ @Override
+ public void setInitialized( final boolean initialized ) {
+ _initialized = initialized;
+ }
+ }
+
+
+}
Modified: ctakes/trunk/ctakes-dependency-parser/src/main/java/org/apache/ctakes/dependency/parser/ae/ClearNLPDependencyParserAE.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-dependency-parser/src/main/java/org/apache/ctakes/dependency/parser/ae/ClearNLPDependencyParserAE.java?rev=1816385&r1=1816384&r2=1816385&view=diff
==============================================================================
--- ctakes/trunk/ctakes-dependency-parser/src/main/java/org/apache/ctakes/dependency/parser/ae/ClearNLPDependencyParserAE.java (original)
+++ ctakes/trunk/ctakes-dependency-parser/src/main/java/org/apache/ctakes/dependency/parser/ae/ClearNLPDependencyParserAE.java Sun Nov 26 15:56:23 2017
@@ -90,10 +90,10 @@ public class ClearNLPDependencyParserAE
static private final Logger LOGGER = Logger.getLogger( ClearNLPDependencyParserAE.class.getSimpleName() );
// single class-based model:
- private static ExternalResourceDescription defaultParserResource = ExternalResourceFactory.createExternalResourceDescription(
+ protected static ExternalResourceDescription defaultParserResource = ExternalResourceFactory.createExternalResourceDescription(
DependencySharedModel.class,
DependencySharedModel.DEFAULT_MODEL_FILE_NAME );
- private static ExternalResourceDescription defaultLemmatizerResource = ExternalResourceFactory.createExternalResourceDescription(
+ protected static ExternalResourceDescription defaultLemmatizerResource = ExternalResourceFactory.createExternalResourceDescription(
LemmatizerSharedModel.class,
LemmatizerSharedModel.ENG_LEMMATIZER_DATA_FILE );
Modified: ctakes/trunk/ctakes-dependency-parser/src/main/java/org/apache/ctakes/dependency/parser/ae/ClearNLPSemanticRoleLabelerAE.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-dependency-parser/src/main/java/org/apache/ctakes/dependency/parser/ae/ClearNLPSemanticRoleLabelerAE.java?rev=1816385&r1=1816384&r2=1816385&view=diff
==============================================================================
--- ctakes/trunk/ctakes-dependency-parser/src/main/java/org/apache/ctakes/dependency/parser/ae/ClearNLPSemanticRoleLabelerAE.java (original)
+++ ctakes/trunk/ctakes-dependency-parser/src/main/java/org/apache/ctakes/dependency/parser/ae/ClearNLPSemanticRoleLabelerAE.java Sun Nov 26 15:56:23 2017
@@ -18,11 +18,9 @@
*/
package org.apache.ctakes.dependency.parser.ae;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
+import com.googlecode.clearnlp.component.AbstractComponent;
+import com.googlecode.clearnlp.dependency.*;
+import com.googlecode.clearnlp.reader.AbstractReader;
import org.apache.ctakes.core.pipeline.PipeBitInfo;
import org.apache.ctakes.core.util.ListFactory;
import org.apache.ctakes.dependency.parser.ae.shared.SRLSharedParserModel;
@@ -52,13 +50,10 @@ import org.apache.uima.jcas.cas.TOP;
import org.apache.uima.resource.ExternalResourceDescription;
import org.apache.uima.resource.ResourceInitializationException;
-import com.googlecode.clearnlp.component.AbstractComponent;
-import com.googlecode.clearnlp.dependency.DEPArc;
-import com.googlecode.clearnlp.dependency.DEPFeat;
-import com.googlecode.clearnlp.dependency.DEPLib;
-import com.googlecode.clearnlp.dependency.DEPNode;
-import com.googlecode.clearnlp.dependency.DEPTree;
-import com.googlecode.clearnlp.reader.AbstractReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
/**
*This class provides a UIMA wrapper for the ClearNLP Semantic Role Labeler, which is
@@ -105,14 +100,14 @@ public class ClearNLPSemanticRoleLabeler
public static final String SRL_ROLE_MODEL_KEY = "SrlRoleModel";
@ExternalResource(key = SRL_ROLE_MODEL_KEY, mandatory=false)
private SRLSharedRoleModel roleModel=null;
-
- private static ExternalResourceDescription defaultParserResource = ExternalResourceFactory.createExternalResourceDescription(
+
+ protected static ExternalResourceDescription defaultParserResource = ExternalResourceFactory.createExternalResourceDescription(
SRLSharedParserModel.class,
SRLSharedParserModel.DEFAULT_SRL_MODEL_FILE_NAME);
- private static ExternalResourceDescription defaultPredictionResource = ExternalResourceFactory.createExternalResourceDescription(
+ protected static ExternalResourceDescription defaultPredictionResource = ExternalResourceFactory.createExternalResourceDescription(
SRLSharedPredictionModel.class,
SRLSharedPredictionModel.DEFAULT_PRED_MODEL_FILE_NAME);
- private static ExternalResourceDescription defaultRoleResource = ExternalResourceFactory.createExternalResourceDescription(
+ protected static ExternalResourceDescription defaultRoleResource = ExternalResourceFactory.createExternalResourceDescription(
SRLSharedRoleModel.class,
SRLSharedRoleModel.DEFAULT_ROLE_MODEL_FILE_NAME);
Added: ctakes/trunk/ctakes-dependency-parser/src/main/java/org/apache/ctakes/dependency/parser/concurrent/ThreadSafeClearNlpDepParser.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-dependency-parser/src/main/java/org/apache/ctakes/dependency/parser/concurrent/ThreadSafeClearNlpDepParser.java?rev=1816385&view=auto
==============================================================================
--- ctakes/trunk/ctakes-dependency-parser/src/main/java/org/apache/ctakes/dependency/parser/concurrent/ThreadSafeClearNlpDepParser.java (added)
+++ ctakes/trunk/ctakes-dependency-parser/src/main/java/org/apache/ctakes/dependency/parser/concurrent/ThreadSafeClearNlpDepParser.java Sun Nov 26 15:56:23 2017
@@ -0,0 +1,110 @@
+package org.apache.ctakes.dependency.parser.concurrent;
+
+import org.apache.ctakes.core.concurrent.ThreadSafeWrapper;
+import org.apache.ctakes.core.pipeline.PipeBitInfo;
+import org.apache.ctakes.dependency.parser.ae.ClearNLPDependencyParserAE;
+import org.apache.log4j.Logger;
+import org.apache.uima.UimaContext;
+import org.apache.uima.analysis_engine.AnalysisEngineDescription;
+import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
+import org.apache.uima.fit.descriptor.TypeCapability;
+import org.apache.uima.fit.factory.AnalysisEngineFactory;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.resource.ExternalResourceDescription;
+import org.apache.uima.resource.ResourceInitializationException;
+
+/**
+ * Normally I would use composition and a singleton, but here extension is done for @ConfigurationParameter discovery.
+ * Made a singleton mostly for model memory.
+ * ClearNLPDependencyParserAE is almost thread safe ... the shared models are not immutable.
+ * {@inheritDoc}
+ *
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 11/20/2017
+ */
+@TypeCapability(
+ inputs = {
+ "org.apache.ctakes.typesystem.type.syntax.BaseToken:partOfSpeech",
+ "org.apache.ctakes.typesystem.type.syntax.BaseToken:normalizedForm",
+ "org.apache.ctakes.typesystem.type.syntax.BaseToken:tokenNumber",
+ "org.apache.ctakes.typesystem.type.syntax.BaseToken:end",
+ "org.apache.ctakes.typesystem.type.syntax.BaseToken:begin"
+ } )
+@PipeBitInfo(
+ name = "ClearNLP Dependency Parser",
+ description = "Analyses Sentence Structure, storing information in nodes.",
+ role = PipeBitInfo.Role.SPECIAL,
+ dependencies = { PipeBitInfo.TypeProduct.SENTENCE, PipeBitInfo.TypeProduct.BASE_TOKEN },
+ products = { PipeBitInfo.TypeProduct.DEPENDENCY_NODE }
+)
+final public class ThreadSafeClearNlpDepParser extends ClearNLPDependencyParserAE {
+
+ static private final Logger LOGGER = Logger.getLogger( "ThreadSafeClearNlpSemRoleLabeler" );
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void initialize( final UimaContext context ) throws ResourceInitializationException {
+ DepSingleton.getInstance().initialize( context );
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void process( final JCas jCas ) throws AnalysisEngineProcessException {
+ DepSingleton.getInstance().process( jCas );
+ }
+
+ // If someone calls this, they want the default model, lazy initialization of the external resources:
+ public static synchronized AnalysisEngineDescription createAnnotatorDescription() throws ResourceInitializationException {
+ return createAnnotatorDescription( defaultParserResource, defaultLemmatizerResource );
+ }
+
+ public static AnalysisEngineDescription createAnnotatorDescription( final ExternalResourceDescription parserDesc,
+ final ExternalResourceDescription lemmaDesc )
+ throws ResourceInitializationException {
+ return AnalysisEngineFactory.createEngineDescription(
+ ThreadSafeClearNlpDepParser.class, DEP_MODEL_KEY, parserDesc, LEM_MODEL_KEY, lemmaDesc );
+ }
+
+ private enum DepSingleton implements ThreadSafeWrapper<ClearNLPDependencyParserAE> {
+ INSTANCE;
+
+ static public DepSingleton getInstance() {
+ return INSTANCE;
+ }
+
+ private final ClearNLPDependencyParserAE _delegate;
+ private boolean _initialized;
+
+ DepSingleton() {
+ _delegate = new ClearNLPDependencyParserAE();
+ }
+
+ final private Object LOCK = new Object();
+
+ @Override
+ public Object getLock() {
+ return LOCK;
+ }
+
+ @Override
+ public ClearNLPDependencyParserAE getDelegate() {
+ return _delegate;
+ }
+
+ @Override
+ public boolean isInitialized() {
+ return _initialized;
+ }
+
+ @Override
+ public void setInitialized( final boolean initialized ) {
+ _initialized = initialized;
+ }
+ }
+
+}
Added: ctakes/trunk/ctakes-dependency-parser/src/main/java/org/apache/ctakes/dependency/parser/concurrent/ThreadSafeClearNlpSemRoleLabeler.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-dependency-parser/src/main/java/org/apache/ctakes/dependency/parser/concurrent/ThreadSafeClearNlpSemRoleLabeler.java?rev=1816385&view=auto
==============================================================================
--- ctakes/trunk/ctakes-dependency-parser/src/main/java/org/apache/ctakes/dependency/parser/concurrent/ThreadSafeClearNlpSemRoleLabeler.java (added)
+++ ctakes/trunk/ctakes-dependency-parser/src/main/java/org/apache/ctakes/dependency/parser/concurrent/ThreadSafeClearNlpSemRoleLabeler.java Sun Nov 26 15:56:23 2017
@@ -0,0 +1,110 @@
+package org.apache.ctakes.dependency.parser.concurrent;
+
+import org.apache.ctakes.core.concurrent.ThreadSafeWrapper;
+import org.apache.ctakes.core.pipeline.PipeBitInfo;
+import org.apache.ctakes.dependency.parser.ae.ClearNLPSemanticRoleLabelerAE;
+import org.apache.log4j.Logger;
+import org.apache.uima.UimaContext;
+import org.apache.uima.analysis_engine.AnalysisEngineDescription;
+import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
+import org.apache.uima.fit.descriptor.TypeCapability;
+import org.apache.uima.fit.factory.AnalysisEngineFactory;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.resource.ResourceInitializationException;
+
+/**
+ * Normally I would use composition and a singleton, but here extension is done for @ConfigurationParameter discovery.
+ * Made a singleton mostly for model memory.
+ * ClearNLPSemanticRoleLabelerAE is almost thread safe ... the shared models are not immutable.
+ * <p>
+ * {@inheritDoc}
+ *
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 11/20/2017
+ */
+@TypeCapability(
+ inputs = {
+ "org.apache.ctakes.typesystem.type.syntax.BaseToken:partOfSpeech",
+ "org.apache.ctakes.typesystem.type.syntax.BaseToken:tokenNumber",
+ "org.apache.ctakes.typesystem.type.syntax.BaseToken:end",
+ "org.apache.ctakes.typesystem.type.syntax.BaseToken:begin",
+ "org.apache.ctakes.typesystem.type.syntax.ConllDependencyNode"
+ } )
+@PipeBitInfo(
+ name = "Thread safe ClearNLP Semantic Role Labeler",
+ description = "Adds Semantic Roles Relations.",
+ role = PipeBitInfo.Role.ANNOTATOR,
+ dependencies = { PipeBitInfo.TypeProduct.SENTENCE, PipeBitInfo.TypeProduct.BASE_TOKEN,
+ PipeBitInfo.TypeProduct.DEPENDENCY_NODE },
+ products = { PipeBitInfo.TypeProduct.SEMANTIC_RELATION }
+)
+final public class ThreadSafeClearNlpSemRoleLabeler extends ClearNLPSemanticRoleLabelerAE {
+
+ static private final Logger LOGGER = Logger.getLogger( "ThreadSafeClearNlpSemRoleLabeler" );
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void initialize( final UimaContext context ) throws ResourceInitializationException {
+ SemSingleton.getInstance().initialize( context );
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void process( final JCas jCas ) throws AnalysisEngineProcessException {
+ SemSingleton.getInstance().process( jCas );
+ }
+
+ public static AnalysisEngineDescription createAnnotatorDescription() throws ResourceInitializationException {
+ return AnalysisEngineFactory.createEngineDescription(
+ ThreadSafeClearNlpSemRoleLabeler.class,
+ SRL_PARSER_MODEL_KEY,
+ defaultParserResource,
+ SRL_PRED_MODEL_KEY,
+ defaultPredictionResource,
+ SRL_ROLE_MODEL_KEY,
+ defaultRoleResource );
+ }
+
+ private enum SemSingleton implements ThreadSafeWrapper<ClearNLPSemanticRoleLabelerAE> {
+ INSTANCE;
+
+ static public SemSingleton getInstance() {
+ return INSTANCE;
+ }
+
+ private final ClearNLPSemanticRoleLabelerAE _delegate;
+ private boolean _initialized;
+
+ SemSingleton() {
+ _delegate = new ClearNLPSemanticRoleLabelerAE();
+ }
+
+ final private Object LOCK = new Object();
+
+ @Override
+ public Object getLock() {
+ return LOCK;
+ }
+
+ @Override
+ public ClearNLPSemanticRoleLabelerAE getDelegate() {
+ return _delegate;
+ }
+
+ @Override
+ public boolean isInitialized() {
+ return _initialized;
+ }
+
+ @Override
+ public void setInitialized( final boolean initialized ) {
+ _initialized = initialized;
+ }
+ }
+
+}
Copied: ctakes/trunk/ctakes-dictionary-lookup-fast-res/src/main/resources/org/apache/ctakes/dictionary/lookup/fast/pipeline/TsDictionarySubPipe.piper (from r1815683, ctakes/trunk/ctakes-dictionary-lookup-fast-res/src/main/resources/org/apache/ctakes/dictionary/lookup/fast/pipeline/DictionarySubPipe.piper)
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-dictionary-lookup-fast-res/src/main/resources/org/apache/ctakes/dictionary/lookup/fast/pipeline/TsDictionarySubPipe.piper?p2=ctakes/trunk/ctakes-dictionary-lookup-fast-res/src/main/resources/org/apache/ctakes/dictionary/lookup/fast/pipeline/TsDictionarySubPipe.piper&p1=ctakes/trunk/ctakes-dictionary-lookup-fast-res/src/main/resources/org/apache/ctakes/dictionary/lookup/fast/pipeline/DictionarySubPipe.piper&r1=1815683&r2=1816385&rev=1816385&view=diff
==============================================================================
--- ctakes/trunk/ctakes-dictionary-lookup-fast-res/src/main/resources/org/apache/ctakes/dictionary/lookup/fast/pipeline/DictionarySubPipe.piper (original)
+++ ctakes/trunk/ctakes-dictionary-lookup-fast-res/src/main/resources/org/apache/ctakes/dictionary/lookup/fast/pipeline/TsDictionarySubPipe.piper Sun Nov 26 15:56:23 2017
@@ -7,4 +7,4 @@ cli umlsUser=user
cli umlsPass=pass
// Default fast dictionary lookup
-add DefaultJCasTermAnnotator
+add concurrent.ThreadSafeFastLookup
Modified: ctakes/trunk/ctakes-dictionary-lookup-fast/src/main/java/org/apache/ctakes/dictionary/lookup2/ae/DefaultJCasTermAnnotator.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-dictionary-lookup-fast/src/main/java/org/apache/ctakes/dictionary/lookup2/ae/DefaultJCasTermAnnotator.java?rev=1816385&r1=1816384&r2=1816385&view=diff
==============================================================================
--- ctakes/trunk/ctakes-dictionary-lookup-fast/src/main/java/org/apache/ctakes/dictionary/lookup2/ae/DefaultJCasTermAnnotator.java (original)
+++ ctakes/trunk/ctakes-dictionary-lookup-fast/src/main/java/org/apache/ctakes/dictionary/lookup2/ae/DefaultJCasTermAnnotator.java Sun Nov 26 15:56:23 2017
@@ -45,7 +45,7 @@ import java.util.List;
dependencies = { PipeBitInfo.TypeProduct.SENTENCE, PipeBitInfo.TypeProduct.BASE_TOKEN },
products = PipeBitInfo.TypeProduct.IDENTIFIED_ANNOTATION
)
-final public class DefaultJCasTermAnnotator extends AbstractJCasTermAnnotator {
+public class DefaultJCasTermAnnotator extends AbstractJCasTermAnnotator {
/**
* {@inheritDoc}
Added: ctakes/trunk/ctakes-dictionary-lookup-fast/src/main/java/org/apache/ctakes/dictionary/lookup2/concurrent/ThreadSafeFastLookup.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-dictionary-lookup-fast/src/main/java/org/apache/ctakes/dictionary/lookup2/concurrent/ThreadSafeFastLookup.java?rev=1816385&view=auto
==============================================================================
--- ctakes/trunk/ctakes-dictionary-lookup-fast/src/main/java/org/apache/ctakes/dictionary/lookup2/concurrent/ThreadSafeFastLookup.java (added)
+++ ctakes/trunk/ctakes-dictionary-lookup-fast/src/main/java/org/apache/ctakes/dictionary/lookup2/concurrent/ThreadSafeFastLookup.java Sun Nov 26 15:56:23 2017
@@ -0,0 +1,105 @@
+package org.apache.ctakes.dictionary.lookup2.concurrent;
+
+import org.apache.ctakes.core.concurrent.ThreadSafeWrapper;
+import org.apache.ctakes.core.config.ConfigParameterConstants;
+import org.apache.ctakes.core.pipeline.PipeBitInfo;
+import org.apache.ctakes.dictionary.lookup2.ae.DefaultJCasTermAnnotator;
+import org.apache.log4j.Logger;
+import org.apache.uima.UimaContext;
+import org.apache.uima.analysis_engine.AnalysisEngineDescription;
+import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
+import org.apache.uima.fit.factory.AnalysisEngineFactory;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.resource.ResourceInitializationException;
+
+/**
+ * Normally I would use composition and a singleton, but here extension is done for @ConfigurationParameter discovery.
+ * Made a singleton mostly for dictionary memory.
+ *
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 11/20/2017
+ */
+@PipeBitInfo(
+ name = "Thread safe Dictionary Lookup (Default)",
+ description = "Annotates clinically-relevant terms. Terms must match dictionary entries exactly.",
+ dependencies = { PipeBitInfo.TypeProduct.SENTENCE, PipeBitInfo.TypeProduct.BASE_TOKEN },
+ products = PipeBitInfo.TypeProduct.IDENTIFIED_ANNOTATION
+)
+final public class ThreadSafeFastLookup extends DefaultJCasTermAnnotator {
+
+ static private final Logger LOGGER = Logger.getLogger( "ThreadSafeFastLookup" );
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void initialize( final UimaContext context ) throws ResourceInitializationException {
+ DlSingleton.getInstance().initialize( context );
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void process( final JCas jCas ) throws AnalysisEngineProcessException {
+ DlSingleton.getInstance().process( jCas );
+ }
+
+ /**
+ * @return dictionary lookup with defaults
+ * @throws ResourceInitializationException -
+ */
+ static public AnalysisEngineDescription createAnnotatorDescription() throws ResourceInitializationException {
+ return AnalysisEngineFactory.createEngineDescription( ThreadSafeFastLookup.class );
+ }
+
+ /**
+ * @param descriptorPath path to lookup configuration xml file
+ * @return dictionary lookup using the given configuration
+ * @throws ResourceInitializationException -
+ */
+ static public AnalysisEngineDescription createAnnotatorDescription( final String descriptorPath )
+ throws ResourceInitializationException {
+ return AnalysisEngineFactory.createEngineDescription( ThreadSafeFastLookup.class,
+ ConfigParameterConstants.PARAM_LOOKUP_XML, descriptorPath );
+ }
+
+ private enum DlSingleton implements ThreadSafeWrapper<DefaultJCasTermAnnotator> {
+ INSTANCE;
+
+ static public DlSingleton getInstance() {
+ return INSTANCE;
+ }
+
+ private final DefaultJCasTermAnnotator _delegate;
+ private boolean _initialized;
+
+ DlSingleton() {
+ _delegate = new DefaultJCasTermAnnotator();
+ }
+
+ final private Object LOCK = new Object();
+
+ @Override
+ public Object getLock() {
+ return LOCK;
+ }
+
+ @Override
+ public DefaultJCasTermAnnotator getDelegate() {
+ return _delegate;
+ }
+
+ @Override
+ public boolean isInitialized() {
+ return _initialized;
+ }
+
+ @Override
+ public void setInitialized( final boolean initialized ) {
+ _initialized = initialized;
+ }
+ }
+
+}
Added: ctakes/trunk/ctakes-examples-res/src/main/resources/org/apache/ctakes/examples/pipeline/FullPipeline.piper
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-examples-res/src/main/resources/org/apache/ctakes/examples/pipeline/FullPipeline.piper?rev=1816385&view=auto
==============================================================================
--- ctakes/trunk/ctakes-examples-res/src/main/resources/org/apache/ctakes/examples/pipeline/FullPipeline.piper (added)
+++ ctakes/trunk/ctakes-examples-res/src/main/resources/org/apache/ctakes/examples/pipeline/FullPipeline.piper Sun Nov 26 15:56:23 2017
@@ -0,0 +1,34 @@
+
+// Advanced Tokenization: Regex sectionization, BIO Sentence Detector (lumper), Paragraphs, Lists
+load AdvancedTokenizerPipeline
+// OR use the standard tokenizer pipeline:
+//load DefaultTokenizerPipeline
+
+// Always need these ...
+add ContextDependentTokenizerAnnotator
+add POSTagger
+
+// Chunkers
+load ChunkerSubPipe
+
+// Default fast dictionary lookup
+set minimumSpan=2
+load DictionarySubPipe
+
+// Cleartk Entity Attributes (negation, uncertainty, etc.)
+load AttributeCleartkSubPipe
+
+// Entity Relations (degree/severity, anatomical location)
+load RelationSubPipe
+
+// Temporal (event, time, dtr, tlink)
+load TemporalSubPipe
+
+// Coreferences (e.g. patient = he)
+load CorefSubPipe
+
+// Html output
+add pretty.html.HtmlTextWriter
+
+// XMI output
+//writeXmis
Modified: ctakes/trunk/ctakes-examples-res/src/main/resources/org/apache/ctakes/examples/pipeline/HelloWorldCui.piper
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-examples-res/src/main/resources/org/apache/ctakes/examples/pipeline/HelloWorldCui.piper?rev=1816385&r1=1816384&r2=1816385&view=diff
==============================================================================
--- ctakes/trunk/ctakes-examples-res/src/main/resources/org/apache/ctakes/examples/pipeline/HelloWorldCui.piper (original)
+++ ctakes/trunk/ctakes-examples-res/src/main/resources/org/apache/ctakes/examples/pipeline/HelloWorldCui.piper Sun Nov 26 15:56:23 2017
@@ -13,7 +13,7 @@ addDescription POSTagger
set ctakes.umlsuser=CHANGE_ME ctakes.umlspw=CHANGE_ME
// Default fast dictionary lookup
-add DefaultJCasTermAnnotator
+load DictionarySubPipe.piper
// Collect discovered UMLS Concept Unique Identifiers (CUI) for post-run information
collectCuis
Modified: ctakes/trunk/ctakes-examples-res/src/main/resources/org/apache/ctakes/examples/pipeline/ProcessDir.piper
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-examples-res/src/main/resources/org/apache/ctakes/examples/pipeline/ProcessDir.piper?rev=1816385&r1=1816384&r2=1816385&view=diff
==============================================================================
--- ctakes/trunk/ctakes-examples-res/src/main/resources/org/apache/ctakes/examples/pipeline/ProcessDir.piper (original)
+++ ctakes/trunk/ctakes-examples-res/src/main/resources/org/apache/ctakes/examples/pipeline/ProcessDir.piper Sun Nov 26 15:56:23 2017
@@ -14,7 +14,8 @@ addDescription POSTagger
//addDescription LvgAnnotator
addDescription ThreadSafeLvg
-add DefaultJCasTermAnnotator
+// Default fast dictionary lookup
+load DictionarySubPipe.piper
// Add Named Entity Context Entity Attribute annotators
load NeContextsSubPipe.piper
Added: ctakes/trunk/ctakes-examples-res/src/main/resources/org/apache/ctakes/examples/pipeline/ThreadSafeFullPipeline.piper
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-examples-res/src/main/resources/org/apache/ctakes/examples/pipeline/ThreadSafeFullPipeline.piper?rev=1816385&view=auto
==============================================================================
--- ctakes/trunk/ctakes-examples-res/src/main/resources/org/apache/ctakes/examples/pipeline/ThreadSafeFullPipeline.piper (added)
+++ ctakes/trunk/ctakes-examples-res/src/main/resources/org/apache/ctakes/examples/pipeline/ThreadSafeFullPipeline.piper Sun Nov 26 15:56:23 2017
@@ -0,0 +1,34 @@
+// Pipeline for: sections, paragraphs, sentences, lists, entities and attributes, relations, temporal info, coreferences
+
+// set the thread count
+threads 3
+
+// Advanced Tokenization: Regex sectionization, BIO Sentence Detector (lumper), Paragraphs, Lists
+load TsFullTokenizerPipeline
+
+// Always need these ...
+add ContextDependentTokenizerAnnotator
+add concurrent.ThreadSafePosTagger
+
+// Chunkers
+load TsChunkerSubPipe
+
+// Default fast dictionary lookup
+set minimumSpan=2
+load TsDictionarySubPipe
+
+// Cleartk Entity Attributes (negation, uncertainty, etc.)
+load TsAttributeCleartkSubPipe
+
+// Entity Relations (degree/severity, anatomical location)
+load TsRelationSubPipe
+
+// Temporal (event, time, dtr, tlink)
+load TsTemporalSubPipe
+
+// Coreferences (e.g. patient = he)
+load TsCorefSubPipe
+
+// Html output
+add pretty.html.HtmlTextWriter
+
Added: ctakes/trunk/ctakes-pos-tagger/src/main/java/org/apache/ctakes/postagger/concurrent/ThreadSafePosTagger.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-pos-tagger/src/main/java/org/apache/ctakes/postagger/concurrent/ThreadSafePosTagger.java?rev=1816385&view=auto
==============================================================================
--- ctakes/trunk/ctakes-pos-tagger/src/main/java/org/apache/ctakes/postagger/concurrent/ThreadSafePosTagger.java (added)
+++ ctakes/trunk/ctakes-pos-tagger/src/main/java/org/apache/ctakes/postagger/concurrent/ThreadSafePosTagger.java Sun Nov 26 15:56:23 2017
@@ -0,0 +1,117 @@
+package org.apache.ctakes.postagger.concurrent;
+
+import org.apache.ctakes.core.concurrent.ThreadSafeWrapper;
+import org.apache.ctakes.core.pipeline.PipeBitInfo;
+import org.apache.ctakes.postagger.POSTagger;
+import org.apache.ctakes.typesystem.type.syntax.BaseToken;
+import org.apache.ctakes.typesystem.type.textspan.Segment;
+import org.apache.ctakes.typesystem.type.textspan.Sentence;
+import org.apache.log4j.Logger;
+import org.apache.uima.UimaContext;
+import org.apache.uima.analysis_engine.AnalysisEngineDescription;
+import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
+import org.apache.uima.fit.factory.AnalysisEngineFactory;
+import org.apache.uima.fit.factory.TypePrioritiesFactory;
+import org.apache.uima.fit.factory.TypeSystemDescriptionFactory;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.resource.ResourceInitializationException;
+
+/**
+ * Normally I would use composition and a singleton, but here extension is done for @ConfigurationParameter discovery.
+ * Made a singleton mostly for model memory.
+ *
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 11/20/2017
+ */
+@PipeBitInfo(
+ name = "Thread safe Part of Speech Tagger",
+ description = "Annotate Parts of Speech.",
+ dependencies = { PipeBitInfo.TypeProduct.SECTION, PipeBitInfo.TypeProduct.SENTENCE,
+ PipeBitInfo.TypeProduct.BASE_TOKEN, }
+)
+final public class ThreadSafePosTagger extends POSTagger {
+
+ static private final Logger LOGGER = Logger.getLogger( "ThreadSafePosTagger" );
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void initialize( final UimaContext context ) throws ResourceInitializationException {
+ PosSingleton.getInstance().initialize( context );
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void process( final JCas jCas ) throws AnalysisEngineProcessException {
+ PosSingleton.getInstance().process( jCas );
+ }
+
+ /**
+ * @return a part of speech tagger using a default model
+ * @throws ResourceInitializationException -
+ */
+ public static AnalysisEngineDescription createAnnotatorDescription() throws ResourceInitializationException {
+ return AnalysisEngineFactory.createEngineDescription(
+ ThreadSafePosTagger.class,
+ TypeSystemDescriptionFactory.createTypeSystemDescription(),
+ TypePrioritiesFactory.createTypePriorities( Segment.class, Sentence.class, BaseToken.class ) );
+ }
+
+ /**
+ * @param model a part of speech model
+ * @return a part of speech tagger using the given model
+ * @throws ResourceInitializationException -
+ */
+ public static AnalysisEngineDescription createAnnotatorDescription( final String model )
+ throws ResourceInitializationException {
+ return AnalysisEngineFactory.createEngineDescription(
+ ThreadSafePosTagger.class,
+ TypeSystemDescriptionFactory.createTypeSystemDescription(),
+ TypePrioritiesFactory.createTypePriorities( Segment.class, Sentence.class, BaseToken.class ),
+ POSTagger.PARAM_POS_MODEL_FILE, model );
+ }
+
+
+ private enum PosSingleton implements ThreadSafeWrapper<POSTagger> {
+ INSTANCE;
+
+ static public PosSingleton getInstance() {
+ return INSTANCE;
+ }
+
+ private final POSTagger _delegate;
+ private boolean _initialized;
+
+ PosSingleton() {
+ _delegate = new POSTagger();
+ }
+
+ final private Object LOCK = new Object();
+
+ @Override
+ public Object getLock() {
+ return LOCK;
+ }
+
+ @Override
+ public POSTagger getDelegate() {
+ return _delegate;
+ }
+
+ @Override
+ public boolean isInitialized() {
+ return _initialized;
+ }
+
+ @Override
+ public void setInitialized( final boolean initialized ) {
+ _initialized = initialized;
+ }
+ }
+
+
+}
Copied: ctakes/trunk/ctakes-relation-extractor-res/src/main/resources/org/apache/ctakes/relationextractor/pipeline/TsRelationSubPipe.piper (from r1815683, ctakes/trunk/ctakes-relation-extractor-res/src/main/resources/org/apache/ctakes/relationextractor/pipeline/RelationSubPipe.piper)
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-relation-extractor-res/src/main/resources/org/apache/ctakes/relationextractor/pipeline/TsRelationSubPipe.piper?p2=ctakes/trunk/ctakes-relation-extractor-res/src/main/resources/org/apache/ctakes/relationextractor/pipeline/TsRelationSubPipe.piper&p1=ctakes/trunk/ctakes-relation-extractor-res/src/main/resources/org/apache/ctakes/relationextractor/pipeline/RelationSubPipe.piper&r1=1815683&r2=1816385&rev=1816385&view=diff
==============================================================================
--- ctakes/trunk/ctakes-relation-extractor-res/src/main/resources/org/apache/ctakes/relationextractor/pipeline/RelationSubPipe.piper (original)
+++ ctakes/trunk/ctakes-relation-extractor-res/src/main/resources/org/apache/ctakes/relationextractor/pipeline/TsRelationSubPipe.piper Sun Nov 26 15:56:23 2017
@@ -1,10 +1,10 @@
// Commands and parameters to create a default relation extraction sub-pipeline. This is not a full pipeline.
// Modifiers. Use addLogged to log start and finish of processing. There aren't default models, so set specifically
-addLogged ModifierExtractorAnnotator classifierJarPath=/org/apache/ctakes/relationextractor/models/modifier_extractor/model.jar
+add concurrent.ThreadSafeModifierExtractor classifierJarPath=/org/apache/ctakes/relationextractor/models/modifier_extractor/model.jar
// Degree of severity, etc.
-addLogged DegreeOfRelationExtractorAnnotator classifierJarPath=/org/apache/ctakes/relationextractor/models/degree_of/model.jar
+add concurrent.ThreadSafeDegreeExtractor classifierJarPath=/org/apache/ctakes/relationextractor/models/degree_of/model.jar
// Location.
-addLogged LocationOfRelationExtractorAnnotator classifierJarPath=/org/apache/ctakes/relationextractor/models/location_of/model.jar
+add concurrent.ThreadSafeLocationExtractor classifierJarPath=/org/apache/ctakes/relationextractor/models/location_of/model.jar
Added: ctakes/trunk/ctakes-relation-extractor/src/main/java/org/apache/ctakes/relationextractor/concurrent/ThreadSafeDegreeExtractor.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-relation-extractor/src/main/java/org/apache/ctakes/relationextractor/concurrent/ThreadSafeDegreeExtractor.java?rev=1816385&view=auto
==============================================================================
--- ctakes/trunk/ctakes-relation-extractor/src/main/java/org/apache/ctakes/relationextractor/concurrent/ThreadSafeDegreeExtractor.java (added)
+++ ctakes/trunk/ctakes-relation-extractor/src/main/java/org/apache/ctakes/relationextractor/concurrent/ThreadSafeDegreeExtractor.java Sun Nov 26 15:56:23 2017
@@ -0,0 +1,121 @@
+package org.apache.ctakes.relationextractor.concurrent;
+
+import org.apache.ctakes.core.concurrent.ThreadSafeWrapper;
+import org.apache.ctakes.core.pipeline.PipeBitInfo;
+import org.apache.ctakes.relationextractor.ae.DegreeOfRelationExtractorAnnotator;
+import org.apache.log4j.Logger;
+import org.apache.uima.UimaContext;
+import org.apache.uima.analysis_engine.AnalysisEngineDescription;
+import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
+import org.apache.uima.fit.factory.AnalysisEngineFactory;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.resource.ResourceInitializationException;
+
+/**
+ * Normally I would use composition and a singleton, but here extension is done for @ConfigurationParameter discovery.
+ * Made a singleton mostly for model memory.
+ *
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 11/20/2017
+ */
+@PipeBitInfo(
+ name = "Thread safe Degree of Annotator",
+ description = "Annotates Degree Of relations.",
+ role = PipeBitInfo.Role.ANNOTATOR,
+ dependencies = { PipeBitInfo.TypeProduct.SENTENCE, PipeBitInfo.TypeProduct.IDENTIFIED_ANNOTATION },
+ products = { PipeBitInfo.TypeProduct.DEGREE_RELATION }
+)
+final public class ThreadSafeDegreeExtractor extends DegreeOfRelationExtractorAnnotator {
+
+ static private final Logger LOGGER = Logger.getLogger( "ThreadSafeDegreeExtractor" );
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void initialize( final UimaContext context ) throws ResourceInitializationException {
+ DoSingleton.getInstance().initialize( context );
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void process( final JCas jCas ) throws AnalysisEngineProcessException {
+ DoSingleton.getInstance().process( jCas );
+ }
+
+ /**
+ * @return a degree of relation extractor
+ * @throws ResourceInitializationException -
+ */
+ public static AnalysisEngineDescription createAnnotatorDescription() throws ResourceInitializationException {
+ return AnalysisEngineFactory.createEngineDescription( ThreadSafeDegreeExtractor.class );
+ }
+
+ private enum DoSingleton implements ThreadSafeWrapper<DegreeOfRelationExtractorAnnotator> {
+ INSTANCE;
+
+ static public DoSingleton getInstance() {
+ return INSTANCE;
+ }
+
+ private final DegreeOfRelationExtractorAnnotator _delegate;
+ private boolean _initialized;
+
+ DoSingleton() {
+ _delegate = new DegreeOfRelationExtractorAnnotator();
+ }
+
+ final private Object LOCK = new Object();
+
+ @Override
+ public Object getLock() {
+ return LOCK;
+ }
+
+ @Override
+ public DegreeOfRelationExtractorAnnotator getDelegate() {
+ return _delegate;
+ }
+
+ @Override
+ public boolean isInitialized() {
+ return _initialized;
+ }
+
+ @Override
+ public void setInitialized( final boolean initialized ) {
+ _initialized = initialized;
+ }
+
+ /**
+ * Calls initialize on the single instance if and only if it has not already been initialized
+ */
+ @Override
+ public void initialize( final UimaContext context ) throws ResourceInitializationException {
+ synchronized (LOCK) {
+ if ( !isInitialized() ) {
+ LOGGER.info( "Initializing ..." );
+ getDelegate().initialize( context );
+ setInitialized( true );
+ }
+ }
+ }
+
+ /**
+ * Calls process on the single instance if it is not already processing
+ */
+ @Override
+ public void process( final JCas jCas ) throws AnalysisEngineProcessException {
+ synchronized (LOCK) {
+ LOGGER.info( "Extracting Degree relations ..." );
+ getDelegate().process( jCas );
+ LOGGER.info( "Finished." );
+ }
+ }
+
+ }
+
+}
Added: ctakes/trunk/ctakes-relation-extractor/src/main/java/org/apache/ctakes/relationextractor/concurrent/ThreadSafeLocationExtractor.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-relation-extractor/src/main/java/org/apache/ctakes/relationextractor/concurrent/ThreadSafeLocationExtractor.java?rev=1816385&view=auto
==============================================================================
--- ctakes/trunk/ctakes-relation-extractor/src/main/java/org/apache/ctakes/relationextractor/concurrent/ThreadSafeLocationExtractor.java (added)
+++ ctakes/trunk/ctakes-relation-extractor/src/main/java/org/apache/ctakes/relationextractor/concurrent/ThreadSafeLocationExtractor.java Sun Nov 26 15:56:23 2017
@@ -0,0 +1,120 @@
+package org.apache.ctakes.relationextractor.concurrent;
+
+import org.apache.ctakes.core.concurrent.ThreadSafeWrapper;
+import org.apache.ctakes.core.pipeline.PipeBitInfo;
+import org.apache.ctakes.relationextractor.ae.LocationOfRelationExtractorAnnotator;
+import org.apache.log4j.Logger;
+import org.apache.uima.UimaContext;
+import org.apache.uima.analysis_engine.AnalysisEngineDescription;
+import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
+import org.apache.uima.fit.factory.AnalysisEngineFactory;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.resource.ResourceInitializationException;
+
+/**
+ * Normally I would use composition and a singleton, but here extension is done for @ConfigurationParameter discovery.
+ * Made a singleton mostly for model memory.
+ *
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 11/20/2017
+ */
+@PipeBitInfo(
+ name = "Location of Annotator",
+ description = "Annotates Location Of relations.",
+ role = PipeBitInfo.Role.ANNOTATOR,
+ dependencies = { PipeBitInfo.TypeProduct.SENTENCE, PipeBitInfo.TypeProduct.IDENTIFIED_ANNOTATION },
+ products = { PipeBitInfo.TypeProduct.LOCATION_RELATION }
+)
+final public class ThreadSafeLocationExtractor extends LocationOfRelationExtractorAnnotator {
+
+ static private final Logger LOGGER = Logger.getLogger( "ThreadSafeLocationExtractor" );
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void initialize( final UimaContext context ) throws ResourceInitializationException {
+ LocSingleton.getInstance().initialize( context );
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void process( final JCas jCas ) throws AnalysisEngineProcessException {
+ LocSingleton.getInstance().process( jCas );
+ }
+
+ /**
+ * @return a location of relation extractor
+ * @throws ResourceInitializationException -
+ */
+ public static AnalysisEngineDescription createAnnotatorDescription() throws ResourceInitializationException {
+ return AnalysisEngineFactory.createEngineDescription( ThreadSafeLocationExtractor.class );
+ }
+
+ private enum LocSingleton implements ThreadSafeWrapper<LocationOfRelationExtractorAnnotator> {
+ INSTANCE;
+
+ static public LocSingleton getInstance() {
+ return INSTANCE;
+ }
+
+ private final LocationOfRelationExtractorAnnotator _delegate;
+ private boolean _initialized;
+
+ LocSingleton() {
+ _delegate = new LocationOfRelationExtractorAnnotator();
+ }
+
+ final private Object LOCK = new Object();
+
+ @Override
+ public Object getLock() {
+ return LOCK;
+ }
+
+ @Override
+ public LocationOfRelationExtractorAnnotator getDelegate() {
+ return _delegate;
+ }
+
+ @Override
+ public boolean isInitialized() {
+ return _initialized;
+ }
+
+ @Override
+ public void setInitialized( final boolean initialized ) {
+ _initialized = initialized;
+ }
+
+ /**
+ * Calls initialize on the single instance if and only if it has not already been initialized
+ */
+ @Override
+ public void initialize( final UimaContext context ) throws ResourceInitializationException {
+ synchronized (LOCK) {
+ if ( !isInitialized() ) {
+ LOGGER.info( "Initializing ..." );
+ getDelegate().initialize( context );
+ setInitialized( true );
+ }
+ }
+ }
+
+ /**
+ * Calls process on the single instance if it is not already processing
+ */
+ @Override
+ public void process( final JCas jCas ) throws AnalysisEngineProcessException {
+ synchronized (LOCK) {
+ LOGGER.info( "Extracting location relations ..." );
+ getDelegate().process( jCas );
+ LOGGER.info( "Finished." );
+ }
+ }
+ }
+
+}
Added: ctakes/trunk/ctakes-relation-extractor/src/main/java/org/apache/ctakes/relationextractor/concurrent/ThreadSafeModifierExtractor.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-relation-extractor/src/main/java/org/apache/ctakes/relationextractor/concurrent/ThreadSafeModifierExtractor.java?rev=1816385&view=auto
==============================================================================
--- ctakes/trunk/ctakes-relation-extractor/src/main/java/org/apache/ctakes/relationextractor/concurrent/ThreadSafeModifierExtractor.java (added)
+++ ctakes/trunk/ctakes-relation-extractor/src/main/java/org/apache/ctakes/relationextractor/concurrent/ThreadSafeModifierExtractor.java Sun Nov 26 15:56:23 2017
@@ -0,0 +1,120 @@
+package org.apache.ctakes.relationextractor.concurrent;
+
+import org.apache.ctakes.core.concurrent.ThreadSafeWrapper;
+import org.apache.ctakes.core.pipeline.PipeBitInfo;
+import org.apache.ctakes.relationextractor.ae.ModifierExtractorAnnotator;
+import org.apache.log4j.Logger;
+import org.apache.uima.UimaContext;
+import org.apache.uima.analysis_engine.AnalysisEngineDescription;
+import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
+import org.apache.uima.fit.factory.AnalysisEngineFactory;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.resource.ResourceInitializationException;
+
+/**
+ * Normally I would use composition and a singleton, but here extension is done for @ConfigurationParameter discovery.
+ * Made a singleton mostly for model memory.
+ *
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 11/20/2017
+ */
+@PipeBitInfo(
+ name = "Thread safe Modifier Extractor",
+ description = "Annotates Modifiers and Chunks.",
+ dependencies = { PipeBitInfo.TypeProduct.BASE_TOKEN, PipeBitInfo.TypeProduct.SENTENCE },
+ products = { PipeBitInfo.TypeProduct.IDENTIFIED_ANNOTATION, PipeBitInfo.TypeProduct.CHUNK }
+)
+final public class ThreadSafeModifierExtractor extends ModifierExtractorAnnotator {
+
+ static private final Logger LOGGER = Logger.getLogger( "ThreadSafeModifierExtractor" );
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void initialize( final UimaContext context ) throws ResourceInitializationException {
+ MeSingleton.getInstance().initialize( context );
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void process( final JCas jCas ) throws AnalysisEngineProcessException {
+ MeSingleton.getInstance().process( jCas );
+ }
+
+ /**
+ * @return a modifier extractor
+ * @throws ResourceInitializationException -
+ */
+ public static AnalysisEngineDescription createAnnotatorDescription() throws ResourceInitializationException {
+ return AnalysisEngineFactory.createEngineDescription( ThreadSafeModifierExtractor.class );
+ }
+
+ private enum MeSingleton implements ThreadSafeWrapper<ModifierExtractorAnnotator> {
+ INSTANCE;
+
+ static public MeSingleton getInstance() {
+ return INSTANCE;
+ }
+
+ private final ModifierExtractorAnnotator _delegate;
+ private boolean _initialized;
+
+ MeSingleton() {
+ _delegate = new ModifierExtractorAnnotator();
+ }
+
+ final private Object LOCK = new Object();
+
+ @Override
+ public Object getLock() {
+ return LOCK;
+ }
+
+ @Override
+ public ModifierExtractorAnnotator getDelegate() {
+ return _delegate;
+ }
+
+ @Override
+ public boolean isInitialized() {
+ return _initialized;
+ }
+
+ @Override
+ public void setInitialized( final boolean initialized ) {
+ _initialized = initialized;
+ }
+
+ /**
+ * Calls initialize on the single instance if and only if it has not already been initialized
+ */
+ @Override
+ public void initialize( final UimaContext context ) throws ResourceInitializationException {
+ synchronized (LOCK) {
+ if ( !isInitialized() ) {
+ LOGGER.info( "Initializing ..." );
+ getDelegate().initialize( context );
+ setInitialized( true );
+ }
+ }
+ }
+
+ /**
+ * Calls process on the single instance if it is not already processing
+ */
+ @Override
+ public void process( final JCas jCas ) throws AnalysisEngineProcessException {
+ synchronized (LOCK) {
+ LOGGER.info( "Extracting Modifiers ..." );
+ getDelegate().process( jCas );
+ LOGGER.info( "Finished." );
+ }
+ }
+ }
+
+
+}
Copied: ctakes/trunk/ctakes-temporal-res/src/main/resources/org/apache/ctakes/temporal/pipeline/TsTemporalSubPipe.piper (from r1815683, ctakes/trunk/ctakes-temporal-res/src/main/resources/org/apache/ctakes/temporal/pipeline/TemporalSubPipe.piper)
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal-res/src/main/resources/org/apache/ctakes/temporal/pipeline/TsTemporalSubPipe.piper?p2=ctakes/trunk/ctakes-temporal-res/src/main/resources/org/apache/ctakes/temporal/pipeline/TsTemporalSubPipe.piper&p1=ctakes/trunk/ctakes-temporal-res/src/main/resources/org/apache/ctakes/temporal/pipeline/TemporalSubPipe.piper&r1=1815683&r2=1816385&rev=1816385&view=diff
==============================================================================
--- ctakes/trunk/ctakes-temporal-res/src/main/resources/org/apache/ctakes/temporal/pipeline/TemporalSubPipe.piper (original)
+++ ctakes/trunk/ctakes-temporal-res/src/main/resources/org/apache/ctakes/temporal/pipeline/TsTemporalSubPipe.piper Sun Nov 26 15:56:23 2017
@@ -1,19 +1,19 @@
// Commands and parameters to create a default temporal processing sub-pipeline. This is not a full pipeline.
// 'Generic' Events. Use addDescription and let the EventAnnotator set itself up with defaults.
-addDescription EventAnnotator
+addDescription concurrent.ThreadSafeEventAnnotator
// Times. Use addLogged to log start and finish of processing. There aren't default models, so set specifically
-add BackwardsTimeAnnotator classifierJarPath=/org/apache/ctakes/temporal/ae/timeannotator/model.jar
+add concurrent.ThreadSafeBackTimeAnnotator classifierJarPath=/org/apache/ctakes/temporal/ae/timeannotator/model.jar
// DocTimeRel: the relation bin for Events to the Document Creation Time.
-add DocTimeRelAnnotator classifierJarPath=/org/apache/ctakes/temporal/ae/doctimerel/model.jar
+add concurrent.ThreadSafeDocTimeRelAnnotator classifierJarPath=/org/apache/ctakes/temporal/ae/doctimerel/model.jar
// Event - Time binary relations.
-add EventTimeRelationAnnotator classifierJarPath=/org/apache/ctakes/temporal/ae/eventtime/model.jar
+add concurrent.ThreadSafeEventTimeRelAnnotator classifierJarPath=/org/apache/ctakes/temporal/ae/eventtime/model.jar
// Event - Event binary relations.
-add EventEventRelationAnnotator classifierJarPath=/org/apache/ctakes/temporal/ae/eventevent/model.jar
+add concurrent.ThreadSafeEventEventRelAnnotator classifierJarPath=/org/apache/ctakes/temporal/ae/eventevent/model.jar
// Need to improve. Generic Events (head words) should be replaced by overlapping subclasses with relations adjusted.
//add FullTemporalExtractionPipeline.CopyPropertiesToTemporalEventAnnotator
Added: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeBackTimeAnnotator.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeBackTimeAnnotator.java?rev=1816385&view=auto
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeBackTimeAnnotator.java (added)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeBackTimeAnnotator.java Sun Nov 26 15:56:23 2017
@@ -0,0 +1,128 @@
+package org.apache.ctakes.temporal.concurrent;
+
+import org.apache.ctakes.core.concurrent.ThreadSafeWrapper;
+import org.apache.ctakes.core.pipeline.PipeBitInfo;
+import org.apache.ctakes.temporal.ae.BackwardsTimeAnnotator;
+import org.apache.log4j.Logger;
+import org.apache.uima.UimaContext;
+import org.apache.uima.analysis_engine.AnalysisEngineDescription;
+import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
+import org.apache.uima.fit.factory.AnalysisEngineFactory;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.resource.ResourceInitializationException;
+import org.cleartk.ml.CleartkAnnotator;
+import org.cleartk.ml.DataWriter;
+import org.cleartk.ml.jar.DefaultDataWriterFactory;
+import org.cleartk.ml.jar.DirectoryDataWriterFactory;
+import org.cleartk.ml.jar.GenericJarClassifierFactory;
+
+import java.io.File;
+
+/**
+ * Normally I would use composition and a singleton, but here extension is done for @ConfigurationParameter discovery.
+ * Made a singleton mostly for model memory.
+ *
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 11/20/2017
+ */
+@PipeBitInfo(
+ name = "Thread safe Backward Timex Annotator",
+ description = "Annotates absolute time / date Temporal expressions.",
+ role = PipeBitInfo.Role.ANNOTATOR,
+ dependencies = { PipeBitInfo.TypeProduct.SECTION, PipeBitInfo.TypeProduct.SENTENCE,
+ PipeBitInfo.TypeProduct.BASE_TOKEN },
+ products = { PipeBitInfo.TypeProduct.TIMEX }
+)
+final public class ThreadSafeBackTimeAnnotator extends BackwardsTimeAnnotator {
+
+ static private final Logger LOGGER = Logger.getLogger( "ThreadSafeBackTimeAnnotator" );
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void initialize( final UimaContext context ) throws ResourceInitializationException {
+ BtSingleton.getInstance().initialize( context );
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void process( final JCas jCas ) throws AnalysisEngineProcessException {
+ BtSingleton.getInstance().process( jCas );
+ }
+
+ public static AnalysisEngineDescription createDataWriterDescription(
+ Class<? extends DataWriter<String>> dataWriterClass, File outputDirectory )
+ throws ResourceInitializationException {
+ return AnalysisEngineFactory.createEngineDescription(
+ ThreadSafeBackTimeAnnotator.class,
+ CleartkAnnotator.PARAM_IS_TRAINING,
+ true,
+ DefaultDataWriterFactory.PARAM_DATA_WRITER_CLASS_NAME,
+ dataWriterClass,
+ DirectoryDataWriterFactory.PARAM_OUTPUT_DIRECTORY,
+ outputDirectory );
+ }
+
+ public static AnalysisEngineDescription createAnnotatorDescription( final String modelPath )
+ throws ResourceInitializationException {
+ return AnalysisEngineFactory.createEngineDescription(
+ ThreadSafeBackTimeAnnotator.class,
+ CleartkAnnotator.PARAM_IS_TRAINING, false,
+ GenericJarClassifierFactory.PARAM_CLASSIFIER_JAR_PATH, modelPath );
+ }
+
+ public static AnalysisEngineDescription createEnsembleDescription( final String modelPath,
+ final String viewName )
+ throws ResourceInitializationException {
+ return AnalysisEngineFactory.createEngineDescription(
+ ThreadSafeBackTimeAnnotator.class,
+ CleartkAnnotator.PARAM_IS_TRAINING, false,
+ BackwardsTimeAnnotator.PARAM_TIMEX_VIEW, viewName,
+ GenericJarClassifierFactory.PARAM_CLASSIFIER_JAR_PATH, modelPath );
+ }
+
+
+ private enum BtSingleton implements ThreadSafeWrapper<BackwardsTimeAnnotator> {
+ INSTANCE;
+
+ static public BtSingleton getInstance() {
+ return INSTANCE;
+ }
+
+ private final BackwardsTimeAnnotator _delegate;
+ private boolean _initialized;
+
+ BtSingleton() {
+ _delegate = new BackwardsTimeAnnotator();
+ }
+
+ final private Object LOCK = new Object();
+
+ @Override
+ public Object getLock() {
+ return LOCK;
+ }
+
+ @Override
+ public BackwardsTimeAnnotator getDelegate() {
+ return _delegate;
+ }
+
+ @Override
+ public boolean isInitialized() {
+ return _initialized;
+ }
+
+ @Override
+ public void setInitialized( final boolean initialized ) {
+ _initialized = initialized;
+ }
+
+
+ }
+
+}
Added: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeDocTimeRelAnnotator.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeDocTimeRelAnnotator.java?rev=1816385&view=auto
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeDocTimeRelAnnotator.java (added)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeDocTimeRelAnnotator.java Sun Nov 26 15:56:23 2017
@@ -0,0 +1,113 @@
+package org.apache.ctakes.temporal.concurrent;
+
+import org.apache.ctakes.core.concurrent.ThreadSafeWrapper;
+import org.apache.ctakes.core.pipeline.PipeBitInfo;
+import org.apache.ctakes.temporal.ae.DocTimeRelAnnotator;
+import org.apache.log4j.Logger;
+import org.apache.uima.UimaContext;
+import org.apache.uima.analysis_engine.AnalysisEngineDescription;
+import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
+import org.apache.uima.fit.factory.AnalysisEngineFactory;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.resource.ResourceInitializationException;
+import org.cleartk.ml.CleartkAnnotator;
+import org.cleartk.ml.DataWriter;
+import org.cleartk.ml.jar.DefaultDataWriterFactory;
+import org.cleartk.ml.jar.DirectoryDataWriterFactory;
+import org.cleartk.ml.jar.GenericJarClassifierFactory;
+
+import java.io.File;
+
+/**
+ * Normally I would use composition and a singleton, but here extension is done for @ConfigurationParameter discovery.
+ * Made a singleton mostly for model memory.
+ *
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 11/20/2017
+ */
+@PipeBitInfo(
+ name = "Thread safe DocTimeRel Annotator",
+ description = "Annotates event relativity to document creation time.",
+ dependencies = { PipeBitInfo.TypeProduct.SENTENCE,
+ PipeBitInfo.TypeProduct.IDENTIFIED_ANNOTATION, PipeBitInfo.TypeProduct.EVENT }
+)
+final public class ThreadSafeDocTimeRelAnnotator extends DocTimeRelAnnotator {
+
+ static private final Logger LOGGER = Logger.getLogger( "ThreadSafeDocTimeRelAnnotator" );
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void initialize( final UimaContext context ) throws ResourceInitializationException {
+ DtrSingleton.getInstance().initialize( context );
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void process( final JCas jCas ) throws AnalysisEngineProcessException {
+ DtrSingleton.getInstance().process( jCas );
+ }
+
+ public static AnalysisEngineDescription createDataWriterDescription(
+ Class<? extends DataWriter<String>> dataWriterClass,
+ File outputDirectory ) throws ResourceInitializationException {
+ return AnalysisEngineFactory.createEngineDescription(
+ ThreadSafeDocTimeRelAnnotator.class,
+ CleartkAnnotator.PARAM_IS_TRAINING,
+ true,
+ DefaultDataWriterFactory.PARAM_DATA_WRITER_CLASS_NAME,
+ dataWriterClass,
+ DirectoryDataWriterFactory.PARAM_OUTPUT_DIRECTORY,
+ outputDirectory );
+ }
+
+ public static AnalysisEngineDescription createAnnotatorDescription( final String modelPath )
+ throws ResourceInitializationException {
+ return AnalysisEngineFactory.createEngineDescription(
+ ThreadSafeDocTimeRelAnnotator.class,
+ CleartkAnnotator.PARAM_IS_TRAINING, false,
+ GenericJarClassifierFactory.PARAM_CLASSIFIER_JAR_PATH, modelPath );
+ }
+
+ private enum DtrSingleton implements ThreadSafeWrapper<DocTimeRelAnnotator> {
+ INSTANCE;
+
+ static public DtrSingleton getInstance() {
+ return INSTANCE;
+ }
+
+ private final DocTimeRelAnnotator _delegate;
+ private boolean _initialized;
+
+ DtrSingleton() {
+ _delegate = new DocTimeRelAnnotator();
+ }
+
+ final private Object LOCK = new Object();
+
+ @Override
+ public Object getLock() {
+ return LOCK;
+ }
+
+ @Override
+ public DocTimeRelAnnotator getDelegate() {
+ return _delegate;
+ }
+
+ @Override
+ public boolean isInitialized() {
+ return _initialized;
+ }
+
+ @Override
+ public void setInitialized( final boolean initialized ) {
+ _initialized = initialized;
+ }
+ }
+
+}
Added: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeEventAnnotator.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeEventAnnotator.java?rev=1816385&view=auto
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeEventAnnotator.java (added)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeEventAnnotator.java Sun Nov 26 15:56:23 2017
@@ -0,0 +1,122 @@
+package org.apache.ctakes.temporal.concurrent;
+
+import org.apache.ctakes.core.concurrent.ThreadSafeWrapper;
+import org.apache.ctakes.core.pipeline.PipeBitInfo;
+import org.apache.ctakes.temporal.ae.EventAnnotator;
+import org.apache.log4j.Logger;
+import org.apache.uima.UimaContext;
+import org.apache.uima.analysis_engine.AnalysisEngineDescription;
+import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
+import org.apache.uima.fit.factory.AnalysisEngineFactory;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.resource.ResourceInitializationException;
+import org.cleartk.ml.CleartkAnnotator;
+import org.cleartk.ml.jar.DefaultDataWriterFactory;
+import org.cleartk.ml.jar.DirectoryDataWriterFactory;
+import org.cleartk.ml.jar.GenericJarClassifierFactory;
+
+import java.io.File;
+
+/**
+ * Normally I would use composition and a singleton, but here extension is done for @ConfigurationParameter discovery.
+ * Made a singleton mostly for model memory.
+ *
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 11/20/2017
+ */
+@PipeBitInfo(
+ name = "Thread safe Event Annotator",
+ description = "Annotates Temporal Events.",
+ dependencies = { PipeBitInfo.TypeProduct.SECTION, PipeBitInfo.TypeProduct.SENTENCE,
+ PipeBitInfo.TypeProduct.CHUNK, PipeBitInfo.TypeProduct.IDENTIFIED_ANNOTATION },
+ products = { PipeBitInfo.TypeProduct.EVENT }
+)
+final public class ThreadSafeEventAnnotator extends EventAnnotator {
+
+ static private final Logger LOGGER = Logger.getLogger( "ThreadSafeEventAnnotator" );
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void initialize( final UimaContext context ) throws ResourceInitializationException {
+ EvSingleton.getInstance().initialize( context );
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void process( final JCas jCas ) throws AnalysisEngineProcessException {
+ EvSingleton.getInstance().process( jCas );
+ }
+
+ public static AnalysisEngineDescription createDataWriterDescription(
+ Class<?> dataWriter,
+ File outputDirectory,
+ float downratio,
+ float featureSelect, float smoteNeighborNumber ) throws ResourceInitializationException {
+ return AnalysisEngineFactory.createEngineDescription(
+ ThreadSafeEventAnnotator.class,
+ CleartkAnnotator.PARAM_IS_TRAINING, true,
+ DefaultDataWriterFactory.PARAM_DATA_WRITER_CLASS_NAME, dataWriter,
+ DirectoryDataWriterFactory.PARAM_OUTPUT_DIRECTORY, outputDirectory,
+ EventAnnotator.PARAM_PROBABILITY_OF_KEEPING_A_NEGATIVE_EXAMPLE, downratio,
+ EventAnnotator.PARAM_FEATURE_SELECTION_THRESHOLD, featureSelect,
+ EventAnnotator.PARAM_SMOTE_NUM_NEIGHBORS, smoteNeighborNumber );
+ }
+
+ public static AnalysisEngineDescription createAnnotatorDescription( final String modelPath )
+ throws ResourceInitializationException {
+ return AnalysisEngineFactory.createEngineDescription(
+ ThreadSafeEventAnnotator.class,
+ CleartkAnnotator.PARAM_IS_TRAINING, false,
+ GenericJarClassifierFactory.PARAM_CLASSIFIER_JAR_PATH, modelPath );
+ }
+
+ public static AnalysisEngineDescription createAnnotatorDescription()
+ throws ResourceInitializationException {
+ return createAnnotatorDescription(
+ String.format( "/%s/model.jar",
+ EventAnnotator.class.getName().toLowerCase().replace( '.', '/' ) ) );
+ }
+
+ private enum EvSingleton implements ThreadSafeWrapper<EventAnnotator> {
+ INSTANCE;
+
+ static public EvSingleton getInstance() {
+ return INSTANCE;
+ }
+
+ private final EventAnnotator _delegate;
+ private boolean _initialized;
+
+ EvSingleton() {
+ _delegate = new EventAnnotator();
+ }
+
+ final private Object LOCK = new Object();
+
+ @Override
+ public Object getLock() {
+ return LOCK;
+ }
+
+ @Override
+ public EventAnnotator getDelegate() {
+ return _delegate;
+ }
+
+ @Override
+ public boolean isInitialized() {
+ return _initialized;
+ }
+
+ @Override
+ public void setInitialized( final boolean initialized ) {
+ _initialized = initialized;
+ }
+ }
+
+}
Added: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeEventEventRelAnnotator.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeEventEventRelAnnotator.java?rev=1816385&view=auto
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeEventEventRelAnnotator.java (added)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeEventEventRelAnnotator.java Sun Nov 26 15:56:23 2017
@@ -0,0 +1,120 @@
+package org.apache.ctakes.temporal.concurrent;
+
+import org.apache.ctakes.core.concurrent.ThreadSafeWrapper;
+import org.apache.ctakes.core.pipeline.PipeBitInfo;
+import org.apache.ctakes.relationextractor.ae.RelationExtractorAnnotator;
+import org.apache.ctakes.temporal.ae.EventEventRelationAnnotator;
+import org.apache.log4j.Logger;
+import org.apache.uima.UimaContext;
+import org.apache.uima.analysis_engine.AnalysisEngineDescription;
+import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
+import org.apache.uima.fit.factory.AnalysisEngineFactory;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.resource.ResourceInitializationException;
+import org.cleartk.ml.CleartkAnnotator;
+import org.cleartk.ml.DataWriter;
+import org.cleartk.ml.jar.DefaultDataWriterFactory;
+import org.cleartk.ml.jar.DirectoryDataWriterFactory;
+import org.cleartk.ml.jar.GenericJarClassifierFactory;
+
+import java.io.File;
+
+/**
+ * Normally I would use composition and a singleton, but here extension is done for @ConfigurationParameter discovery.
+ * Made a singleton mostly for model memory.
+ *
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 11/20/2017
+ */
+@PipeBitInfo(
+ name = "Thread safe E-E TLinker",
+ description = "Creates Event - Event TLinks.",
+ dependencies = { PipeBitInfo.TypeProduct.SECTION, PipeBitInfo.TypeProduct.SENTENCE,
+ PipeBitInfo.TypeProduct.EVENT },
+ products = { PipeBitInfo.TypeProduct.TEMPORAL_RELATION }
+)
+final public class ThreadSafeEventEventRelAnnotator extends EventEventRelationAnnotator {
+
+ static private final Logger LOGGER = Logger.getLogger( "ThreadSafeEventEventRelAnnotator" );
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void initialize( final UimaContext context ) throws ResourceInitializationException {
+ EvErSingleton.getInstance().initialize( context );
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void process( final JCas jCas ) throws AnalysisEngineProcessException {
+ EvErSingleton.getInstance().process( jCas );
+ }
+
+ public static AnalysisEngineDescription createDataWriterDescription(
+ Class<? extends DataWriter<String>> dataWriterClass,
+ File outputDirectory,
+ double probabilityOfKeepingANegativeExample ) throws ResourceInitializationException {
+ return AnalysisEngineFactory.createEngineDescription(
+ ThreadSafeEventEventRelAnnotator.class,
+ CleartkAnnotator.PARAM_IS_TRAINING,
+ true,
+ DefaultDataWriterFactory.PARAM_DATA_WRITER_CLASS_NAME,
+ dataWriterClass,
+ DirectoryDataWriterFactory.PARAM_OUTPUT_DIRECTORY,
+ outputDirectory,
+ RelationExtractorAnnotator.PARAM_PROBABILITY_OF_KEEPING_A_NEGATIVE_EXAMPLE,
+ // not sure why this has to be cast; something funny going on in uimaFIT maybe?
+ (float) probabilityOfKeepingANegativeExample );
+ }
+
+ public static AnalysisEngineDescription createAnnotatorDescription( final String modelPath )
+ throws ResourceInitializationException {
+ return AnalysisEngineFactory.createEngineDescription(
+ ThreadSafeEventEventRelAnnotator.class,
+ CleartkAnnotator.PARAM_IS_TRAINING, false,
+ GenericJarClassifierFactory.PARAM_CLASSIFIER_JAR_PATH, modelPath );
+ }
+
+
+ private enum EvErSingleton implements ThreadSafeWrapper<EventEventRelationAnnotator> {
+ INSTANCE;
+
+ static public EvErSingleton getInstance() {
+ return INSTANCE;
+ }
+
+ private final EventEventRelationAnnotator _delegate;
+ private boolean _initialized;
+
+ EvErSingleton() {
+ _delegate = new EventEventRelationAnnotator();
+ }
+
+ final private Object LOCK = new Object();
+
+ @Override
+ public Object getLock() {
+ return LOCK;
+ }
+
+ @Override
+ public EventEventRelationAnnotator getDelegate() {
+ return _delegate;
+ }
+
+ @Override
+ public boolean isInitialized() {
+ return _initialized;
+ }
+
+ @Override
+ public void setInitialized( final boolean initialized ) {
+ _initialized = initialized;
+ }
+ }
+
+}
Added: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeEventTimeRelAnnotator.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeEventTimeRelAnnotator.java?rev=1816385&view=auto
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeEventTimeRelAnnotator.java (added)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/concurrent/ThreadSafeEventTimeRelAnnotator.java Sun Nov 26 15:56:23 2017
@@ -0,0 +1,119 @@
+package org.apache.ctakes.temporal.concurrent;
+
+import org.apache.ctakes.core.concurrent.ThreadSafeWrapper;
+import org.apache.ctakes.core.pipeline.PipeBitInfo;
+import org.apache.ctakes.relationextractor.ae.RelationExtractorAnnotator;
+import org.apache.ctakes.temporal.ae.EventTimeRelationAnnotator;
+import org.apache.log4j.Logger;
+import org.apache.uima.UimaContext;
+import org.apache.uima.analysis_engine.AnalysisEngineDescription;
+import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
+import org.apache.uima.fit.factory.AnalysisEngineFactory;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.resource.ResourceInitializationException;
+import org.cleartk.ml.CleartkAnnotator;
+import org.cleartk.ml.DataWriter;
+import org.cleartk.ml.jar.DefaultDataWriterFactory;
+import org.cleartk.ml.jar.DirectoryDataWriterFactory;
+import org.cleartk.ml.jar.GenericJarClassifierFactory;
+
+import java.io.File;
+
+/**
+ * Normally I would use composition and a singleton, but here extension is done for @ConfigurationParameter discovery.
+ * Made a singleton mostly for model memory.
+ *
+ * @author SPF , chip-nlp
+ * @version %I%
+ * @since 11/20/2017
+ */
+@PipeBitInfo(
+ name = "Thread safe E-T TLinker",
+ description = "Creates Event - Time TLinks.",
+ dependencies = { PipeBitInfo.TypeProduct.SECTION, PipeBitInfo.TypeProduct.SENTENCE,
+ PipeBitInfo.TypeProduct.EVENT, PipeBitInfo.TypeProduct.TIMEX },
+ products = { PipeBitInfo.TypeProduct.TEMPORAL_RELATION }
+)
+final public class ThreadSafeEventTimeRelAnnotator extends EventTimeRelationAnnotator {
+
+ static private final Logger LOGGER = Logger.getLogger( "ThreadSafeEventTimeRelAnnotator" );
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void initialize( final UimaContext context ) throws ResourceInitializationException {
+ EvtrSingleton.getInstance().initialize( context );
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void process( final JCas jCas ) throws AnalysisEngineProcessException {
+ EvtrSingleton.getInstance().process( jCas );
+ }
+
+ public static AnalysisEngineDescription createDataWriterDescription(
+ Class<? extends DataWriter<String>> dataWriterClass,
+ File outputDirectory,
+ double probabilityOfKeepingANegativeExample ) throws ResourceInitializationException {
+ return AnalysisEngineFactory.createEngineDescription(
+ ThreadSafeEventTimeRelAnnotator.class,
+ CleartkAnnotator.PARAM_IS_TRAINING,
+ true,
+ DefaultDataWriterFactory.PARAM_DATA_WRITER_CLASS_NAME,
+ dataWriterClass,
+ DirectoryDataWriterFactory.PARAM_OUTPUT_DIRECTORY,
+ outputDirectory,
+ RelationExtractorAnnotator.PARAM_PROBABILITY_OF_KEEPING_A_NEGATIVE_EXAMPLE,
+ // not sure why this has to be cast; something funny going on in uimaFIT maybe?
+ (float) probabilityOfKeepingANegativeExample );
+ }
+
+ public static AnalysisEngineDescription createAnnotatorDescription( final String modelPath )
+ throws ResourceInitializationException {
+ return AnalysisEngineFactory.createEngineDescription(
+ ThreadSafeEventTimeRelAnnotator.class,
+ CleartkAnnotator.PARAM_IS_TRAINING, false,
+ GenericJarClassifierFactory.PARAM_CLASSIFIER_JAR_PATH, modelPath );
+ }
+
+ private enum EvtrSingleton implements ThreadSafeWrapper<EventTimeRelationAnnotator> {
+ INSTANCE;
+
+ static public EvtrSingleton getInstance() {
+ return INSTANCE;
+ }
+
+ private final EventTimeRelationAnnotator _delegate;
+ private boolean _initialized;
+
+ EvtrSingleton() {
+ _delegate = new EventTimeRelationAnnotator();
+ }
+
+ final private Object LOCK = new Object();
+
+ @Override
+ public Object getLock() {
+ return LOCK;
+ }
+
+ @Override
+ public EventTimeRelationAnnotator getDelegate() {
+ return _delegate;
+ }
+
+ @Override
+ public boolean isInitialized() {
+ return _initialized;
+ }
+
+ @Override
+ public void setInitialized( final boolean initialized ) {
+ _initialized = initialized;
+ }
+ }
+
+}