Я экспериментирую с TokensRegex от Stanford NLP и пытаюсь найти размеры (например, 100x120) в тексте. Таким образом, мой план состоит в том, чтобы сначала обновить вход для дальнейшего разделения этих токенов (используя пример, приведенный в retokenize.rules.txt), а затем для поиска нового шаблона.TokensRegex: токены равны нулю после ретоклинизации
После выполнения retokenization, однако, только нулевые значения остаются, заменяющие исходную строку:
The top level annotation
[Text=100x120 Tokens=[null-1, null-2, null-3] Sentences=[100x120]]
retokenization кажется, работает хорошо (3 лексемы в результате), но значения теряются. Что я могу сделать, чтобы сохранить исходные значения в списке токенов?
Мой файл retokenize.rules.txt (как в демо-версии):
tokens = { type: "CLASS", value:"edu.stanford.nlp.ling.CoreAnnotations$TokensAnnotation" }
options.matchedExpressionsAnnotationKey = tokens;
options.extractWithTokens = TRUE;
options.flatten = TRUE;
ENV.defaults["ruleType"] = "tokens"
ENV.defaultStringPatternFlags = 2
ENV.defaultResultAnnotationKey = tokens
{ pattern: (/\d+(x|X)\d+/), result: Split($0[0], /x|X/, TRUE) }
Основной метод:
public static void main(String[] args) throws IOException {
//...
text = "100x120";
Properties properties = new Properties();
properties.setProperty("tokenize.language", "de");
properties.setProperty("annotators", tokenize,retokenize,ssplit,pos,lemma,ner");
properties.setProperty("customAnnotatorClass.retokenize", "edu.stanford.nlp.pipeline.TokensRegexAnnotator");
properties.setProperty("retokenize.rules", "retokenize.rules.txt");
StanfordCoreNLP stanfordPipeline = new StanfordCoreNLP(properties);
runPipeline(pipelineWithRetokenize, text);
}
И трубопровод:
public static void runPipeline(StanfordCoreNLP pipeline, String text) {
Annotation annotation = new Annotation(text);
pipeline.annotate(annotation);
out.println();
out.println("The top level annotation");
out.println(annotation.toShorterString());
//...
}