Зависимость cleartk не найдена при вызове StanfordCoreNLPAnnotator из RUTA UIMA
Я пытаюсь вызвать ClearTK StanfordCoreNLPAnnotator из UIMA RUTA, но не могу заставить его работать. Я использую eclipse с проектом RUTA с поддержкой maven, в котором у меня также есть Java-код для вспомогательных задач. Я импортировал cleartk-stanford-corenlp 0.8, используя maven.
Я попытался использовать эту строку в моем скрипте:
ENGINE utils.MyStanfordEngine;
... где utils/MyStanfordEngine.xml - файл дескриптора XML, созданный с использованием этого кода Java:
MyStanfordAnnotator.getDescription().toXML(new FileOutputStream("descriptor/utils/MyStanfordEngine.xml"));
Ошибки не появляются, но после выполнения я получаю:
Exception in thread "main" org.apache.uima.resource.ResourceInitializationException: Initialization of annotator class ... failed.
(Descriptor: file:.../descriptor/mainScriptEngine.xml)
...
Caused by: org.apache.uima.resource.ResourceInitializationException: Annotator class
"org.cleartk.stanford.StanfordCoreNLPAnnotator" was not found.
(Descriptor: file:.../descriptor/utils/MyStanfordEngine.xml)
...
Я думаю, что я понимаю, что проект RUTA не находит его в зависимостях Maven, но мне нужно придерживаться Maven как своего инструмента зависимости из-за целей сотрудничества.
Может кто-нибудь помочь?
ОБНОВИТЬ:
Когда я столкнулся с проблемой, я использовал RUTA 2.1.0. С тех пор я обновился до 2.2.0rc1, но проблема осталась.
С предложением Питера ниже (Спасибо!) В пути сборки Java я ссылался на пустой Java-проект с поддержкой Maven, который ничего не делает, но импортирует cleartk-stanford-corenlp 0.8. Теперь я могу запустить следующий код RUTA:
TYPESYSTEM utils.CleartkRutaTypeSystem;
ENGINE utils.MyStanfordEngine;
Document{-> CALL(MyStanfordEngine)};
... успешно выполняет то, что выглядит как все намеченные аннотации для всех документов во входной папке, но в итоге вылетает с этим исключением:
[Stanford Tools Logging output ...]
22.02.2014 12:44:22 org.apache.uima.analysis_engine.impl.PrimitiveAnalysisEngine_impl callAnalysisComponentProcess(406)
SCHWERWIEGEND: Exception occurred
org.apache.uima.analysis_engine.AnalysisEngineProcessException: Annotator processing failed.
at org.apache.uima.ruta.engine.RutaEngine.process(RutaEngine.java:477)
at org.apache.uima.analysis_component.JCasAnnotator_ImplBase.process(JCasAnnotator_ImplBase.java:48)
at org.apache.uima.analysis_engine.impl.PrimitiveAnalysisEngine_impl.callAnalysisComponentProcess(PrimitiveAnalysisEngine_impl.java:374)
at org.apache.uima.analysis_engine.impl.PrimitiveAnalysisEngine_impl.processAndOutputNewCASes(PrimitiveAnalysisEngine_impl.java:298)
at org.apache.uima.analysis_engine.impl.AnalysisEngineImplBase.process(AnalysisEngineImplBase.java:267)
at org.apache.uima.ruta.ide.launching.RutaLauncher.processFile(RutaLauncher.java:168)
at org.apache.uima.ruta.ide.launching.RutaLauncher.main(RutaLauncher.java:129)
Caused by: java.lang.NullPointerException
at org.apache.uima.cas.impl.CASImpl.createFS(CASImpl.java:483)
at org.apache.uima.cas.impl.CASImpl.createAnnotation(CASImpl.java:3837)
at org.apache.uima.ruta.action.CallAction.callEngine(CallAction.java:192)
at org.apache.uima.ruta.action.CallAction.execute(CallAction.java:62)
at org.apache.uima.ruta.rule.AbstractRuleElement.apply(AbstractRuleElement.java:130)
at org.apache.uima.ruta.rule.RuleElementCaretaker.applyRuleElements(RuleElementCaretaker.java:111)
at org.apache.uima.ruta.rule.ComposedRuleElement.applyRuleElements(ComposedRuleElement.java:547)
at org.apache.uima.ruta.rule.AbstractRuleElement.doneMatching(AbstractRuleElement.java:84)
at org.apache.uima.ruta.rule.ComposedRuleElement.fallback(ComposedRuleElement.java:468)
at org.apache.uima.ruta.rule.ComposedRuleElement.fallbackContinue(ComposedRuleElement.java:377)
at org.apache.uima.ruta.rule.RutaRuleElement.startMatch(RutaRuleElement.java:100)
at org.apache.uima.ruta.rule.ComposedRuleElement.startMatch(ComposedRuleElement.java:73)
at org.apache.uima.ruta.rule.RutaRule.apply(RutaRule.java:47)
at org.apache.uima.ruta.rule.RutaRule.apply(RutaRule.java:40)
at org.apache.uima.ruta.rule.RutaRule.apply(RutaRule.java:29)
at org.apache.uima.ruta.RutaScriptBlock.apply(RutaScriptBlock.java:63)
at org.apache.uima.ruta.RutaModule.apply(RutaModule.java:48)
at org.apache.uima.ruta.engine.RutaEngine.process(RutaEngine.java:475)
... 6 more
Exception in thread "main" org.apache.uima.analysis_engine.AnalysisEngineProcessException: Annotator processing failed.
at org.apache.uima.ruta.engine.RutaEngine.process(RutaEngine.java:477)
at org.apache.uima.analysis_component.JCasAnnotator_ImplBase.process(JCasAnnotator_ImplBase.java:48)
at org.apache.uima.analysis_engine.impl.PrimitiveAnalysisEngine_impl.callAnalysisComponentProcess(PrimitiveAnalysisEngine_impl.java:374)
at org.apache.uima.analysis_engine.impl.PrimitiveAnalysisEngine_impl.processAndOutputNewCASes(PrimitiveAnalysisEngine_impl.java:298)
at org.apache.uima.analysis_engine.impl.AnalysisEngineImplBase.process(AnalysisEngineImplBase.java:267)
at org.apache.uima.ruta.ide.launching.RutaLauncher.processFile(RutaLauncher.java:168)
at org.apache.uima.ruta.ide.launching.RutaLauncher.main(RutaLauncher.java:129)
Caused by: java.lang.NullPointerException
at org.apache.uima.cas.impl.CASImpl.createFS(CASImpl.java:483)
at org.apache.uima.cas.impl.CASImpl.createAnnotation(CASImpl.java:3837)
at org.apache.uima.ruta.action.CallAction.callEngine(CallAction.java:192)
at org.apache.uima.ruta.action.CallAction.execute(CallAction.java:62)
at org.apache.uima.ruta.rule.AbstractRuleElement.apply(AbstractRuleElement.java:130)
at org.apache.uima.ruta.rule.RuleElementCaretaker.applyRuleElements(RuleElementCaretaker.java:111)
at org.apache.uima.ruta.rule.ComposedRuleElement.applyRuleElements(ComposedRuleElement.java:547)
at org.apache.uima.ruta.rule.AbstractRuleElement.doneMatching(AbstractRuleElement.java:84)
at org.apache.uima.ruta.rule.ComposedRuleElement.fallback(ComposedRuleElement.java:468)
at org.apache.uima.ruta.rule.ComposedRuleElement.fallbackContinue(ComposedRuleElement.java:377)
at org.apache.uima.ruta.rule.RutaRuleElement.startMatch(RutaRuleElement.java:100)
at org.apache.uima.ruta.rule.ComposedRuleElement.startMatch(ComposedRuleElement.java:73)
at org.apache.uima.ruta.rule.RutaRule.apply(RutaRule.java:47)
at org.apache.uima.ruta.rule.RutaRule.apply(RutaRule.java:40)
at org.apache.uima.ruta.rule.RutaRule.apply(RutaRule.java:29)
at org.apache.uima.ruta.RutaScriptBlock.apply(RutaScriptBlock.java:63)
at org.apache.uima.ruta.RutaModule.apply(RutaModule.java:48)
at org.apache.uima.ruta.engine.RutaEngine.process(RutaEngine.java:475)
... 6 more
Извините за всю трассировку стека, но я подумал, что если разработчик RUTA читает это, они могут захотеть всего этого.
Есть ли способ решить это? Что я делаю неправильно?
1 ответ
Есть несколько ограничений для рассмотрения:
- UIMA Ruta 2.1.0 не поддерживает смешанные проекты: зависимости maven должны быть указаны в другом проекте. Тогда проект Ruta должен зависеть от дополнительного Java-проекта.
- UIMA Ruta Workbench 2.1.0 имеет некоторые проблемы при проверке импортированной системы типов, которая снова импортирует другие системы типов по имени. Здесь следует использовать импорт по местоположению.
- UIMA CAS Editor 2.5.0 имеет некоторые проблемы с разрешением импорта системы типов с использованием пути к данным, что вызывает проблемы с визуализацией созданных аннотаций, если дескриптору системы типов требуется дополнительная информация, такая как путь к данным. Здесь создание дескриптора системы типов сценария должно включать (не только импорт) все типы импортируемых систем типов. Это может быть настроено в настройках (я не использовал это некоторое время). Эту проблему можно снова предотвратить с помощью импорта по местоположению.
- UIMA Ruta 2.2.0 поддерживает смешанные проекты. Здесь остается проблема только с CAS Editor.
Этот описанный проект может быть создан следующим образом (с UIMA Ruta 2.2.0):
- Создать новый проект UIMA Ruta
- Сделайте это Maven-проектом: popup->Configure->Convert to Maven Project
Добавьте зависимость к cleartk-stanford-corenlp в pom
<dependency> <groupId>org.cleartk</groupId> <artifactId>cleartk-stanford-corenlp</artifactId> <version>0.8.0</version> </dependency>
- Укажите системы типов в папке дескриптора или в зависимом проекте, например, скопируйте
org
папка изcleartk-type-system-1.2.0
в папку дескриптора. Имейте в виду, что редактор CAS будет иметь проблемы с разрешением импорта, если дескрипторы не адаптированы. Создайте простой скрипт, который импортирует систему типов, импортирует механизм анализа и выполняет механизм анализа. Здесь компонент uimaFIT импортируется напрямую вместо дескриптора. Действие EXEC должно быть расширено интересными типами, если более поздние правила будут способны работать с результатом импортированного механизма анализа.
TYPESYSTEM org.cleartk.TypeSystem; UIMAFIT org.cleartk.stanford.StanfordCoreNLPAnnotator; Document{->EXEC(StanfordCoreNLPAnnotator)};
- Если в папке импорта есть текстовый файл, то при запуске этого сценария его можно будет аннотировать.
Этот пример напрямую использует StanfordCoreNLPAnnotator
вместо дополнительного механизма анализа, но переключение на другой механизм реализации или анализа должно быть простым.