Исправление пользовательской модели OpenNLP NER - PullRequest
0 голосов
/ 15 мая 2019

У нас есть инструмент для написания отчетов, к которому мы пытаемся добавить возможность поиска.По сути, пользователь сможет набрать вопрос и получить отчет на основе критериев в предложении.Мы пытаемся сделать это как можно более открытым, не требуя конкретной структуры предложений, поэтому мы решили попробовать 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);

Заранее спасибо за любую помощь!!

1 Ответ

0 голосов
/ 20 мая 2019

Нашей конечной целью было научить модели определенным словам, которые мы классифицировали, и правильно классифицировать каждое слово независимо от структуры предложения.В OpenNLP мы не смогли этого сделать.

Я предполагаю, что наши учебные вопросы похожи друг на друга, и теперь предполагается, что все, что следует за «тем, что было», является отделом.
1. Это правильное предположение и есть лилучший способ обучения этих моделей?

Основываясь на моих тестах и ​​результатах, я пришел к выводу, да последовательность и структура слов играет роль.У меня нет документации, подтверждающей это.Также я не могу найти что-нибудь, чтобы обойти это с OpenNLP.

Является ли лучшим вариантом разделить каждую сущность на ее собственную модель?

Основываясь на опыте и тестировании, я решаю, что отдельные модели, насколько это возможно, являются наилучшим способом.тренировать.К сожалению, мы до сих пор не смогли достичь наших целей даже при таком подходе.

В конечном счете, что мы сделали, чтобы перейти на модели NER StanfordNLP.Вы по-прежнему можете выполнять пользовательские реализации на языке, специфичном для домена, и иметь возможность отключить последовательность в файле свойств:

usePrev=false
useNext=false
useDisjunctive=false
useSequences=false
usePrevSequences=false

Справочник по пользовательскому NER в StanfordNLP: Stanford CoreNLP: обучение собственному пользовательскомуNER tagger

...