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

问题描述 投票:0回答:3

我刚刚开始我的第一个 NLTK 项目,对正确的设置感到困惑。我需要一些资源,例如 Punkt Tokenizer 和 maxent pos tagger。我自己使用 GUI

nltk.download()
下载了它们。对于我的合作者,我当然希望这些东西能够自动下载。我在文档中没有找到任何惯用的代码。

我是否应该将

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

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

python nlp nltk
3个回答
45
投票

可以使用

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

3
投票

在 Somnath 评论之后,我发布了一个 try- except 解决方法的示例。这里我们默认搜索nltk数据中没有的comtrans模块。

from nltk.corpus import comtrans
from nltk import download

try:
    words = comtrans.words('alignment-en-fr.txt')
except LookupError:
    print('resource not found. Downloading now...')
    download('comtrans')
    words = comtrans.words('alignment-en-fr.txt')

0
投票

我想我会为此付出 2 美分,即使聚会有点晚了。

nltk 有两个功能:下载和下载器。

download() 已经包含检查包是否已下载且最新的逻辑:

from pathlib import Path
from nltk import download as nltk_download
from typing import List, Any
from nltk.downloader import Downloader
import logging

def download_nltk_data(
        list_of_resources: List[str],
        download_dir: Path,
) -> None:
    for resource in list_of_resources:
        nltk_download(
            info_or_id=resource,
            download_dir=download_dir,
            quiet=True, # Change this if you wanna suppress the message
        )

download_nltk_data(
    list_of_resources=[
        'stopwords',
        'punkt',
    ],
    download_dir=Path('./data/nltk/'),
)

输出:

[nltk_data] Downloading package stopwords to data\nltk...
[nltk_data]   Package stopwords is already up-to-date!
[nltk_data] Downloading package punkt to data\nltk...
[nltk_data]   Package punkt is already up-to-date!

如果你想抑制这种情况,你需要做的就是更改 Quiet=True 。

如果出于某种原因您想要更好地控制包,您可以使用 Downloader 类并扩展功能:

def check_package_exists(
    package_id: Any,
    download_dir: Path,
) -> bool:
    downloader = Downloader(download_dir=str(download_dir))
    return downloader.is_installed(package_id)

def download_nltk_data(
    list_of_resources: List[str],
    download_dir: Path,
) -> None:
    download_dir.mkdir(parents=True, exist_ok=True)
    downloader = Downloader(download_dir=str(download_dir))
    for resource in list_of_resources:
        if not check_package_exists(resource, download_dir):
            logging.debug(f'Downloading {resource} to {download_dir}')
            downloader.download(info_or_id=resource, quiet=True)
        else:
            logging.debug(f'{resource} already exists in {download_dir}')


download_nltk_data(
    list_of_resources=[
        'stopwords',
        'punkt',
    ],
    download_dir=Path('./data/nltk/'),
)

输出:

stopwords already exists in data\nltk
punkt already exists in data\nltk

或者类似的东西

© www.soinside.com 2019 - 2024. All rights reserved.