Skip to main content
 首页 » 编程设计

php之NLTK 找不到文件

2024年08月26日28落叶无声

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

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' 

请您参考如下方法:

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

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

解决方案:

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

此外,您使用的是过时的 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' 

为确保您拥有 postman :

$ 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()