2016-04-27 1 views
0

Я экспериментирую с 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()); 
    //... 
} 

ответ

0

Спасибо, что позволили Знаю. CoreAnnotations.ValueAnnotation не заполняется, и мы обновим TokenRegex для заполнения поля.

Независимо от того, вы должны использовать TokenRegex для повторного использования, как вы планировали. Большая часть конвейера не зависит от ValueAnnotation и вместо этого использует CoreAnnotations.TextAnnotation. Вы можете использовать CoreAnnotations.TextAnnotation, чтобы получить текст для новых токенов (каждый токен является CoreLabel, поэтому вы можете получить к нему доступ, используя token.word()).

См., Например, код TokensRegexRetokenizeDemo о том, как получить различные аннотации.