Как использовать HeidelTime в качестве UIMA AnalysisEngine с DKPro
В настоящее время я работаю над проектом по извлечению биографической информации из текстовых источников. Одним шагом является аннотация источника, чтобы увидеть, что на самом деле там. Для этого я бы хотел использовать HeidelTime, потому что в документации сказано, что он хорошо вписывается в конвейер UIMA. Поскольку я все еще новичок в NLP, я пробовал DKPro Core Framework, который до сих пор предоставлял удобный доступ ко всем компонентам, которые я хотел, включая завершение работы в конвейерах следующим образом:
public static void main(String[] args) throws UIMAException, IOException {
Path inputDir = Paths.get(args[0]);
String language = args[1];
String fileForm = String.format("[+]*%s", args[2]);
Path outputFile = Paths.get(args[3]);
CollectionReader reader = createReader(TextReader.class,
TextReader.PARAM_SOURCE_LOCATION, inputDir.toString(),
TextReader.PARAM_LANGUAGE, language,
TextReader.PARAM_PATTERNS, new String[]{fileForm});
AnalysisEngineDescription segmenter = createEngineDescription(StanfordSegmenter.class,
StanfordSegmenter.PARAM_LANGUAGE, language,
StanfordSegmenter.PARAM_WRITE_SENTENCE, true,
StanfordSegmenter.PARAM_WRITE_TOKEN, true
);
AnalysisEngineDescription ner = createEngineDescription(StanfordNamedEntityRecognizer.class);
AnalysisEngineDescription writer = createEngineDescription(TokenizedTextWriter.class,
TokenizedTextWriter.PARAM_TARGET_LOCATION, outputFile.toString(),
TokenizedTextWriter.PARAM_OVERWRITE, true,
TokenizedTextWriter.PARAM_EXTENSION, ".txt"
);
runPipeline(reader, segmenter, ner, writer);
}
В документации говорится, что основной класс анализа HeidelTime реализует необходимый интерфейс, поэтому я добавил его, в том числе предложенные до и после обработки AnalysisEngines:
public static void main(String[] args) throws UIMAException, IOException {
Path inputDir = Paths.get(args[0]);
String language = args[1];
String fileForm = String.format("[+]*%s", args[2]);
Path outputFile = Paths.get(args[3]);
CollectionReader reader = createReader(TextReader.class,
TextReader.PARAM_SOURCE_LOCATION, inputDir.toString(),
TextReader.PARAM_LANGUAGE, language,
TextReader.PARAM_PATTERNS, new String[]{fileForm});
AnalysisEngineDescription segmenter = createEngineDescription(StanfordSegmenter.class,
StanfordSegmenter.PARAM_LANGUAGE, language,
StanfordSegmenter.PARAM_WRITE_SENTENCE, true,
StanfordSegmenter.PARAM_WRITE_TOKEN, true
);
AnalysisEngineDescription ner = createEngineDescription(StanfordNamedEntityRecognizer.class);
// ======= HeidelTime ======
AnalysisEngineDescription treeTagger = createEngineDescription(TreeTaggerWrapper.class);
AnalysisEngineDescription heidelTime = createEngineDescription(HeidelTime.class);
AnalysisEngineDescription intervalTagger = createEngineDescription(IntervalTagger.class);
// ======= HeidelTime ======
AnalysisEngineDescription writer = createEngineDescription(TokenizedTextWriter.class,
TokenizedTextWriter.PARAM_TARGET_LOCATION, outputFile.toString(),
TokenizedTextWriter.PARAM_OVERWRITE, true,
TokenizedTextWriter.PARAM_EXTENSION, ".txt"
);
runPipeline(reader, segmenter, ner, treeTagger, heidelTime, intervalTagger, writer);
}
Однако, когда я запускаю это, я сталкиваюсь со следующей ошибкой:
1016 [main] WARN org.apache.uima.resource.metadata.TypeSystemDescription - [jar:file:/C:/Users/User/.m2/repository/com/github/heideltime/heideltime/2.2.1/heideltime-2.2.1.jar!/desc/type/HeidelTime_TypeSystemStyleMap.xml] is not a type file. Ignoring.
org.apache.uima.util.InvalidXMLException: Invalid descriptor at jar:file:/C:/Users/User/.m2/repository/com/github/heideltime/heideltime/2.2.1/heideltime-2.2.1.jar!/desc/type/HeidelTime_TypeSystemStyleMap.xml.
at org.apache.uima.util.impl.XMLParser_impl.parse(XMLParser_impl.java:218)
at org.apache.uima.util.impl.XMLParser_impl.parseTypeSystemDescription(XMLParser_impl.java:729)
at org.apache.uima.util.impl.XMLParser_impl.parseTypeSystemDescription(XMLParser_impl.java:718)
at org.apache.uima.fit.factory.TypeSystemDescriptionFactory.createTypeSystemDescription(TypeSystemDescriptionFactory.java:107)
at org.apache.uima.fit.factory.CollectionReaderFactory.createReader(CollectionReaderFactory.java:213)
at de.uniba.minf.msc.stemper.corpus.pantheon.Pipeline.main(Pipeline.java:37)
Caused by: org.apache.uima.util.InvalidXMLException: The XML parser encountered an unknown element type: styleMap.
at org.apache.uima.util.impl.XMLParser_impl.buildObject(XMLParser_impl.java:301)
at org.apache.uima.util.impl.SaxDeserializer_impl.getObject(SaxDeserializer_impl.java:142)
at org.apache.uima.util.impl.XMLParser_impl.parse(XMLParser_impl.java:209)
... 5 more
Компонент HeidelTime, похоже, не переводится должным образом с другими механизмами анализа. В документации сказано, что так и должно быть, однако ответственный класс отсутствует в репозитории и, вероятно, в артефакте Maven, который я тоже вытащил. Я не знаю, с чего начать искать исправление, и до сих пор я не нашел ничего намекающего на направление в Интернете, за исключением некоторых старых вопросов о том, как использовать автономное приложение здесь и здесь.