Использование TfidfVectorizer с Punkt в облачной функции

Мое текущее понимание TfidfVectorizer требует запуска nltk.download("punkt") перед преобразованием входных данных, поскольку все токенизаторы по умолчанию доступны в punkt. В настоящее время, поскольку я использую TfidfVectorizer в своей облачной функции, я запускаю nltk.download("punkt") внутри контейнера облачной функции, который загружает punkt в /tmp. Моя проблема заключается в том, что я не могу гарантировать доступ к одному и тому же содержимому файловой системы для каждого вызова моей облачной функции Google, потому что «последующие вызовы одной и той же функции иногда будут выполняться в другом контейнере, поэтому они будут иметь разные /tmp монтирования . Таким образом, вы не можете использовать /tmp для связи между функциями" (из этот вопрос SO ). Это приводит к необходимости повторной загрузки punkt при каждом переключении контейнера, и это отображается в журналах моей облачной функции.

Я попытался создать токенизатор, десериализованный из english.pickle, который является частью punkt. Даже при передаче функции tokenize этого пользовательского токенизатора как tokenizer в TfidVectorizer преобразование входных данных позже заканчивается сбоем из-за отсутствия загрузки punkt.

Есть ли способ загрузить punkt в доступную память Python, чтобы он не сохранялся в файловой системе и не стирался при переключении контейнера? Похоже, мне нужно, чтобы punkt загружался в файловую систему независимо от того, передаю ли я пользовательский токенизатор или позволяю TfidfVectorizer выбрать свой собственный токенизатор по умолчанию.


person Mario Ishac    schedule 26.01.2020    source источник


Ответы (1)


Конечно, вы можете загружать файлы в /tmp и ожидать их там для будущих вызовов функций, использующих тот же экземпляр сервера. У вас просто нет гарантии, какой экземпляр сервера будет использоваться для обработки любого заданного события. Экземпляры сервера будут повторно использоваться по усмотрению Cloud Functions, но он также может освободить экземпляр сервера без предупреждения.

Но что вы можете сделать, так это просто проверить, существует ли уже нужный вам файл из предыдущего выполнения, прежде чем что-либо делать. Если файл присутствует, загрузка не требуется — просто используйте файл. Если нет, то выполните загрузку.

person Doug Stevenson    schedule 26.01.2020