150 votes

Comment se débarrasser de la ponctuation en utilisant le tokenizer de NLTK ?

Je commence tout juste à utiliser NLTK et je ne comprends pas bien comment obtenir une liste de mots à partir d'un texte. Si j'utilise nltk.word_tokenize() j'obtiens une liste de mots et de ponctuations. Je n'ai besoin que des mots. Comment puis-je me débarrasser de la ponctuation ? Aussi word_tokenize ne fonctionne pas avec les phrases multiples : les points sont ajoutés au dernier mot.

200voto

rmalouf Points 1027

Jetez un coup d'oeil aux autres options de tokenisation que nltk fournit ici . Par exemple, vous pouvez définir un tokéniseur qui sélectionne des séquences de caractères alphanumériques en tant que jetons et laisse tomber tout le reste :

from nltk.tokenize import RegexpTokenizer

tokenizer = RegexpTokenizer(r'\w+')
tokenizer.tokenize('Eighty-seven miles to go, yet.  Onward!')

Sortie :

['Eighty', 'seven', 'miles', 'to', 'go', 'yet', 'Onward']

53voto

Salvador Dali Points 11667

Vous n'avez pas vraiment besoin de NLTK pour supprimer la ponctuation. Vous pouvez la supprimer avec un simple python. Pour les chaînes de caractères :

import string
s = '... some string with punctuation ...'
s = s.translate(None, string.punctuation)

Ou pour l'unicode :

import string
translate_table = dict((ord(char), None) for char in string.punctuation)   
s.translate(translate_table)

et ensuite utiliser cette chaîne dans votre tokenizer.

P.S. Les modules de chaînes de caractères ont d'autres ensembles d'éléments qui peuvent être supprimés (comme les chiffres).

37voto

Madura Pradeep Points 1037

Le code ci-dessous supprimera tous les signes de ponctuation ainsi que les caractères non alphabétiques. Copié de leur livre.

http://www.nltk.org/book/ch01.html

import nltk

s = "I can't do this now, because I'm so tired.  Please give me some time. @ sd  4 232"

words = nltk.word_tokenize(s)

words=[word.lower() for word in words if word.isalpha()]

print(words)

sortie

['i', 'ca', 'do', 'this', 'now', 'because', 'i', 'so', 'tired', 'please', 'give', 'me', 'some', 'time', 'sd']

18voto

palooh Points 124

Comme remarqué dans les commentaires, commencez avec sent_tokenize(), car word_tokenize() ne fonctionne que sur une seule phrase. Vous pouvez filtrer la ponctuation avec filter(). Et si vous avez une chaîne unicode, assurez-vous qu'il s'agit d'un objet unicode (et non d'une 'str' encodée avec un encodage comme 'utf-8').

from nltk.tokenize import word_tokenize, sent_tokenize

text = '''It is a blue, small, and extraordinary ball. Like no other'''
tokens = [word for sent in sent_tokenize(text) for word in word_tokenize(sent)]
print filter(lambda word: word not in ',-', tokens)

13voto

Bora M. Alper Points 1046

Je vous demande sincèrement, qu'est-ce qu'un mot ? Si vous supposez qu'un mot se compose uniquement de caractères alphabétiques, vous avez tort car des mots tels que can't sera détruit en morceaux (comme can y t ) si vous supprimez la ponctuation avant la tokenisation ce qui risque fort d'affecter négativement votre programme.

La solution consiste donc à tokenise puis supprime les tokens de ponctuation .

import string

from nltk.tokenize import word_tokenize

tokens = word_tokenize("I'm a southern salesman.")
# ['I', "'m", 'a', 'southern', 'salesman', '.']

tokens = list(filter(lambda token: token not in string.punctuation, tokens))
# ['I', "'m", 'a', 'southern', 'salesman']

...et ensuite, si vous le souhaitez, vous pouvez remplacer certains jetons tels que 'm avec am .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X