Как я могу запустить NLTK на App Engine или Kubernetes? - PullRequest
0 голосов
/ 14 ноября 2018

Я занят написанием модели для прогнозирования типов текста, таких как имена или даты, в документе PDF.

Модель использует nltk.word_tokenize и nltk.pos_tag

Когда я пытаюсь использовать это в Kubernetes на Google Cloud Platform, я получаю следующую ошибку:

    from nltk.tag import pos_tag
    from nltk.tokenize import word_tokenize

    tokenized_word = tokenize_word('x')
    tagges_word = pos_tag(['x'])

StackTrace:

      Resource punkt not found.
      Please use the NLTK Downloader to obtain the resource:

      >>> import nltk
      >>> nltk.download('punkt')

      Searched in:
      - '/root/nltk_data'
      - '/usr/share/nltk_data'
      - '/usr/local/share/nltk_data'
      - '/usr/lib/nltk_data'
      - '/usr/local/lib/nltk_data'
      - '/env/nltk_data'
      - '/env/share/nltk_data'
      - '/env/lib/nltk_data'
      - ''

Но очевидно, что загрузка его на локальное устройство не решит проблему, если он должен работать в Kubernetes, и у нас еще не настроена NFS в проекте.

1 Ответ

0 голосов
/ 14 ноября 2018

Как я решил эту проблему, добавил загрузку пакетов nltk в функцию init

import logging
import nltk
from nltk import word_tokenize, pos_tag

LOGGER = logging.getLogger(__name__)

LOGGER.info('Catching broad nltk errors')
DOWNLOAD_DIR = '/usr/lib/nltk_data'
LOGGER.info(f'Saving files to {DOWNLOAD_DIR} ')

try:
    tokenized = word_tokenize('x')
    LOGGER.info(f'Tokenized word: {tokenized}')
except Exception as err:
    LOGGER.info(f'NLTK dependencies not downloaded: {err}')
    try:
        nltk.download('punkt', download_dir=DOWNLOAD_DIR)
    except Exception as e:
        LOGGER.info(f'Error occurred while downloading file: {e}')

try:
    tagged_word = pos_tag(['x'])
    LOGGER.info(f'Tagged word: {tagged_word}')
except Exception as err:
    LOGGER.info(f'NLTK dependencies not downloaded: {err}')
    try:
        nltk.download('averaged_perceptron_tagger', download_dir=DOWNLOAD_DIR)
    except Exception as e:
        LOGGER.info(f'Error occurred while downloading file: {e}')

Я понимаю, что количество выражений try catch не требуется. Я также указываю каталог для загрузки, потому что кажется, что если вы этого не сделаете, он загружает и распаковывает 'tagger' в / usr / lib, а nltk не ищет там файлы.

Это будет загружать файлы при каждом первом запуске на новом модуле, и файлы будут сохраняться до тех пор, пока модуль не умрет.

Ошибка была устранена на множестве состояний без Kubernetes, что означает, что это может иметь дело с непостоянными приложениями, такими как App Engine, но не будет наиболее эффективным, потому что его нужно будет загружать каждый раз, когда экземпляр запускается.

...