Ускорение POSTagLP OpenNLP при использовании его для нескольких текстов - PullRequest
2 голосов
/ 06 декабря 2010

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

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

posTagger = new POSTaggerME(new POSModel(new FileInputStream(new File(modelDir + "/en-pos-maxent.bin"))));
tokenizer = new TokenizerME(new TokenizerModel(new FileInputStream(new File(modelDir + "/en-token.bin"))));
// ...
String[] tokens = tokenizer.tokenize(text);
String[] tags = posTagger.tag(tokens);

Это связано с тем, что этот код находится не в области действия самого веб-сервера, а в «обработчике» с жизненным циклом, включающим обработку только одного конкретного запроса. У меня вопрос: Как я могу добиться загрузки файлов только один раз? (я не хочу тратить 10 секунд на ожидание загрузки моделей и последующее их использование только в течение 200 мс.)

Моя первая идея состояла в том, чтобы сериализовать POSTaggerME ( TokenizerME соответственно) и десериализовать его каждый раз, когда мне это нужно, используя встроенный механизм Java. К сожалению, это не работает - это вызывает исключение. (Я сериализирую классификатор из WEKA-toolkit, который классифицирует моих кандидатов в конце, чтобы не создавать (или обучать) классификатор каждый раз. Поэтому я думаю, что это может быть применимо и к POSTaggeME. К сожалению, это не тот случай.)

В случае с Tokenizer я мог бы сослаться на простой WhitespaceTokenizer , который является худшим решением, но вовсе не так плох:

tokenizer = WhitespaceTokenizer.INSTANCE;

Но я не вижу этой опции для надежного POSTagger.

1 Ответ

1 голос
/ 06 декабря 2010

Просто оберните ваш конвейер токенизации / POS-тегирования в singleton .

Если базовый код OpenNLP не является поточно-ориентированным, поместите вызовы в блоки синхронизации, например:

// the singletons tokenization/POS-tagging pipeline 
String[] tokens;
synchronized(tokenizer) { 
   tokens = tokenizer.tokenize(text);
}
String[] tags;
synchronized(posTagger) { 
   tags = posTagger.tag(tokens);
}
...