遍历/导航下载的nltk子包?

时间:2016-11-02 18:10:57

标签: python nltk

对于我正在运行的特定脚本,我需要从nltk安装以下软件包:

req_modules = ['punkt', 'stopwords', 'averaged_perceptron_tagger', 'maxent_ne_chunker']

我知道我可以检查是否已下载stopwords,如下所示:

import nltk
import os

if 'stopwords' in os.listdir(nltk.data.find('corpora')):
    print(True)
else:
    print(False)

对我来说,既然我之前使用过stopwords,那就行了。但是,我希望能够以编程方式检查是否安装了其他三个模块,最终使用类似:

if not all(m in os.listdir(nltk.data.find('models')) for m in ['punkt', 'averaged_perceptron_tagger', 'maxent_ne_chunker']:
    # download the ones that aren't already downloaded

nltk.download()访问的下载程序中,它们都被标记为模块。这应该是一个简单的查找,所以我尝试这样的东西将所有下载的子包放在一个列表中:

all_downloaded = os.listdir(nltk.data.find("corpora")) + os.listdir(nltk.data.find("models"))

但我得到了LookupError: Resource 'models' not found。如何搜索'models'中的nltk.data标签,就像我可以搜索'corpora'一样?我假设找到这些资源的命名约定是相同的,因为" corpora"与下面的下载程序中显示的标签名称相同

enter image description here

编辑:

考虑到下面的建议,我尝试了下面的代码,但仍然得到ImportError,即使我有异常处理。那里发生了什么?

req_modules = {'from nltk import punkt': 'punkt', 'from nltk.corpus import stopwords': 'stopwords',
               'from nltk import pos_tag': 'averaged_perceptron_tagger',
               'from nltk import ne_chunk': 'maxent_ne_chunker',
               'from nltk.stem.porter import PorterStemmer': 'porter_test'}

for m in req_modules:
    try:
        print("Trying: %s" % m)
        exec(m)
    except LookupError or ImportError:
        print("Tried: %s. Resource '%s' was not available and is being downloaded.\n" % (m, req_modules[m]))
        nltk.download(req_modules[m])

编辑2:

我让它工作,没关系。我将from nltk import porter_test更改为from nltk.stem.porter import PorterStemmer,事情顺利进行!

2 个答案:

答案 0 :(得分:1)

看起来您将nltk模块与模块使用的nltk_data目录中的文件混淆。安装nltk后,您将获得所有。各种模块和功能需要您使用下载程序获取nltk_data的数据文件。 (其中一些属于“模型”类别,可能与“模块”混淆?)要确定要检查的数据文件,可以在没有nltk_data文件夹的情况下运行相应的函数并检查错误信息。例如:

>>> nltk.ne_chunk("anything")
Traceback (most recent call last):
...
raise LookupError(resource_not_found)
LookupError: 
**********************************************************************
  Resource
  'chunkers/maxent_ne_chunker/PY3/english_ace_multiclass.pickle'   
  not found.  Please use the NLTK Downloader to obtain the 
  ...

但如果是我,我不会直接搞乱数据文件。相反,只需尝试所需的服务,看看它是否会引发错误:

 try:
     nltk.ne_chunk([])
 except LookupError:
     nltk.download("maxent_ne_chunker")

答案 1 :(得分:0)

我有同样的错误。

nltk.download("maxent_ne_chunker") 

在我的/Users/../nltk_data文件夹中给我拉链文件我解压缩后它工作正常。