【问题标题】:Failed loading english.pickle with nltk.data.load使用 nltk.data.load 加载english.pickle 失败
【发布时间】:2011-06-19 12:38:33
【问题描述】:

尝试加载punkt 标记器时...

import nltk.data
tokenizer = nltk.data.load('nltk:tokenizers/punkt/english.pickle')

...LookupError 被提出:

> LookupError: 
>     *********************************************************************   
> Resource 'tokenizers/punkt/english.pickle' not found.  Please use the NLTK Downloader to obtain the resource: nltk.download().   Searched in:
>         - 'C:\\Users\\Martinos/nltk_data'
>         - 'C:\\nltk_data'
>         - 'D:\\nltk_data'
>         - 'E:\\nltk_data'
>         - 'E:\\Python26\\nltk_data'
>         - 'E:\\Python26\\lib\\nltk_data'
>         - 'C:\\Users\\Martinos\\AppData\\Roaming\\nltk_data'
>     **********************************************************************

【问题讨论】:

  • 你可以使用>>> nltk.download()下载pickle模型

标签: python jenkins nltk


【解决方案1】:

我遇到了同样的问题。进入 python shell 并输入:

>>> import nltk
>>> nltk.download()

然后会出现一个安装窗口。转到“模型”选项卡,然后从“标识符”列下选择“punkt”。然后单击下载,它将安装必要的文件。那么它应该可以工作了!

【讨论】:

  • 请注意,在某些版本中,没有模型选项卡,您可以转到“下载”并尝试获取包“punkt”或使用任何“列表”选项列出可用的包。
  • 它安装到我的主文件夹中的 nltk_data 目录中。我是否应该将此 punkt 目录复制到任何 nltk 库文件夹中。请帮助
  • 我不确定你的意思。 tokenizer = nltk.data.load('nltk:tokenizers/punkt/english.pickle') 然后应该可以工作,您可以像这样使用标记器:tokenizer.tokenize('The cat. The mat. It Sat.')。这里 nltk 尝试针对多个位置解析相对路径 tokenizers/punkt/english.pickle。例如。在 Windows 上,它在 %APPDATA%\nltk_data\tokenizers\punkt\english.pickleC:\nltk_data\tokenizers\punkt\english.pickle 中查找(对于 D: 和 E: 相同)。因此,如果您确保 punkt.zip 文件以存在这些位置之一的方式解压缩,它应该能够找到它。
  • 或者,将您的NLTK_DATA 环境变量设置为指向nltk_data 文件夹,以便%NLTK_DATA%\tokenizers\punkt\english.pickle 存在。
  • 如果在非 X-Window 系统上运行(例如通过ssh 连接),将没有 GUI 窗口,因此没有“模型”选项卡。
【解决方案2】:

您看到该错误的主要原因是 nltk 找不到 punkt 包。由于nltk套件的大小,安装时默认不会下载所有可用的包。

你可以像这样下载punkt包。

import nltk
nltk.download('punkt')

from nltk import word_tokenize,sent_tokenize

在更新版本的错误消息中也建议这样做:

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

如果您不向download 函数传递任何参数,它将下载所有包,即chunkersgrammarsmiscsentimenttaggerscorporahelpmodels, stemmers, tokenizers.

nltk.download()

上述函数将包保存到特定目录。您可以在此处从 cmets 找到该目录位置。 https://github.com/nltk/nltk/blob/67ad86524d42a3a86b1f5983868fd2990b59f1ba/nltk/downloader.py#L1051

【讨论】:

  • 它所做的只是下载所需的库以允许 nltk 进行任何标记化工作。
  • 如何使用分词器?
  • python -c "import nltk; nltk.download('punkt')" [nltk_data] Downloading package punkt to /home/my_user/nltk_data... [nltk_data] Error downloading 'punkt' from [nltk_data] <https://raw.githubusercontent.com/nltk/nltk_data/gh- [nltk_data] pages/packages/tokenizers/punkt.zip>: HTTP Error [nltk_data] 503: first byte timeout
【解决方案3】:

这就是刚才对我有用的方法:

# Do this in a separate python interpreter session, since you only have to do it once
import nltk
nltk.download('punkt')

# Do this in your ipython notebook or analysis script
from nltk.tokenize import word_tokenize

sentences = [
    "Mr. Green killed Colonel Mustard in the study with the candlestick. Mr. Green is not a very nice fellow.",
    "Professor Plum has a green plant in his study.",
    "Miss Scarlett watered Professor Plum's green plant while he was away from his office last week."
]

sentences_tokenized = []
for s in sentences:
    sentences_tokenized.append(word_tokenize(s))

sentences_tokenized 是一个标记列表的列表:

[['Mr.', 'Green', 'killed', 'Colonel', 'Mustard', 'in', 'the', 'study', 'with', 'the', 'candlestick', '.', 'Mr.', 'Green', 'is', 'not', 'a', 'very', 'nice', 'fellow', '.'],
['Professor', 'Plum', 'has', 'a', 'green', 'plant', 'in', 'his', 'study', '.'],
['Miss', 'Scarlett', 'watered', 'Professor', 'Plum', "'s", 'green', 'plant', 'while', 'he', 'was', 'away', 'from', 'his', 'office', 'last', 'week', '.']]

句子摘自示例ipython notebook accompanying the book "Mining the Social Web, 2nd Edition"

【讨论】:

    【解决方案4】:

    从 bash 命令行,运行:

    $ python -c "import nltk; nltk.download('punkt')"
    

    【讨论】:

    • 我得到 [nltk_data] 加载 punkt 时出错:HTTP 错误 405:不允许。
    • @user2478236 由于有时下载量非常大,GitHub 一直使用 HTTP 405 阻止下载器;见github.com/nltk/nltk/issues/1787
    • 为我工作,这会在我的主目录中创建文件夹 nltk_data 并将 punkt 保存到其中。我有 Fedora 27,Py3.6。
    【解决方案5】:

    这对我有用:

    >>> import nltk
    >>> nltk.download()
    

    在 windows 中,您还将获得 nltk 下载器

    【讨论】:

      【解决方案6】:

      简单的nltk.download() 不会解决这个问题。我尝试了以下方法,它对我有用:

      nltk 文件夹中创建一个tokenizers 文件夹并将您的punkt 文件夹复制到tokenizers 文件夹中。

      这行得通。!文件夹结构需要如图!1

      【讨论】:

      • 这对我有用,在我的情况下,我无法通过 nltk.download 下载...所以我从 nltk.org/nltk_data 手动下载了文件并创建了一个文件夹 c:/nltk_data/tokenizers/ punkt 和我复制了这个位置的所有文件
      【解决方案7】:

      nltk 有其预训练的分词器模型。模型正在从内部预定义的 Web 源下载并存储在已安装的 nltk 包的路径中,同时执行以下可能的函数调用。

      例如1 tokenizer = nltk.data.load('nltk:tokenizers/punkt/english.pickle')

      例如2 nltk.download('punkt')

      如果您在代码中调用上述语句,请确保您有没有任何防火墙保护的互联网连接。

      我想分享一些更好的alter-net方法来解决上述问题,并有更深入的理解。

      请按照以下步骤使用 nltk 享受英语单词标记化。

      第 1 步:首先按照 web 路径下载“english.pickle”模型。

      转到链接“http://www.nltk.org/nltk_data/”并在选项“107. Punkt Tokenizer Models”处单击“下载”

      第二步:解压下载的“punkt.zip”文件,从中找到“english.pickle”文件,放入C盘。

      第3步:复制粘贴以下代码并执行。

      from nltk.data import load
      from nltk.tokenize.treebank import TreebankWordTokenizer
      
      sentences = [
          "Mr. Green killed Colonel Mustard in the study with the candlestick. Mr. Green is not a very nice fellow.",
          "Professor Plum has a green plant in his study.",
          "Miss Scarlett watered Professor Plum's green plant while he was away from his office last week."
      ]
      
      tokenizer = load('file:C:/english.pickle')
      treebank_word_tokenize = TreebankWordTokenizer().tokenize
      
      wordToken = []
      for sent in sentences:
          subSentToken = []
          for subSent in tokenizer.tokenize(sent):
              subSentToken.extend([token for token in treebank_word_tokenize(subSent)])
      
          wordToken.append(subSentToken)
      
      for token in wordToken:
          print token
      

      如果您遇到任何问题,请告诉我

      【讨论】:

      • 如果你在一个非常激进的防火墙后面,这个答案真的很好。
      【解决方案8】:

      在 Jenkins 上,可以通过在 Build 选项卡下的 Virtualenv Builder 中添加以下类似代码来解决此问题:

      python -m nltk.downloader punkt

      【讨论】:

        【解决方案9】:

        在 Spyder 中,转到您的活动 shell 并使用以下 2 个命令下载 nltk。 导入 nltk nltk.download() 然后你应该会看到如下打开的 NLTK 下载器窗口,转到此窗口中的“模型”选项卡,然后单击“punkt”并下载“punkt”

        【讨论】:

          【解决方案10】:

          当我尝试在 nltk 中进行 pos 标记时遇到了这个问题。 我正确的方法是创建一个新目录以及名为“taggers”的语料库目录,并在目录标记器中复制 max_pos_tagger。
          希望它也适合你。祝你好运!!!。

          【讨论】:

            【解决方案11】:

            我在使用分配的文件夹进行多次下载时遇到了类似的问题,我不得不手动附加数据路径:

            单次下载,可实现如下(作品)

            import os as _os
            from nltk.corpus import stopwords
            from nltk import download as nltk_download
            
            nltk_download('stopwords', download_dir=_os.path.join(get_project_root_path(), 'temp'), raise_on_error=True)
            
            stop_words: list = stopwords.words('english')
            
            

            此代码有效,这意味着 nltk 会记住下载功能中传递的下载路径。在其他方面,如果我下载后续包,我会收到用户描述的类似错误:

            多次下载引发错误:

            import os as _os
            
            from nltk.corpus import stopwords
            from nltk.tokenize import word_tokenize
            
            from nltk import download as nltk_download
            
            nltk_download(['stopwords', 'punkt'], download_dir=_os.path.join(get_project_root_path(), 'temp'), raise_on_error=True)
            
            print(stopwords.words('english'))
            print(word_tokenize("I am trying to find the download path 99."))
            
            
            

            错误:

            找不到资源punkt。 请使用 NLTK 下载器获取资源:

            导入 nltk nltk.download('punkt')

            现在,如果我将 ntlk 数据路径附加到我的下载路径中,它可以工作:

            import os as _os
            
            from nltk.corpus import stopwords
            from nltk.tokenize import word_tokenize
            
            from nltk import download as nltk_download
            from nltk.data import path as nltk_path
            
            
            nltk_path.append( _os.path.join(get_project_root_path(), 'temp'))
            
            
            nltk_download(['stopwords', 'punkt'], download_dir=_os.path.join(get_project_root_path(), 'temp'), raise_on_error=True)
            
            print(stopwords.words('english'))
            print(word_tokenize("I am trying to find the download path 99."))
            
            

            这有效...不确定为什么在一种情况下有效,但在另一种情况下无效,但错误消息似乎暗示它不会第二次检入下载文件夹。 注意:使用 windows8.1/python3.7/nltk3.5

            【讨论】:

            • 什么是get_project_root_path()。这个函数在哪里定义的?
            • 只是一个返回项目根路径的函数,你可以替换成你自己的文件夹路径。
            【解决方案12】:

            Python-3.6 我可以在回溯中看到建议。这很有帮助。 因此我会说你们要注意你得到的错误,大多数时候答案都在那个问题之内;)。

            然后按照这里其他人的建议,要么使用 python 终端,要么使用python -c "import nltk; nltk.download('wordnet')" 之类的命令,我们可以即时安装它们。 您只需要运行该命令一次,然后它将数据本地保存在您的主目录中。

            【讨论】:

              【解决方案13】:

              你只需要去python控制台输入->

              import nltk
              

              按回车键并重新输入->

              nltk.download()
              

              然后会出现一个界面。只需搜索下载按钮并按下它。它将安装所有必需的项目并且需要时间。给点时间,然后再试一次。你的问题会得到解决的

              【讨论】:

              【解决方案14】:

              检查您是否拥有所有 NLTK 库。

              【讨论】:

                【解决方案15】:

                punkt tokenizers 数据非常大,超过 35 MB,如果像我一样在资源有限的环境(例如 lambda)中运行 nltk,这可能会很重要。

                如果您只需要一个或几个语言标记器,您可以通过仅包含那些语言 .pickle 文件来大幅减少数据大小。

                如果您只需要支持英语,那么您的 nltk 数据大小可以减少到 407 KB(对于 python 3 版本)。

                步骤

                1. 下载nltk punkt数据:https://raw.githubusercontent.com/nltk/nltk_data/gh-pages/packages/tokenizers/punkt.zip
                2. 在您的环境中的某处创建文件夹:nltk_data/tokenizers/punkt,如果使用 python 3 添加另一个文件夹 PY3,以便您的新目录结构看起来像 nltk_data/tokenizers/punkt/PY3。就我而言,我在项目的根目录下创建了这些文件夹。
                3. 解压 zip 并将您想要支持的语言的 .pickle 文件移动到您刚刚创建的 punkt 文件夹中。 注意:Python 3 用户应使用 PY3 文件夹中的泡菜。 加载您的语言文件后,它应类似于:example-folder-stucture
                4. 现在您只需将nltk_data 文件夹添加到搜索路径,假设您的数据不在pre-defined search paths 之一中。您可以使用环境变量NLTK_DATA='path/to/your/nltk_data' 添加数据。您还可以通过以下方式在 python 运行时添加自定义路径:
                from nltk import data
                data.path += ['/path/to/your/nltk_data']
                

                注意:如果您不需要在运行时加载数据或将数据与您的代码捆绑在一起,最好在built-in locations that nltk looks for 创建您的nltk_data 文件夹。

                【讨论】:

                  【解决方案16】:

                  nltk.download() 不会解决这个问题。我尝试了以下方法,它对我有用:

                  '...AppData\Roaming\nltk_data\tokenizers'文件夹中,将下载的punkt.zip文件夹解压到同一位置。

                  【讨论】:

                    【解决方案17】:

                    只需添加下面给出的两行:-

                    import nltk
                    nltk.download('punkt')
                    

                    【讨论】:

                      【解决方案18】:

                      如果上述所有策略都不起作用(对我来说就是这种情况),只需运行以下代码:

                      import nltk.data
                      tokenizer = nltk.data.load('nltk:tokenizers/punkt/english.pickle')
                      

                      我一定因此浪费了时间,而这段代码似乎解决了我的问题。

                      参考:

                      https://www.nltk.org/howto/data.html

                      【讨论】:

                        猜你喜欢
                        • 2017-01-16
                        • 2013-11-16
                        • 2012-03-01
                        • 2016-12-31
                        • 2017-10-20
                        • 2017-01-04
                        • 2018-04-07
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多