2013-03-21 18 views
70

Ich fange gerade an, NLTK zu verwenden, und ich verstehe nicht ganz, wie man eine Liste der Wörter vom Text erhält. Wenn ich nltk.word_tokenize() verwende, erhalte ich eine Liste von Wörtern und Interpunktion. Ich brauche nur die Wörter stattdessen. Wie kann ich Interpunktion beseitigen? Auch word_tokenize funktioniert nicht mit mehreren Sätzen: Punkte werden dem letzten Wort hinzugefügt.Wie man Interpunktion mit NLTK Tokenizer loswerden?

+10

Warum Sie die Interpunktion nicht selbst entfernen? 'nltk.word_tokenize (the_text.translate (None, string.punctuation))' sollte in python2 arbeiten, während in python3 'nltk.work_tokenize (the_text.translate (dict.frunkkeys (string.punctuation)))' ''. – Bakuriu

+2

Dies funktioniert nicht. Nichts passiert mit dem Text. – lizarisk

+0

Der von NLTK angenommene Arbeitsablauf besteht darin, dass Sie zuerst in Sätze und dann jeden Satz in Wörter zerlegen. Deshalb funktioniert 'word_tokenize()' nicht mit mehreren Sätzen. Um die Interpunktion zu entfernen, können Sie einen regulären Ausdruck oder die 'isalnum()' -Funktion von python verwenden. –

Antwort

13

Wie in den Kommentaren bemerkt, fangen Sie mit sent_tokenize() an, weil word_tokenize() nur für einen einzigen Satz funktioniert. Sie können Interpunktion mit filter() filtern. Und wenn Sie Unicode-Strings haben, stellen Sie sicher, dass es sich um ein Unicode-Objekt handelt (nicht um ein 'str', das mit einer Codierung wie 'utf-8' codiert ist).

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) 
+12

Der größte Teil der Komplexität des Penn Treebank Tokenizers hat mit der richtigen Handhabung von Interpunktion zu tun. Warum sollten Sie einen teuren Tokenizer verwenden, der Interpunktion gut verarbeitet, wenn Sie nur die Interpunktion ausstreichen? – rmalouf

+2

'word_tokenize' ist eine Funktion, die '[Token für gesendet in sent_tokenize (Text, Sprache) für Token in _treebank_word_tokenize (sended)]' zurückgibt. Also ich denke, dass Ihre Antwort tut, was nltk bereits tut: mit 'sent_tokenize()' vor der Verwendung von 'word_tokenize()'. Zumindest ist dies für nltk3. –

+2

@rmalouf, weil Sie keine Interpunktions-Tokens benötigen? Also wollen Sie 'did' und' n't' haben, aber nicht '.' –

107

Werfen Sie einen Blick auf die anderen Optionen, die Tokenisieren here NLTK bietet. Zum Beispiel können Sie eine tokenizer definieren, die als Token-Sequenzen von alphanumerischen Zeichen aussucht und fällt alles andere:

from nltk.tokenize import RegexpTokenizer 

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

Ausgang:

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

Beachten Sie, dass Sie, wenn Sie diese Option verwenden, natürliche Sprachfunktionen verlieren, die speziell auf' word_tokenize' wirken, wie das Aufteilen von Kontraktionen. Du kannst naiv auf die Regex '\ w +' aufteilen, ohne die NLTK zu benötigen. – sffc

8

ich den folgenden Code nur verwendet, die alle Interpunktion entfernt :

tokens = nltk.wordpunct_tokenize(raw) 

type(tokens) 

text = nltk.Text(tokens) 

type(text) 

words = [w.lower() for w in text if w.isalpha()] 
+1

Warum Tokens in Text konvertieren? – Sadik

4

ich benutze diesen Code Interpunktion zu entfernen:

import nltk 
def getTerms(sentences): 
    tokens = nltk.word_tokenize(sentences) 
    words = [w.lower() for w in tokens if w.isalnum()] 
    print tokens 
    print words 

getTerms("hh, hh3h. wo shi 2 4 A . fdffdf. A&&B ") 

Und Wenn Sie überprüfen wollen, ob ein Token ein gültiges englische Wort ist oder nicht, können Sie PyEnchant

Tutorial benötigen:

import enchant 
d = enchant.Dict("en_US") 
d.check("Hello") 
d.check("Helo") 
d.suggest("Helo") 
+0

Vorsicht, diese Lösung tötet Kontraktionen. Das liegt daran, dass 'word_tokenize' den Standard-Tokenizer' TreebankWordTokenizer' verwendet, der die Kontraktionen aufteilt (zB 'can'' ('ca',' n't'). Allerdings ist 'n't' nicht alphanumerisch und geht verloren –

25

Sie nicht wirklich brauchen NLTK Interpunktion zu entfernen. Sie können es mit einfachem Python entfernen. Für Strings:

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

Oder für Unicode:

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

und dann diese Zeichenfolge in Ihrem tokenizer verwenden.

P.S. String-Modul haben einige andere Sätze von Elementen, die entfernt werden können (wie Ziffern).

5

Ich denke, Sie irgendeine Art von regulären Ausdrücke müssen (der folgende Code in Python 3):

import string 
import re 
import nltk 

s = "I can't do this now, because I'm so tired. Please give me some time." 
l = nltk.word_tokenize(s) 
ll = [x for x in l if not re.fullmatch('[' + string.punctuation + ']+', x)] 
print(l) 
print(ll) 

Ausgang:

['I', 'ca', "n't", 'do', 'this', 'now', ',', 'because', 'I', "'m", 'so', 'tired', '.', 'Please', 'give', 'me', 'some', 'time', '.'] 
['I', 'ca', "n't", 'do', 'this', 'now', 'because', 'I', "'m", 'so', 'tired', 'Please', 'give', 'me', 'some', 'time'] 

Sollte in den meisten Fällen gut funktionieren, da es Interpunktion entfernt Token wie "nicht" beibehalten, die nicht von Regex Tokens wie wordpunct_tokenize erhalten werden können.

7

Der folgende Code entfernt alle Interpunktionszeichen sowie nicht alphabetische Zeichen. Aus ihrem Buch kopiert.

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) 

Ausgang

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

Seien Sie sich bewusst, dass Sie mit dieser Methode das Wort "nicht" in Fällen wie "kann nicht" oder "nicht" verlieren, was für das Verständnis und die Klassifizierung des Satzes sehr wichtig sein kann mit sentence.translate (string.maketrans ("", "",), chars_to_remove), wobei chars_to_remove "., ':;!?" sein kann – MikeL

Verwandte Themen