python - nltk search NLTK_DATA অনুসন্ধানের পথে যুক্ত করে না?




environment-variables search-path (2)

আপনি যদি আপনার স্ক্রিপ্টগুলি চালনার আগে $ NLTK_DATA সেট করতে না চান, আপনি পাইথন স্ক্রিপ্টগুলির সাথে এটিটি এর সাথে করতে পারেন:

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

উদাহরণস্বরূপ, nltk_data কে একটি nltk_data পথে সরানো যাক nltk_data এটি স্বয়ংক্রিয়ভাবে খুঁজে পাবে না:

[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')]

লিনাক্সের অধীনে, আমি env var $ NLTK_DATA ('/ home / user / 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''

আমরা দেখতে পাচ্ছি, এনএলটিকি_ডাটা ডায়র ম্যানুয়ালি সংযুক্ত করার পরে, এনল্টক পথ অনুসন্ধানে $ NLTK_DATA যোগ করে না:

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

প্রত্যাশা অনুযায়ী স্ক্রিপ্টটি চলছে, প্রশ্নটি হ'ল:

এটি কীভাবে স্বয়ংক্রিয়ভাবে অনুসন্ধানের পথে lt NLTK_DATA যুক্ত করতে nltk করবেন?


আপনি যদি এমন কেউ হন যে কোনও কনডা পরিবেশে NLTK ডেটা ইনস্টল করতে চান এবং প্রতিটি স্ক্রিপ্টে ডেটা অবস্থান নির্দিষ্ট করতে বা পরিবেশের পরিবর্তনশীলটি রফতানি করতে না চান, আপনাকে নিম্নলিখিতটি করতে হবে:

  1. আপনার পছন্দসই কনডা পরিবেশ সক্রিয় করুন।
  2. আপনার কনডা পরিবেশের মধ্যে sys.prefix মুদ্রণ করুন এবং এই পথটি অনুলিপি করুন (আসুন বলি /home/dickens/envs/nltk_env
  3. কনডা পরিবেশের মধ্যে nltk.download() চালান, আপনার পছন্দসই প্যাকেজগুলি নির্বাচন করুন এবং ডাউনলোডের স্থান হিসাবে উপরে থেকে আপনার পথে /share/nltk_data যুক্ত করুন। উদাহরণস্বরূপ, আমাদের ক্ষেত্রে এটি /home/dickens/envs/nltk_env/share/nltk_data
  4. আপনি এখন যেতে ভাল!






search-path