如何测试运行我的代码的机器上是否已安装nltk资源?

Zak*_*kum 16 python nlp nltk

我刚开始我的第一个NLTK项目,并对正确的设置感到困惑.我需要几个资源,如Punkt Tokenizer和maxent pos tagger.我自己使用GUI下载它们nltk.download().对于我的合作者,我当然希望自动下载这些内容.我没有在文档中找到任何惯用代码.

我应该把nltk.data.load('tokenizers/punkt/english.pickle')它们放进代码中吗?这是在每次运行脚本时下载资源吗?我是否向用户(即我的共同开发者)提供了有关下载内容以及为什么需要这么长时间的反馈?那里必须有适合工作的装备,对吗?:)

//编辑要探讨我的问题:
如何测试运行我的代码的机器上是否已安装nltk资源(如Punkt Tokenizer),如果不是,则安装它?

alv*_*vas 18

您可以使用该nltk.data.find()功能,请参阅https://github.com/nltk/nltk/blob/develop/nltk/data.py:

>>> import nltk
>>> nltk.data.find('tokenizers/punkt.zip')
ZipFilePathPointer(u'/home/alvas/nltk_data/tokenizers/punkt.zip', u'')
Run Code Online (Sandbox Code Playgroud)

当资源不可用时,您会发现错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/nltk-3.0a3-py2.7.egg/nltk/data.py", line 615, in find
    raise LookupError(resource_not_found)
LookupError: 
**********************************************************************
  Resource u'punkt.zip' not found.  Please use the NLTK Downloader
  to obtain the resource:  >>> nltk.download()
  Searched in:
    - '/home/alvas/nltk_data'
    - '/usr/share/nltk_data'
    - '/usr/local/share/nltk_data'
    - '/usr/lib/nltk_data'
    - '/usr/local/lib/nltk_data'
**********************************************************************
Run Code Online (Sandbox Code Playgroud)

最有可能的是,您希望执行类似的操作以确保您的协作者拥有该包:

>>> try:
...     nltk.data.find('tokenizers/punkt')
... except LookupError:
...     nltk.download('punkt')
... 
[nltk_data] Downloading package punkt to /home/alvas/nltk_data...
[nltk_data]   Package punkt is already up-to-date!
True
Run Code Online (Sandbox Code Playgroud)

  • 没有'.zip'扩展名,对我有用 (3认同)
  • 这种方法有一个陷阱,即您无法可靠地使用它在非交互式应用程序中安装数据。Python 将在没有下载资源的情况下导入 nltk。如果您通过 LookupError 发现这一事实,然后尝试运行“nltk.download”,然后重新导入相关的 nltk 模块,Python 将认为 nltk 已经导入,并且不会重新导入任何内容。因此,即使您已经下载了新的数据工件,导入的 NLTK 版本仍将是在无法访问它的情况下启动的版本。 (2认同)
  • 例如,您经常需要“from nltk import wordnet”,但只有在导入 nltk 之前下载了 wordnet 时,nltk 的这个子模块才存在。如果你“尝试”..“除了”此导入并检查“LookupError”,然后动态运行“nltk.download('wordnet')”,它确实会安装wordnet的数据,但重新运行“from nltk import” wordnet` 仍然会失败(被引用的 `nltk` 模块仍然是启动时没有 `wordnet` 子模块的模块)。 (2认同)