Короче:
nltk.download('punkt')
будет достаточно.
В длинной:
Вы не необходимая необходимости загружать все модели и доступные в корпуса NLTK, если вы только собираетесь использовать NLTK
для токенизации.
На самом деле, если вы используете только word_tokenize()
, то вам не понадобятся какие-либо ресурсы от nltk.download()
. Если мы посмотрим на код, по умолчанию word_tokenize()
, что в основном TreebankWordTokenizer не должны использовать какие-либо дополнительные ресурсы:
[email protected]:~$ ls nltk_data/
chunkers corpora grammars help models stemmers taggers tokenizers
[email protected]:~$ mv nltk_data/ tmp_move_nltk_data/
[email protected]:~$ python
Python 2.7.11+ (default, Apr 17 2016, 14:00:29)
[GCC 5.3.1 20160413] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from nltk import word_tokenize
>>> from nltk.tokenize import TreebankWordTokenizer
>>> tokenizer = TreebankWordTokenizer()
>>> tokenizer.tokenize('This is a sentence.')
['This', 'is', 'a', 'sentence', '.']
Но:
[email protected]:~$ ls nltk_data/
chunkers corpora grammars help models stemmers taggers tokenizers
[email protected]:~$ mv nltk_data/ tmp_move_nltk_data
[email protected]:~$ python
Python 2.7.11+ (default, Apr 17 2016, 14:00:29)
[GCC 5.3.1 20160413] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from nltk import sent_tokenize
>>> sent_tokenize('This is a sentence. This is another.')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/nltk/tokenize/__init__.py", line 90, in sent_tokenize
tokenizer = load('tokenizers/punkt/{0}.pickle'.format(language))
File "/usr/local/lib/python2.7/dist-packages/nltk/data.py", line 801, in load
opened_resource = _open(resource_url)
File "/usr/local/lib/python2.7/dist-packages/nltk/data.py", line 919, in _open
return find(path_, path + ['']).open()
File "/usr/local/lib/python2.7/dist-packages/nltk/data.py", line 641, in find
raise LookupError(resource_not_found)
LookupError:
**********************************************************************
Resource u'tokenizers/punkt/english.pickle' not found. Please
use the NLTK Downloader to obtain the resource: >>>
nltk.download()
Searched in:
- '/home/alvas/nltk_data'
- '/usr/share/nltk_data'
- '/usr/local/share/nltk_data'
- '/usr/lib/nltk_data'
- '/usr/local/lib/nltk_data'
- u''
**********************************************************************
>>> from nltk import word_tokenize
>>> word_tokenize('This is a sentence.')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/nltk/tokenize/__init__.py", line 106, in word_tokenize
return [token for sent in sent_tokenize(text, language)
File "/usr/local/lib/python2.7/dist-packages/nltk/tokenize/__init__.py", line 90, in sent_tokenize
tokenizer = load('tokenizers/punkt/{0}.pickle'.format(language))
File "/usr/local/lib/python2.7/dist-packages/nltk/data.py", line 801, in load
opened_resource = _open(resource_url)
File "/usr/local/lib/python2.7/dist-packages/nltk/data.py", line 919, in _open
return find(path_, path + ['']).open()
File "/usr/local/lib/python2.7/dist-packages/nltk/data.py", line 641, in find
raise LookupError(resource_not_found)
LookupError:
**********************************************************************
Resource u'tokenizers/punkt/english.pickle' not found. Please
use the NLTK Downloader to obtain the resource: >>>
nltk.download()
Searched in:
- '/home/alvas/nltk_data'
- '/usr/share/nltk_data'
- '/usr/local/share/nltk_data'
- '/usr/lib/nltk_data'
- '/usr/local/lib/nltk_data'
- u''
**********************************************************************
Но, похоже, что это не тот случай, если мы посмотрите на https://github.com/nltk/nltk/blob/develop/nltk/tokenize/init.py#L93. Похоже, что word_tokenize
неявно называется sent_tokenize()
, для которого требуется модель punkt
.
Я не уверен, является ли это ошибка или особенность, но это, кажется, как старая идиома может быть устаревшей, учитывая текущий код:
>>> from nltk import sent_tokenize, word_tokenize
>>> sentences = 'This is a foo bar sentence. This is another sentence.'
>>> tokenized_sents = [word_tokenize(sent) for sent in sent_tokenize(sentences)]
>>> tokenized_sents
[['This', 'is', 'a', 'foo', 'bar', 'sentence', '.'], ['This', 'is', 'another', 'sentence', '.']]
Это может быть просто:
>>> word_tokenize(sentences)
['This', 'is', 'a', 'foo', 'bar', 'sentence', '.', 'This', 'is', 'another', 'sentence', '.']
Но мы видим, что word_tokenize()
выравнивает список списка строк в один список строк.
В качестве альтернативы, вы можете попробовать использовать новый Tokenizer, который будет добавлен к NLTK toktok.py
на основе https://github.com/jonsafari/tok-tok, которая не требует заранее подготовленных моделей.
Немного несвязанный, но вы можете [проверить spaCy] (https://spacy.io) в качестве альтернативы NLTK. – ChrisP