我遇到了一个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/ pythonimport 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
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模块
一个已经添加了错误日志
我很确定运行php ius的用户与从命令行运行的usee不同,但是我不知道如何检查它。
我已经在我的PHP本地计算机服务器上尝试了您的代码,它可以正确地运行带有nltk库的python。
我正在centos vps上运行它,php 5.3.3。 你用什么?
Resource ... not found错误有两个原因:
nltk_data的路径设置不正确或未下载nltk_data
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代码,但您的nltk_data没有更新。
对于原因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
另请参阅使用nltk.download()的下载错误
没有任何区别
您的nltk版本是什么?
我使用2.0.4,因为似乎3.0不适用于python 2.7.3
nltk从py2.6-py2.7支持。如果您发现nltk的任何部分不支持py2.7.3,可以在github上提出问题,开发人员将尽快解决。
您是否尝试过删除nltk_data目录并重新下载它?
会尝试类似的东西。也许要手动加载文件。
如果不尝试使用nltk.data.append技巧,它将起作用。
希望会。我重做服务器安装,所以现在我以不同的方式使用python安装,但问题仍然存在。我会使用3.0版本,但它根本不起作用,甚至连字解析器也不能。
sudo python -m nltk.downloader -d / usr / share / nltk_data所有这些解决了我的问题,谢谢
我已经在我的PHP本地计算机服务器上尝试了您的代码,并且该代码正确地运行了带有NLTK库的python。
我最好的猜测是:
通过执行此操作,检查哪个用户正在运行PHP。正在运行:
echo exec('whoami');
在Linux环境下为我工作。如果您使用的是Apache Web服务器,则通常运行php的用户为apache。
检查运行PHP的用户是否具有对/root/nltk_data文件夹(或放置NLTK数据的文件夹)的读取权限。
2)你的意思是chmod?
1)用户是Apache,我刚刚检查过。
实际上,我现在不怎么检查2,因为我只能在根文件夹中执行" ls -l"命令。我将nltk_data文件夹设为777。
777可以使用吗?
不,不是。谁知道为什么:)
只是注意到您只创建了777文件夹。您应该将文件夹及其中的所有内容制作为777。在目录上执行chmod -R 777。
刚检查完-一样。