У меня проблемы с 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
ошибка:
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_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
Я попробовал ваш код на моем сервере локальной машины PHP, и он правильно запускает Python с библиотеками NLTK.
Моя лучшая догадка:
Проверьте, какой пользователь использует PHP, выполнив этот. Бег:
echo exec('whoami');
работает для меня в среде Linux. Как правило, пользователь работает с PHP apache
если вы используете веб-сервер Apache.
/root/nltk_data
папку (или любую папку, в которую вы поместили данные NLTK).