У нас есть инструмент для написания отчетов, в который мы пытаемся добавить возможность поиска. По сути, пользователь сможет ввести вопрос и получить отчет на основе критериев в предложении. Мы пытаемся сделать это как можно более открытым, не требуя определенной структуры предложений, поэтому мы решили попробовать OpenNLP NER.
Примером может быть:
"Какой была посещаемость искусств в прошлом квартале"
Отмечен как:
what was <START:dept> Arts <END> <START:filter> attendance <END> last <START:calc> quarter <END>
Мы пытались придумать много разных вариантов вопросов с различными отделами, фильтрами и т. д. Мы все еще не на уровне 15 000, а только на 14,6 000, поэтому все еще работаем над этим.
Что касается анализа вопроса, то это начало:
InputStream tokenStream = getClass().getResourceAsStream("/en-token.bin"); //$NON-NLS
TokenizerModel tokenModel = new TokenizerModel(tokenStream);
Tokenizer tokenizer = new TokenizerME(tokenModel);
for (String name : modelNames) {
tokenizedQuestion = tokenizer.tokenize(question);
String alteredQuestion = question;
TokenNameFinderModel entityModel = new TokenNameFinderModel(getClass().getResourceAsStream(name));
NameFinderME nameFinder = new NameFinderME(entityModel);
Span[] nameSpans = nameFinder.find(tokenizedQuestion);
for (Span span : nameSpans) {
if (span.getType().equals("dept")) {
deptList.add(span);
} else if (span.getType().equals("filter")) {
filterList.add(span);
} else if (span.getType().equals("calculation"){
calculationList.add(span);
}
}
Теперь проблема в том, что если вы вставите «что было в последнем мультфильме Багза Банни». вы получаете «Ошибки» в качестве отдела, «Банни» в качестве фильтра и «мультфильм» в качестве расчета.
Я предполагаю, что наши учебные вопросы похожи друг на друга, и теперь предполагается, что все, что следует за «что было», является отделом.
1. Верно ли это предположение и есть ли лучший способ обучения этих моделей?
2. Лучше всего разбить каждую сущность на собственную модель? Я попробовал это, и у меня было 105 модульных тестов, которые впоследствии провалились, поэтому я надеялся сначала попробовать что-нибудь попроще, лол.
Также я читал здесь несколько тем о пользовательских моделях NER, но большая часть того, что я нашел, это то, как их запустить. Также есть ветка о том, как не работают несколько моделей сущностей. Я забыл, где был пост. Я нашел, что добавление null для типа позволяет вам помечать несколько типов в одной и той же модели, и, похоже, это работает довольно хорошо.
tokenNameFinderModel = NameFinderME.train("en", null, sampleStream, TrainingParameters.defaultParams(), new TokenNameFinderFactory());
tokenNameFinderModel.serialize(modelOut);
Заранее спасибо за любую помощь!!




Наша конечная цель состояла в том, чтобы иметь возможность обучить модель определенным словам, которые мы классифицировали, и должны правильно классифицировать каждое слово независимо от структуры предложения. В OpenNLP мы не смогли этого сделать.
I'm guessing our training questions are to similar to each other and now it's assuming whatever follows "what was" is a department.
1. Is that a correct assumption and is there a better way of training these models?
Основываясь на моем тестировании и результатах, я пришел к выводу, что да, последовательность и структура слов играют роль. У меня нет никаких документов, подтверждающих это, хотя. Также я не могу найти ничего, чтобы обойти это с OpenNLP.
- Is the best bet to break each entity into it's own model?
Основываясь на опыте и тестировании, я решил, что отдельные модели, насколько это возможно, являются лучшим способом обучения. К сожалению, даже при таком подходе мы до сих пор не смогли достичь наших целей.
В конечном счете, что мы сделали, чтобы перейти на модели StanfordNLP NER. Вы по-прежнему можете выполнять пользовательские реализации на языке, специфичном для предметной области, и иметь возможность отключить последовательность в файле свойств:
usePrev=false
useNext=false
useDisjunctive=false
useSequences=false
usePrevSequences=false
Ссылка на пользовательский NER в StanfordNLP: Stanford CoreNLP: обучение собственного пользовательского тега NER