Je vais utiliser nltk.tokenize.Word_tokenize
Sur un cluster où mon compte est très limité par le quota d'espace. À la maison, j'ai téléchargé toutes les ressources nltk
par nltk.download()
mais, comme je l'ai découvert, cela prend ~ 2,5 Go.
Cela me semble un peu exagéré. Pourriez-vous suggérer quelles sont les dépendances minimales (ou presque minimales) pour nltk.tokenize.Word_tokenize
? Jusqu'à présent, j'ai vu nltk.download('punkt')
mais je ne sais pas si c'est suffisant et quelle est la taille. Que dois-je faire exactement pour le faire fonctionner?
Vous avez raison. Vous avez besoin de modèles Punkt Tokenizer. Il a 13 Mo et nltk.download('punkt')
devrait faire l'affaire.
En bref :
nltk.download('punkt')
suffirait.
En long :
Vous n'avez pas besoin de télécharger tous les modèles et corpus disponibles dans NLTk si vous allez simplement utiliser NLTK
pour la tokenisation.
En fait, si vous utilisez simplement Word_tokenize()
, alors vous n'aurez pas vraiment besoin des ressources de nltk.download()
. Si nous regardons le code, la Word_tokenize()
par défaut qui est fondamentalement le TreebankWordTokenizer ne devrait pas utiliser de ressources supplémentaires:
alvas@ubi:~$ ls nltk_data/
chunkers corpora grammars help models stemmers taggers tokenizers
alvas@ubi:~$ mv nltk_data/ tmp_move_nltk_data/
alvas@ubi:~$ 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', '.']
Mais:
alvas@ubi:~$ ls nltk_data/
chunkers corpora grammars help models stemmers taggers tokenizers
alvas@ubi:~$ mv nltk_data/ tmp_move_nltk_data
alvas@ubi:~$ 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''
**********************************************************************
Mais il semble que ce ne soit pas le cas, si nous regardons https://github.com/nltk/nltk/blob/develop/nltk/tokenize/ init . py # L9 . Il semble que Word_tokenize
Ait implicitement appelé sent_tokenize()
qui nécessite le modèle punkt
.
Je ne sais pas s'il s'agit d'un bogue ou d'une fonctionnalité, mais il semble que l'ancien idiome pourrait être obsolète compte tenu du code actuel:
>>> 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', '.']]
Cela peut être simplement:
>>> Word_tokenize(sentences)
['This', 'is', 'a', 'foo', 'bar', 'sentence', '.', 'This', 'is', 'another', 'sentence', '.']
Mais nous voyons que la Word_tokenize()
aplatit la liste de liste de chaîne en une seule liste de chaîne.
Alternativement, vous pouvez essayer d'utiliser un nouveau tokenizer qui sera ajouté à NLTK toktok.py
basé sur https://github.com/jonsafari/tok-tok = qui ne nécessite aucun modèle pré-formé.