【问题标题】:NLTK cannot find the fileNLTK 找不到文件
【发布时间】:2015-02-28 02:37:34
【问题描述】:

我遇到了一个 php 脚本的问题,它说它找不到文件 /root/nltk_data/tokenizers/punkt/english.pickle 。但是我确认文件在这里。 II 多次下载整个数据集)

php 脚本实际上运行了一个 python 脚本,而 nltk(一个 python 模块)说它找不到 /root/nltk_data/tokenizers/punkt/english.pickle

$dir = dirname(__FILE__);
$command =  "/usr/bin/python ". $dir . "/test.py";
exec($command, $output);

另一方面,当我从命令行运行 python 脚本时,它工作得非常好并且能够访问该文件。

python test.py

是否可以启用 php 来查看这些文件?我 chmod 777 文件,但这没有帮助。

脚本包含:

#!/usr/bin/env/ python
import  nltk
try:
    tokens = nltk.word_tokenize("I like apples.")
    tagged = nltk.pos_tag(tokens)
    print "OK!"
    #print ' * '.join(tokens)
except Exception:
    print "error!"
    pass

错误日志:

Traceback (most recent call last):
File "/var/zpanel/hostdata/zadmin/public_html/my_domain_com/test.py", line 39, in <module>
tagged = nltk.pos_tag(tokens)
File "/usr/local/lib/python2.7/site-packages/nltk-2.0.4-py2.7.egg/nltk/tag/__init__.py", line   99, in pos_tag
tagger = load(_POS_TAGGER)
File "/usr/local/lib/python2.7/site-packages/nltk-2.0.4-py2.7.egg/nltk/data.py", line 605, in load
resource_val = pickle.load(_open(resource_url))
File "/usr/local/lib/python2.7/site-packages/nltk-2.0.4-py2.7.egg/nltk/data.py", line 686, in _open
return find(path).open()
File "/usr/local/lib/python2.7/site-packages/nltk-2.0.4-py2.7.egg/nltk/data.py", line 467, in find
raise LookupError(resource_not_found)
LookupError:
Resource taggers/maxent_treebank_pos_tagger/english.pickle not found. Please use the NLTK Downloader to obtain the resource:
>>> nltk.download()
Searched in:
- '/root/nltk_data'
- '/usr/share/nltk_data'
- '/usr/local/share/nltk_data'
- '/usr/lib/nltk_data'
- '/usr/local/lib/nltk_data'

【问题讨论】:

  • 请发布完整的回溯错误消息。 php 脚本是否以与从命令行运行时不同的用户身份运行?
  • 回显$command 变量并检查它是否正确。
  • 是的 $command 是正确的,它适用于除 nltk 以外的其他 python 模块
  • A已添加错误日志
  • 我很确定运行 php ius 的用户与从命令行运行的 usee 不同,但我不知道如何检查它。

标签: php python nlp nltk


【解决方案1】:

Resource ... not found 错误有两个原因:

  1. nltk_data 的路径设置不正确或nltk_data 未下载
  2. nltk_data 目录已过时。

解决方案:

您的问题是因为您的原因2。所以最简单的方法是删除nltk_data目录中的所有内容,然后使用python -c "import nltk; nltk.download('all')"重新下载所有内容。

另外,您使用的是过时的 nltk 代码,因此我建议您更新到 NLTK 版本 3.x,因为从 NLTK 2.x 到 NLTK 3.x 有重大变化

问题:

你的nltk_data目录的数据结构是这样的:

nltk_data/tokenizers/punkt/english.pickle

但最新的nltk_data 是:

nltk_data/taggers/maxent_treebank_pos_tagger/english.pickle

这表明您的 nltk_data 未更新,尽管您使用的是更高版本的 NLTK 代码。


原因 1,见下文

这些路径上没有nltk_data 目录:

- '/root/nltk_data'
- '/usr/share/nltk_data'
- '/usr/local/share/nltk_data'
- '/usr/lib/nltk_data'
- '/usr/local/lib/nltk_data'

为确保您拥有邮递员:

$ python
>>> import nltk
>>> nltk.download('maxent_treebank_pos_tagger')
[nltk_data] Downloading package maxent_treebank_pos_tagger to
[nltk_data]     /home/alvas/nltk_data...
[nltk_data]   Package maxent_treebank_pos_tagger is already up-to-
[nltk_data]       date!
True

现在您将看到 nltk 将您的数据保存在哪里,对我来说,它是 /home/alvas/nltk_data

要知道 nltk 搜索目录的路径:

$ python
>>> import nltk
>>> nltk.data.path
['/home/alvas/nltk_data', '/usr/share/nltk_data', '/usr/local/share/nltk_data', '/usr/lib/nltk_data', '/usr/local/lib/nltk_data']

您也可以手动查找nltk_data 目录在系统上的保存位置,并将其添加到nltk.data.path,例如如果 nltk_data 保存在/home/alvas/work_stuff/:

>>> nltk.data.path.append(`/home/alvas/work_stuff/`)

为确保您进行集中安装,请执行以下操作:

sudo python -m nltk.downloader -d /usr/share/nltk_data all

另见downloading error using nltk.download()

【讨论】:

  • 没有任何区别
  • 你的 nltk 版本是多少?
  • 我使用 2.0.4 是因为 3.0 似乎不适用于 python 2.7.3
  • nltk 支持从 py2.6-py2.7。如果您发现 nltk 的任何部分不支持 py2.7.3,您能否帮助在 github 中提出问题,开发人员会尽快解决。
  • 您是否尝试过删除nltk_data目录并重新下载?
【解决方案2】:

我已经在我的 PHP 本地机器服务器上尝试了你的代码,它正确地运行了带有 NLTK 库的 python。

我的最佳猜测是:

  1. 通过this 检查哪个用户正在运行 PHP。运行:

    echo exec('whoami');

在 linux 环境中为我工作。如果您使用的是 Apache Web 服务器,通常运行 php 的用户是 apache

  1. 检查运行 PHP 的用户是否具有对 /root/nltk_data 文件夹(或您放置 NLTK 数据的任何文件夹)的读取权限。

【讨论】:

  • 1) 用户是 apache,我刚刚检查过。
  • 实际上我现在不知道如何检查 2,因为我只能在根文件夹中执行“ls -l”命令。我制作了 nltk_data 文件夹 777。
  • 不,它没有。谁知道为什么:)
  • 刚刚注意到您只创建了文件夹 777。您应该将文件夹及其中的所有内容创建为 777。对目录执行 chmod -R 777。
猜你喜欢
  • 1970-01-01
  • 2011-11-16
  • 1970-01-01
  • 2014-11-08
  • 2015-11-11
  • 2015-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多