【问题标题】:How do I test whether an nltk resource is already installed on the machine running my code?如何测试运行我的代码的机器上是否已经安装了 nltk 资源?
【发布时间】:2014-05-16 21:03:43
【问题描述】:

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

我是否应该将nltk.data.load('tokenizers/punkt/english.pickle') 之类的东西放入代码中?每次运行脚本时都会下载资源吗?我是否要向用户(即我的共同开发者)提供反馈,说明正在下载的内容以及为什么需要这么长时间?必须有设备可以完成这项工作,对吧? :)

//编辑为了解释我的问题:
我如何测试运行我的代码的机器上是否已经安装了一个 nltk 资源(如 Punkt Tokenizer),如果没有安装它?

【问题讨论】:

  • 我无法确定您的要求。演示您当前方法的简洁、可测试的代码示例将非常有帮助。
  • 让我重新构建问题:如何测试运行我的代码的机器上是否已经安装了 nltk 资源(如 Punkt Tokenizer),如果没有安装它?
  • 编辑您的问题以匹配您的评论。将简短的问题放在 cmets 中可能会被忽视

标签: python nlp nltk


【解决方案1】:

可以使用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'')

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

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'
**********************************************************************

您很可能希望这样做以确保您的合作者拥有该软件包:

>>> 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

【讨论】:

  • 这种方法存在一个陷阱,即您不能可靠地使用它在非交互式应用程序中安装数据。 Python 将导入 nltk 没有下载的资源。如果您通过 LookupError 发现这一事实,然后尝试运行nltk.download,然后重新导入相关的 nltk 模块,Python 将认为 nltk 已经导入并且不会重新导入任何内容。因此,即使您已经下载了新的数据工件,导入的 NLTK 版本仍将是启动时无法访问它的版本。
  • 例如,你经常需要from nltk import wordnet,但只有在导入nltk之前下载了wordnet,nltk的这个子模块才存在。如果你try..except这个导入并检查LookupError然后动态运行nltk.download('wordnet'),它确实会为wordnet安装数据,但是重新运行from nltk import wordnet仍然会失败(nltk被引用的模块仍然是启动时没有wordnet 子模块的模块)。
  • @ely 那有什么办法呢?
  • PEP8 建议将所有导入设置在文件顶部。在这种情况下,无论如何,似乎我们可以避免陷阱只运行第一个“import nltk”,然后是 try-except 子句,最后是特定的导入,如“from nltk import ...”。无论如何,这似乎有点解决方法。
  • 或者可能先“从nltk导入数据,下载”,然后在try-except环绕“import nltk”之后?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
相关资源
最近更新 更多