web-dev-qa-db-fra.com

nltk wordpunct_tokenize vs Word_tokenize

Quelqu'un connaît-il la différence entre nltk's wordpunct_tokenize et Word_tokenize? J'utilise nltk=3.2.4 et il n'y a rien sur la chaîne doc de wordpunct_tokenize qui explique la différence. Je n'ai pas pu trouver cette information non plus dans la documentation de nltk (peut-être que je n'ai pas cherché au bon endroit!). Je m'attendais à ce que le premier se débarrasse des jetons de ponctuation ou similaires, mais ce n'est pas le cas.

enter image description here

12
tsando

wordpunct_tokenize est basé sur une tokenisation regexp simple. Il est défini comme

wordpunct_tokenize = WordPunctTokenizer().tokenize

que vous pouvez trouver ici . Fondamentalement, il utilise l'expression régulière \w+|[^\w\s]+ pour diviser l'entrée.

Word_tokenize d'autre part est basé sur un TreebankWordTokenizer, voir la documentation ici . Il symbolise essentiellement le texte comme dans Penn Treebank. Voici un exemple stupide qui devrait montrer comment les deux diffèrent.

sent = "I'm a dog and it's great! You're cool and Sandy's book is big. Don't tell her, you'll regret it! 'Hey', she'll say!"
>>> Word_tokenize(sent)
['I', "'m", 'a', 'dog', 'and', 'it', "'s", 'great', '!', 'You', "'re", 
 'cool', 'and', 'Sandy', "'s", 'book', 'is', 'big', '.', 'Do', "n't", 'tell',
 'her', ',', 'you', "'ll", 'regret', 'it', '!', "'Hey", "'", ',', 'she', "'ll", 'say', '!']
>>> wordpunct_tokenize(sent)
['I', "'", 'm', 'a', 'dog', 'and', 'it', "'", 's', 'great', '!', 'You', "'",
 're', 'cool', 'and', 'Sandy', "'", 's', 'book', 'is', 'big', '.', 'Don',
 "'", 't', 'tell', 'her', ',', 'you', "'", 'll', 'regret', 'it', '!', "'", 
 'Hey', "',", 'she', "'", 'll', 'say', '!']

Comme on peut le voir, wordpunct_tokenize divisera à peu près tous les symboles spéciaux et les traitera comme des unités distinctes. Word_tokenize d'autre part conserve des choses comme 're ensemble. Cela ne semble pas être très intelligent, car comme nous pouvons le voir, il ne parvient pas à séparer la citation unique initiale de 'Hey'.

Fait intéressant, si nous écrivons la phrase comme ceci à la place (guillemets simples comme délimiteur de chaîne et guillemets doubles autour de "Hey"):

sent = 'I\'m a dog and it\'s great! You\'re cool and Sandy\'s book is big. Don\'t tell her, you\'ll regret it! "Hey", she\'ll say!'

on a

>>> Word_tokenize(sent)
['I', "'m", 'a', 'dog', 'and', 'it', "'s", 'great', '!', 'You', "'re", 
 'cool', 'and', 'Sandy', "'s", 'book', 'is', 'big', '.', 'Do', "n't", 
 'tell', 'her', ',', 'you', "'ll", 'regret', 'it', '!', '``', 'Hey', "''", 
 ',', 'she', "'ll", 'say', '!']

donc Word_tokenize divise les guillemets doubles, mais il les convertit également en `` et ''. wordpunct_tokenize ne fait pas cela:

>>> wordpunct_tokenize(sent)
['I', "'", 'm', 'a', 'dog', 'and', 'it', "'", 's', 'great', '!', 'You', "'", 
 're', 'cool', 'and', 'Sandy', "'", 's', 'book', 'is', 'big', '.', 'Don', 
 "'", 't', 'tell', 'her', ',', 'you', "'", 'll', 'regret', 'it', '!', '"', 
 'Hey', '",', 'she', "'", 'll', 'say', '!']
18
xdurch0