python - instalar - nltk no agrega $ NLTK_DATA a la ruta de búsqueda?
nltk python docs (2)
En Linux, he configurado env var $ NLTK_DATA (''/ home / user / data / nltk''), y la prueba de soplo funciona como se esperaba
>>> from nltk.corpus import brown
>>> brown.words()
[''The'', ''Fulton'', ''County'', ''Grand'', ''Jury'', ''said'', ...]
pero cuando ejecuto otro script de Python, obtuve:
LookupError:
**********************************************************************
Resource u''tokenizers/punkt/english.pickle'' not found. Please
use the NLTK Downloader to obtain the resource: >>>
nltk.download()
Searched in:
- ''/home/user/nltk_data''
- ''/usr/share/nltk_data''
- ''/usr/local/share/nltk_data''
- ''/usr/lib/nltk_data''
- ''/usr/local/lib/nltk_data''
- u''''
Como podemos ver, nltk no agrega $ NLTK_DATA a la ruta de búsqueda, después de agregar el directorio NLTK_DATA manualmente:
nltk.data.path.append("/NLTK_DATA_DIR");
el script se ejecuta como se esperaba, la pregunta es:
¿Cómo hacer que nltk agregue $ NLTK_DATA a su ruta de búsqueda automáticamente?
Si es alguien que desea instalar los datos NLTK en un entorno conda, y no desea especificar la ubicación de los datos en cada secuencia de comandos, o exportar la variable de entorno, debe hacer lo siguiente:
- Active su entorno de conda deseado.
-
Imprima
sys.prefix
dentro de su entorno conda y copie esta ruta (digamos/home/dickens/envs/nltk_env
. -
Ejecute
nltk.download()
dentro del entorno conda, seleccione sus paquetes deseados y agregue/share/nltk_data
a su ruta desde arriba como la ubicación de descarga. Por ejemplo, en nuestro caso, se convertirá en/home/dickens/envs/nltk_env/share/nltk_data
. - ¡Ahora estás listo para irte!
Si no desea establecer $ NLTK_DATA antes de ejecutar sus scripts, puede hacerlo dentro de los scripts de python con:
import nltk
nltk.path.append(''/home/alvas/some_path/nltk_data/'')
Por ejemplo, vamos a mover el
nltk_data
a una ruta no estándar que NLTK no encontrará automáticamente:
alvas@ubi:~$ ls nltk_data/
chunkers corpora grammars help misc models stemmers taggers tokenizers
alvas@ubi:~$ mkdir some_path
alvas@ubi:~$ mv nltk_data/ some_path/
alvas@ubi:~$ ls nltk_data/
ls: cannot access nltk_data/: No such file or directory
alvas@ubi:~$ ls some_path/nltk_data/
chunkers corpora grammars help misc models stemmers taggers tokenizers
Ahora, usamos el hack
nltk.path.append()
:
alvas@ubi:~$ python
>>> import os
>>> import nltk
>>> nltk.path.append(''/home/alvas/some_path/nltk_data/'')
>>> nltk.pos_tag(''this is a foo bar''.split())
[(''this'', ''DT''), (''is'', ''VBZ''), (''a'', ''DT''), (''foo'', ''JJ''), (''bar'', ''NN'')]
>>> nltk.data
<module ''nltk.data'' from ''/usr/local/lib/python2.7/dist-packages/nltk/data.pyc''>
>>> nltk.data.path
[''/home/alvas/some_path/nltk_data/'', ''/home/alvas/nltk_data'', ''/usr/share/nltk_data'', ''/usr/local/share/nltk_data'', ''/usr/lib/nltk_data'', ''/usr/local/lib/nltk_data'']
>>> exit()
Movámoslo hacia atrás y veamos si funciona:
alvas@ubi:~$ ls nltk_data
ls: cannot access nltk_data: No such file or directory
alvas@ubi:~$ mv some_path/nltk_data/ .
alvas@ubi:~$ 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.pos_tag(''this is a foo bar''.split())
[(''this'', ''DT''), (''is'', ''VBZ''), (''a'', ''DT''), (''foo'', ''JJ''), (''bar'', ''NN'')]
Si realmente desea encontrar nltk_data automáticamente, use algo como:
import scandir
import os, sys
import time
import nltk
def find(name, path):
for root, dirs, files in scandir.walk(path):
if root.endswith(name):
return root
def find_nltk_data():
start = time.time()
path_to_nltk_data = find(''nltk_data'', ''/'')
print >> sys.stderr, ''Finding nltk_data took'', time.time() - start
print >> sys.stderr, ''nltk_data at'', path_to_nltk_data
with open(''where_is_nltk_data.txt'', ''w'') as fout:
fout.write(path_to_nltk_data)
return path_to_nltk_data
def magically_find_nltk_data():
if os.path.exists(''where_is_nltk_data.txt''):
with open(''where_is_nltk_data.txt'') as fin:
path_to_nltk_data = fin.read().strip()
if os.path.exists(path_to_nltk_data):
nltk.data.path.append(path_to_nltk_data)
else:
nltk.data.path.append(find_nltk_data())
else:
path_to_nltk_data = find_nltk_data()
nltk.data.path.append(path_to_nltk_data)
magically_find_nltk_data()
print nltk.pos_tag(''this is a foo bar''.split())
Llamemos a ese script de python,
test.py
:
alvas@ubi:~$ ls nltk_data/
chunkers corpora grammars help misc models stemmers taggers tokenizers
alvas@ubi:~$ python test.py
Finding nltk_data took 4.27330780029
nltk_data at /home/alvas/nltk_data
[(''this'', ''DT''), (''is'', ''VBZ''), (''a'', ''DT''), (''foo'', ''JJ''), (''bar'', ''NN'')]
alvas@ubi:~$ mv nltk_data/ some_path/
alvas@ubi:~$ python test.py
Finding nltk_data took 4.75850391388
nltk_data at /home/alvas/some_path/nltk_data
[(''this'', ''DT''), (''is'', ''VBZ''), (''a'', ''DT''), (''foo'', ''JJ''), (''bar'', ''NN'')]