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.
Réponses
Trop de publicités?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']
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).
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']
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)
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
.
- Réponses précédentes
- Plus de réponses