2016-05-08 5 views
7

Я собираюсь использовать nltk.tokenize.word_tokenize на кластере, где моя учетная запись очень ограничена квотой пространства. Дома, я загрузил все nltk ресурсов по nltk.download(), но, как я узнал, требуется ~ 2.5 ГБ.Что скачать, чтобы сделать nltk.tokenize.word_tokenize работу?

Это кажется немного излишним для меня. Не могли бы вы предложить, какие минимальные (или почти минимальные) зависимости для nltk.tokenize.word_tokenize? До сих пор я видел nltk.download('punkt'), но я не уверен, достаточно ли этого и какой размер. Что именно мне нужно запустить, чтобы заставить его работать?

+0

Немного несвязанный, но вы можете [проверить spaCy] (https://spacy.io) в качестве альтернативы NLTK. – ChrisP

ответ

11

Вы правы. Вам нужны модели Tokenizer Punkt. Он имеет 13 МБ, и nltk.download('punkt') должен сделать трюк.

+0

Кроме того, если вы запустите 'nltk.download()', NLTK Downloader должен открыть (приложение GUI), чтобы вы могли просматривать все пакеты. –

+4

или использовать терминал: 'python -m nltk.downloader 'punkt''. Также обратите внимание, что 13 МБ - это заархивированный файл, последнее - ~ 36 МБ. – patrick

4

Короче:

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, которая не требует заранее подготовленных моделей.

Смежные вопросы