В настоящее время я работаю над инструментом извлечения ключевой фразы, который должен предоставлять предложения тегов для текстов или документов на веб-сайте. Поскольку я следую методу, предложенному в этой статье: Новый подход к извлечению ключевой фразы с использованием нейронных сетей Я использую 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.