2016-04-03 13 views
2

, ben env var $ NLTK_DATA ('/ home/kullanıcı/veri/nltk') ayarlanır ve

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

beklenen ancak başka python komut çalıştırırken, aldığım gibi deney çalışır patladı var:

gördüğümüz gibi
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 el NLTK_DATA dir ekleyerek sonra, arama yolunun $ NLTK_DATA eklemez:

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

komut dosyası beklendiği gibi çalışıyor, soru şu:

Nltk, arama yoluna otomatik olarak NLTK_DATA eklemek için nasıl yapılır?

+0

:

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

en python'un senaryoyu, test.py diyelim? – alvas

+1

Varsayılan olarak NLTK, bu dizindeki 'nltk_data' dizinini otomatik olarak bulur - '/ home/user/nltk_data' '/ usr/share/nltk_data', '/ usr/local/share/nltk_data', '/ usr/lib/nltk_data ','/usr/local/lib/nltk_data ' – alvas

+1

$ NLTK_DATA'ya veri indirmek için nltk.download() öğesini belirttim, eğer arama dizinine $ NLTK_DATA eklemediysek, indirilen veriler' komut dosyaları tarafından kullanılmamalıdır (ancak basit komut kullanılamaz). –

cevap

3

Eğer komut dosyalarını çalıştırmadan önce $ NLTK_DATA ayarlamak istemiyorsanız, sizinle piton betikleriyle yapabilirsiniz:

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

Ör en NLTK otomatik bulamazsınız o standart dışı bir yola nltk_data geçelim: Şimdi

[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 

, biz nltk.path.append() kesmek kullanmak:

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

Şunu geri hareket, bakalım o olsun çalışır:

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

gerçekten gerçekten automagicallylar nltk_data, kullanımını bulmak istiyorsanız gibi bir şey: neden otomatik yolunu bulmak gerekiyor, `nltk_data` dizin statik olduğundan

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

Bir sistem değişkeni eklemek gibi bu sorunu çözmek için tek bir yol var mı? –

+0

Veri yollarını şu şekilde kullanarak: 'nltk.path.append ('/ home/alvas/some_path/nltk_data /')' import nltk' sonra çalışmalıdır, bu sadece kullanıcının NLTK dizininin nerede olduğunu bilmemesidir Daha sonra 'magically_find_nltk_data() ' – alvas

+0

'u kullanmanız gerekebilir. Belki de yeterince açık bir şekilde soru sormadım.NLvK_DATA env varmı bir dir olarak ayarlıyorum ve umarım nltk.download() bu direyi otomatik olarak arama yoluna ekler ve içeriğin indirilip indirilmediğine karar vermek için bu direkte arama yapar ve yeni bir içerik indirir. ama nltk.download() does.Question nltk env var tanımak nasıl NLTK_DATA –