Python >> Tutoriel Python >  >> Python Tag >> NLTK

Que télécharger pour faire fonctionner nltk.tokenize.word_tokenize ?

Vous avez raison. Vous avez besoin des 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 n'utilisez que word_tokenize() , alors vous n'aurez pas vraiment besoin des ressources de nltk.download() . Si nous regardons le code, la valeur par défaut word_tokenize() c'est-à-dire que TreebankWordTokenizer ne devrait pas utiliser de ressources supplémentaires :

[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', '.']

Mais :

[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''
**********************************************************************

Mais il semble que ce ne soit pas le cas, si nous regardons https://github.com/nltk/nltk/blob/develop/nltk/tokenize/init .py#L93. Il semble que word_tokenize a implicitement appelé sent_tokenize() qui nécessite le punkt modèle.

Je ne sais pas s'il s'agit d'un bogue ou d'une fonctionnalité, mais il semble que l'ancien idiome soit peut-ê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', '.']]

Il peut s'agir simplement :

>>> word_tokenize(sentences)
['This', 'is', 'a', 'foo', 'bar', 'sentence', '.', 'This', 'is', 'another', 'sentence', '.']

Mais on voit que le word_tokenize() aplatit la liste des listes de chaînes en une seule liste de chaînes.

Alternativement, vous pouvez essayer d'utiliser un nouveau tokenizer qui a été ajouté à NLTK toktok.py basé sur https://github.com/jonsafari/tok-tok qui ne nécessite aucun modèle pré-formé.


Post précédent