У нас есть инструмент для написания отчетов, к которому мы пытаемся добавить возможность поиска.По сути, пользователь сможет набрать вопрос и получить отчет на основе критериев в предложении.Мы пытаемся сделать это как можно более открытым, не требуя конкретной структуры предложений, поэтому мы решили попробовать OpenNLP NER.
Примером может быть:
"чтоПосещаемость искусств в прошлом квартале "
С меткой:
what was <START:dept> Arts <END> <START:filter> attendance <END> last <START:calc> quarter <END>
Мы пытались придумать много разных вариантов вопросов с разными отделами, фильтрами и т. д. Мывсе еще не на 15k, только на 14.6k, поэтому все еще работаем в этом направлении.
Что касается анализа вопроса, то это его начало:
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);
}
}
Проблема теперь в том, если вы поставитев «Что было в последнем мультфильме Bugs Bunny» вы получаете «Bugs» в качестве отдела, «Bunny» в качестве фильтра и «Cartoon» в качестве расчета.
Я предполагаю, что наши учебные вопросыпохожи друг на друга, и теперь предполагается, что все, что следует за «тем, что было», является отделом.
1. Это правильное предположение и есть ли лучший способ обучения этих моделей?
2. Является ли лучшим вариантом дляразбить каждую сущность на ее собственную модель? ЯЯ попробовал это, и у меня было 105 модульных тестов, которые впоследствии не сработали, так что, в надежде сначала попробовать что-нибудь попроще, смеется.
Также я прочитал здесь несколько тем о пользовательских моделях NER, но большинство из того, что я нашел, этокак начать один.Также есть ветка о том, как не работают несколько моделей сущностей.Я забыл, где был пост, в котором я обнаружил, что установка нулевого значения для типа позволяет помечать несколько типов в одной и той же модели, и это, кажется, работает довольно хорошо.
tokenNameFinderModel = NameFinderME.train("en", null, sampleStream, TrainingParameters.defaultParams(), new TokenNameFinderFactory());
tokenNameFinderModel.serialize(modelOut);
Заранее спасибо за любую помощь!!