pip3 instalar how docs concordance como python environment-variables nltk search-path

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:

  1. Active su entorno de conda deseado.
  2. Imprima sys.prefix dentro de su entorno conda y copie esta ruta (digamos /home/dickens/envs/nltk_env .
  3. 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 .
  4. ¡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'')]