【问题标题】:Install nltk on Docker在 Docker 上安装 nltk
【发布时间】:2017-10-31 13:36:45
【问题描述】:

我是 docker 新手,我正在尝试在 docker 上安装一些 nltk 包 这是我的 docker 文件

FROM python:3-onbuild

RUN python -m libs.py

COPY start.sh /libs.py

COPY start.sh /start.sh

EXPOSE 8000

CMD ["/start.sh"]

这是我的 libs.py,其中包含要下载的 nltk 包

import nltk
nltk.data.path.append('./')
nltk.download('wordnet')
nltk.download('pros_cons')
nltk.download('snowball_data')
nltk.download('averaged_perceptron_tagger')
nltk.download('averaged_perceptron_tagger_ru')
nltk.download('punkt')
nltk.download('universal_tagset')
nltk.download('maxent_treebank_pos_tagger')
nltk.download('hmm_treebank_pos_tagger')
nltk.download('reuters')
nltk.download('treebank')
nltk.download('vader_lexicon')
nltk.download('porter_test')
nltk.download('rslp')

Docker Image 创建成功,但是当我尝试使用这些包时,它抛出了错误

LookupError: 
**********************************************************************
  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'
    - '/usr/local/nltk_data'
    - '/usr/local/lib/nltk_data'
    - ''
**********************************************************************

谁能说出为什么没有安装 nltk 软件包?谢谢

【问题讨论】:

    标签: python docker nltk dockerfile


    【解决方案1】:

    看起来您必须在 Docker 中创建一个用户。您应该尽量避免在 Docker 中成为 root(默认情况下)。

    不过你可以设置download_dir when using nltk.download():

    下载(自我, info_or_id=无, download_dir=无, 安静=假, 力=假, 前缀='[nltk_data]', halt_on_error=真, raise_on_error=False):

    如果没有为download_dir设置值,it will try to save it the default path

        # decide where we're going to save things to.
        if self._download_dir is None:
            self._download_dir = self.default_download_dir()
    

    更具体地说:https://github.com/nltk/nltk/blob/develop/nltk/downloader.py#L919

    def default_download_dir(self):
        """
        Return the directory to which packages will be downloaded by
        default.  This value can be overridden using the constructor,
        or on a case-by-case basis using the ``download_dir`` argument when
        calling ``download()``.
        On Windows, the default download directory is
        ``PYTHONHOME/lib/nltk``, where *PYTHONHOME* is the
        directory containing Python, e.g. ``C:\\Python25``.
        On all other platforms, the default directory is the first of
        the following which exists or which can be created with write
        permission: ``/usr/share/nltk_data``, ``/usr/local/share/nltk_data``,
        ``/usr/lib/nltk_data``, ``/usr/local/lib/nltk_data``, ``~/nltk_data``.
        """
    

    因此它将文件保存在/root/nltk_data/

    当您运行CMD ["/start.sh"] docker 映像时,您似乎正在访问/ 目录,因此您可能对/root/nltk_data 进行了一些权限设置。

    总之

    显式设置要下载nltk_data目录的路径:

    nltk.download('popular', download_dir='/path/to/nltk_data/')
    

    当运行一个新的python实例时,

    nltk.data.path.append('/path/to/nltk_data/')
    

    另请参阅: How to config nltk data directory from code?

    【讨论】:

    • 我添加了 download_dir='./libs_data/nltk_data/' 但它在解压缩包文件时给了我这个错误The command '/bin/sh -c python -m libs.py' returned a non-zero code: 1
    • Docker 不喜欢动态路径,给个静态路径吧。此外,建议在 docker 中创建用户,而不是使用 root。
    • 通过将nltk.data.path.append('/path/to/nltk') 添加到 django 应用程序的 settings.py 中,它对我有用。
    【解决方案2】:

    你必须在你的settings.py文件中设置你的nltk.data.path.append('/path/to/nltk_data'),过程是一样的

    libs.py 包含所有包的详细信息

    然后将其添加到您的 docker 文件中

    RUN pip install nltk
    
    RUN python nltk_pkg.py
    
    COPY start.sh /nltk_pkg.py
    
    COPY start.sh /start.sh
    

    它对我有用。

    【讨论】:

      猜你喜欢
      • 2018-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 2022-06-27
      相关资源
      最近更新 更多