NLTK не может найти файл

У меня проблемы с 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'

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

Также см ошибка загрузки с использованием nltk.download ()

1

Другие решения

Я попробовал ваш код на моем сервере локальной машины PHP, и он правильно запускает Python с библиотеками NLTK.

Моя лучшая догадка:

  1. Проверьте, какой пользователь использует PHP, выполнив этот. Бег:

    echo exec('whoami');

работает для меня в среде Linux. Как правило, пользователь работает с PHP apache если вы используете веб-сервер Apache.

  1. Убедитесь, что пользователь, работающий с PHP, имеет права на чтение /root/nltk_data папку (или любую папку, в которую вы поместили данные NLTK).
0

По вопросам рекламы [email protected]