python - nltk $ NLTK_DATA को खोज पथ में नहीं जोड़ता है?




environment-variables search-path (2)

लिनक्स के तहत, मैंने env var $ NLTK_DATA ('/ घर / उपयोगकर्ता / डेटा / nltk') सेट किया है, और उम्मीद के मुताबिक परीक्षण कार्य किए हैं

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

लेकिन जब एक और अजगर स्क्रिप्ट चल रही थी, मुझे मिल गई:

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''

जैसा कि हम देख सकते हैं, ntl $ NLTK_DATA को खोज पथ में नहीं जोड़ता है, NLTK_DATA मैन्युअल को मैन्युअल रूप से संलग्न करने के बाद:

nltk.data.path.append("/NLTK_DATA_DIR");

स्क्रिप्ट उम्मीद के मुताबिक चलती है, सवाल यह है कि:

$ NLTK_DATA को अपने आप से जोड़ने के लिए nltk कैसे करें?


यदि आप अपनी स्क्रिप्ट चलाने से पहले $ NLTK_DATA सेट नहीं करना चाहते हैं, तो आप इसके लिए अजगर स्क्रिप्ट के भीतर कर सकते हैं:

import nltk
nltk.path.append('/home/alvas/some_path/nltk_data/')

उदाहरण के लिए nltk_data को एक गैर-मानक पथ पर ले जाएँ, जो NLTK अपने आप नहीं मिलेगा:

[email protected]:~$ ls nltk_data/
chunkers  corpora  grammars  help  misc  models  stemmers  taggers  tokenizers
[email protected]:~$ mkdir some_path
[email protected]:~$ mv nltk_data/ some_path/
[email protected]:~$ ls nltk_data/
ls: cannot access nltk_data/: No such file or directory
[email protected]:~$ ls some_path/nltk_data/
chunkers  corpora  grammars  help  misc  models  stemmers  taggers  tokenizers

अब, हम nltk.path.append() हैक का उपयोग करते हैं:

[email protected]:~$ 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()

आइए इसे वापस ले जाएं और देखें कि क्या यह काम करता है:

[email protected]:~$ ls nltk_data
ls: cannot access nltk_data: No such file or directory
[email protected]:~$ mv some_path/nltk_data/ .
[email protected]:~$ 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')]

यदि आप वास्तव में nltk_data को स्वचालित रूप से ढूंढना चाहते हैं, तो कुछ का उपयोग करें:

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())

आइए उस अजगर स्क्रिप्ट को कॉल करें, test.py :

[email protected]:~$ ls nltk_data/
chunkers  corpora  grammars  help  misc  models  stemmers  taggers  tokenizers
[email protected]:~$ 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')]
[email protected]:~$ mv nltk_data/ some_path/
[email protected]:~$ 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')]

यदि आप एक ऐसे व्यक्ति हैं जो एनएलटीके डेटा को एक कोंडा वातावरण में स्थापित करना चाहते हैं, और हर स्क्रिप्ट में डेटा स्थान निर्दिष्ट नहीं करना चाहते हैं, या पर्यावरण चर को निर्यात करना चाहते हैं, तो आपको निम्न कार्य करने की आवश्यकता है:

  1. अपने इच्छित कोंडा वातावरण को सक्रिय करें।
  2. अपने कॉन्डा पर्यावरण के भीतर sys.prefix प्रिंट करें, और इस पथ को कॉपी करें (चलो /home/dickens/envs/nltk_env
  3. Conda वातावरण में nltk.download() चलाएं, अपने इच्छित पैकेजों का चयन करें, और डाउनलोड स्थान के रूप में ऊपर से अपने पथ पर /share/nltk_data जोड़ें। उदाहरण के लिए, हमारे मामले में, यह /home/dickens/envs/nltk_env/share/nltk_data
  4. अब आप जाने के लिए अच्छे हैं!






search-path