Je commence tout juste à utiliser NLTK et je ne comprends pas très 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 ponctuation. Je n'ai besoin que des mots à la place. Comment puis-je me débarrasser de la ponctuation? Aussi word_tokenize
ne fonctionne pas avec plusieurs phrases: points sont ajoutés au dernier mot.
125
nltk.word_tokenize(the_text.translate(None, string.punctuation))
devrait fonctionner en python2 alors qu'en python3 vous pouvez le fairenltk.work_tokenize(the_text.translate(dict.fromkeys(string.punctuation)))
.word_tokenize()
ne fonctionne pas avec plusieurs phrases. Pour vous débarrasser de la ponctuation, vous pouvez utiliser une expression régulière ou uneisalnum()
fonction de python .>>> 'with dot.'.translate(None, string.punctuation) 'with dot'
(note dot pas à la fin du résultat) Il peut causer des problèmes si vous avez des choses comme'end of sentence.No space'
, dans ce cas , faire à la place:the_text.translate(string.maketrans(string.punctuation, ' '*len(string.punctuation)))
qui remplace la ponctuation par des espaces blancs.Réponses:
Jetez un œil aux autres options de tokenisation fournies par nltk ici . Par exemple, vous pouvez définir un tokenizer qui sélectionne des séquences de caractères alphanumériques comme jetons et supprime tout le reste:
Production:
la source
word_tokenize
comme la séparation des contractions. Vous pouvez diviser naïvement sur l'expression\w+
régulière sans avoir besoin du NLTK.Vous n'avez pas vraiment besoin de NLTK pour supprimer la ponctuation. Vous pouvez le supprimer avec un simple python. Pour les chaînes:
Ou pour unicode:
puis utilisez cette chaîne dans votre tokenizer.
Le module de chaîne PS a d'autres ensembles d'éléments qui peuvent être supprimés (comme des chiffres).
la source
a = "*fa,fd.1lk#$" print("".join([w for w in a if w not in string.punctuation]))
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
production
la source
Comme remarqué dans les commentaires, commencez par 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 que c'est un objet Unicode (pas un 'str' encodé avec un encodage comme 'utf-8').
la source
word_tokenize
est une fonction qui retourne[token for sent in sent_tokenize(text, language) for token in _treebank_word_tokenize(sent)]
. Donc, je pense que votre réponse fait ce que nltk fait déjà: utilisersent_tokenize()
avant d'utiliserword_tokenize()
. Au moins, c'est pour nltk3.did
etn't
mais pas.
Je viens d'utiliser le code suivant, qui a supprimé toute la ponctuation:
la source
Je pense que vous avez besoin d'une sorte de correspondance d'expression régulière (le code suivant est en Python 3):
Production:
Cela devrait bien fonctionner dans la plupart des cas, car il supprime la ponctuation tout en préservant les jetons comme "n't", qui ne peuvent pas être obtenus à partir de jetons de regex tels que
wordpunct_tokenize
.la source
...
et--
tout en préservant les contractions, ces.translate(None, string.punctuation)
qui ne le fera pasEn demandant sincèrement, qu'est-ce qu'un mot? Si vous supposez qu'un mot est composé uniquement de caractères alphabétiques, vous vous trompez car des mots tels que
can't
seront détruits en morceaux (tels quecan
ett
) si vous supprimez la ponctuation avant la tokenisation , ce qui est très susceptible d'affecter négativement votre programme.Par conséquent, la solution est de tokeniser puis de supprimer les jetons de ponctuation .
... et ensuite si vous le souhaitez, vous pouvez remplacer certains jetons tels que
'm
param
.la source
J'utilise ce code pour supprimer la ponctuation:
Et si vous voulez vérifier si un jeton est un mot anglais valide ou non, vous aurez peut-être besoin de PyEnchant
Didacticiel:
la source
word_tokenize
utilisez le tokenizer standard,,TreebankWordTokenizer
qui divise les contractions (par exemplecan't
en (ca
,n't
). Cependant, cen't
n'est pas alphanumérique et perdez-vous dans le processus.Supprimer la ponctuation (elle supprimera. Ainsi qu'une partie de la gestion de la ponctuation en utilisant le code ci-dessous)
Exemple d'entrée / sortie:
['direct', 'flat', 'oberoi', 'esquire', '3', 'bhk', '2195', 'saleable', '1330', 'carpet', 'rate', '14500', 'final', 'plus', '1', 'floor', 'rise', 'tax', 'approx', '9', 'flat', 'cost', 'parking', '389', 'cr', 'plus', 'taxes', 'plus', 'possession', 'charger', 'middle', 'floor', 'north', 'door', 'arey', 'oberoi', 'woods', 'facing', '53', 'paymemt', 'due', '1', 'transfer', 'charge', 'buyer', 'total', 'cost', 'around', '420', 'cr', 'approx', 'plus', 'possession', 'charges', 'rahul', 'soni']
la source
En ajoutant simplement à la solution de @rmalouf, cela n'inclura aucun nombre car \ w + équivaut à [a-zA-Z0-9_]
la source
Vous pouvez le faire en une seule ligne sans nltk (python 3.x).
la source