Stanford CoreNLP: Как интегрировать стандартную, но обученную в России модель NER с полностью настраиваемыми моделями для лемматизации?

В настоящее время я работаю над адаптацией алгоритма разметки кореферентных тегов для русского языка в рамках моего университетского проекта, основанного на Stanford CoreNLP. По большей части это было достаточно просто: уже существуют российские модели лемматизации и PoS-тегирования. Однако для языка не существовало модели NER, по крайней мере, на основе CoreNLP, и поэтому мне пришлось обучить такую ​​модель самостоятельно, используя статистические методы CoreNLP.

Проблема заключается в адаптации этой новой обученной модели NER к моделям лемматизации и PoS-тегирования. Хотя моя модель была чисто статистической и все еще основывалась на исходном коде CoreNLP, две другие совершенно разные. Поэтому я не могу заставить свой NER интегрировать их. Как этого добиться? Соответствующий код:

props.setProperty("annotators", "tokenize,ssplit,pos,custom.lemma,custom.morpho,custom.ner,depparse, mention, coref");
props.setProperty("pos.model", "edu/stanford/nlp/models/pos-tagger/russian-ud-pos.tagger");
props.setProperty("customAnnotatorClass.custom.lemma", "edu.stanford.nlp.international.russian.process.RussianLemmatizationAnnotator");
props.setProperty("custom.lemma.dictionaryPath", "edu/stanford/nlp/international/russian/process/dict.tsv");
props.setProperty("customAnnotatorClass.custom.morpho", "edu.stanford.nlp.international.russian.process.RussianMorphoAnnotator");
props.setProperty("customAnnotatorClass.custom.ner", "edu.stanford.nlp.international.russian.process.RussianMorphoAnnotator");
props.setProperty("custom.morpho.model", "edu/stanford/nlp/models/pos-tagger/russian-ud-mf.tagger");
props.setProperty("ner.model", "C:/Users/Admin/eclipse-workspace/Coreference-Evaluation-master/libs/russian-new-model.ser.gz");
props.setProperty("depparse.model", "edu/stanford/nlp/models/parser/nndep/nndep.rus.model.wiki.txt.gz");
props.setProperty("depparse.language", "russian");
props.setProperty("parse.maxlen", "100");
props.setProperty("ssplit.eolonly", "true");
props.setProperty("tokenize.whitespace","true");
props.setProperty("coref.removeSingletonClusters","false");
pipeline = new StanfordCoreNLP(props);
System.out.println(pipeline);

Прежде чем вы предложите, я полностью изменю алгоритм: мои знания Java на данный момент недостаточно хороши, чтобы вносить такие радикальные изменения в уже существующий код.


person Imperios    schedule 17.03.2019    source источник


Ответы (1)


Вам нужно пометить свои обучающие данные NER своим пользовательским лемматизатором и теггером части речи. Также убедитесь, что токенизация такая же, как и во время тестирования. Затем обучите модель NER предсказанным леммам и тегам части речи. Предполагается, что вы используете их как функции в своей модели NER.

Если в ваших обучающих данных NER нет данных части речи или леммы, конвейер должен работать нормально, поскольку модель NER не будет использовать эти функции для своих решений. Я не верю, что распространяемые нами модели NER, например, используют эти функции.

person StanfordNLPHelp    schedule 17.03.2019
comment
Проблема в том, что стандартная модель NER требует лемматизации: Исключение в основном потоке java.lang.IllegalArgumentException: аннотатор требует аннотации LemmaAnnotation. Обычные требования для этого аннотатора: tokenize, ssplit, pos, lemma - person Imperios; 18.03.2019
comment
Это потому, что для ner.useSUTime и ner.applyNumericClassifiers установлено значение true. Для них должно быть установлено значение false. - person StanfordNLPHelp; 21.03.2019