nltk no agrega $ NLTK_DATA a la ruta de búsqueda?

en Linux, he establecido env var $ NLTK_DATA (‘/ home / user / data / nltk‘), y la prueba de soplado funciona como se esperaba

>>> from nltk.corpus import brown >>> brown.words() ['The', 'Fulton', 'County', 'Grand', 'Jury', 'said', ...] 

pero cuando ejecuto otro script de python, tengo:

 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"); 

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?

Related of "nltk no agrega $ NLTK_DATA a la ruta de búsqueda?"

Si no desea configurar $ 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, movamos el nltk_data a una ruta no estándar para que NLTK no la encuentre 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  >>> 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() 

Vamos a retroceder y ver 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 quieres encontrar nltk_data automáticamente, usa 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')] 

Si usted es alguien que desea instalar los datos NLTK en un entorno conda y no desea especificar la ubicación de los datos en cada script, o exportar la variable de entorno, debe hacer lo siguiente:

  1. Activa tu 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 los paquetes que desee 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 eres bueno para ir!