Ich fange gerade an, NLTK zu verwenden, und ich verstehe nicht ganz, wie man eine Liste von Wörtern aus Text erhält. Wenn ich benutze nltk.word_tokenize()
, bekomme ich eine Liste mit Wörtern und Satzzeichen. Ich brauche stattdessen nur die Worte. Wie kann ich Interpunktion loswerden? Funktioniert auch word_tokenize
nicht mit mehreren Sätzen: Punkte werden zum letzten Wort hinzugefügt.
125
nltk.word_tokenize(the_text.translate(None, string.punctuation))
sollte in Python2 funktionieren, während Sie dies in Python3 tun könnennltk.work_tokenize(the_text.translate(dict.fromkeys(string.punctuation)))
.word_tokenize()
funktioniert es nicht mit mehreren Sätzen. Um die Interpunktion zu entfernen, können Sie einen regulären Ausdruck oder die Python-isalnum()
Funktion verwenden.>>> 'with dot.'.translate(None, string.punctuation) 'with dot'
(Beachten Sie keinen Punkt am Ende des Ergebnisses) Es kann Probleme verursachen, wenn Sie Dinge wie'end of sentence.No space'
haben. In diesem Fall tun Sie dies stattdessen: Diesthe_text.translate(string.maketrans(string.punctuation, ' '*len(string.punctuation)))
ersetzt alle Interpunktion durch Leerzeichen.Antworten:
Schauen Sie sich die anderen Tokenisierungsoptionen an, die nltk hier bietet . Sie können beispielsweise einen Tokenizer definieren, der Sequenzen alphanumerischer Zeichen als Token auswählt und alles andere löscht:
Ausgabe:
quelle
word_tokenize
Aufteilen von Kontraktionen gelten. Sie können die Regex naiv aufteilen,\w+
ohne dass die NLTK erforderlich ist.Sie benötigen NLTK nicht wirklich, um Interpunktion zu entfernen. Sie können es mit einfachem Python entfernen. Für Saiten:
Oder für Unicode:
und verwenden Sie diese Zeichenfolge dann in Ihrem Tokenizer.
Das PS- String-Modul verfügt über einige andere Sätze von Elementen, die entfernt werden können (z. B. Ziffern).
quelle
a = "*fa,fd.1lk#$" print("".join([w for w in a if w not in string.punctuation]))
Der folgende Code entfernt alle Satzzeichen sowie nicht alphabetische Zeichen. Aus ihrem Buch kopiert.
http://www.nltk.org/book/ch01.html
Ausgabe
quelle
Wie in Kommentaren bemerkt, beginnen Sie mit sent_tokenize (), da word_tokenize () nur für einen einzelnen Satz funktioniert. Sie können Interpunktion mit filter () herausfiltern. Und wenn Sie Unicode-Zeichenfolgen haben, stellen Sie sicher, dass es sich um ein Unicode-Objekt handelt (kein 'str', das mit einer Codierung wie 'utf-8' codiert ist).
quelle
word_tokenize
ist eine Funktion, die zurückgibt[token for sent in sent_tokenize(text, language) for token in _treebank_word_tokenize(sent)]
. Ich denke also, dass Ihre Antwort das tut, was nltk bereits tut: Verwendensent_tokenize()
vor Verwendenword_tokenize()
. Zumindest ist dies für nltk3.did
undn't
aber nicht.
Ich habe gerade den folgenden Code verwendet, mit dem alle Satzzeichen entfernt wurden:
quelle
Ich denke, Sie brauchen eine Art Matching für reguläre Ausdrücke (der folgende Code ist in Python 3):
Ausgabe:
Sollte in den meisten Fällen gut funktionieren, da Interpunktion entfernt wird, während Token wie "n't" erhalten bleiben, die von Regex-Tokenizern wie z
wordpunct_tokenize
.quelle
...
und--
unter Beibehaltung von Kontraktionen entfernen , wass.translate(None, string.punctuation)
nicht derMit freundlichen Grüßen fragen, was ist ein Wort? Wenn Sie davon ausgehen, dass ein Wort nur aus alphabetischen Zeichen besteht, liegen Sie falsch, da Wörter wie z. B.
can't
in Teile (z. B.can
undt
) zerstört werden, wenn Sie die Interpunktion vor der Tokenisierung entfernen , was sich sehr wahrscheinlich negativ auf Ihr Programm auswirkt.Daher besteht die Lösung darin, Satzzeichen zu markieren und dann zu entfernen .
... und wenn Sie möchten, können Sie bestimmte Token wie z. B.
'm
durch ersetzenam
.quelle
Ich benutze diesen Code, um Interpunktion zu entfernen:
Und wenn Sie überprüfen möchten, ob ein Token ein gültiges englisches Wort ist oder nicht, benötigen Sie möglicherweise PyEnchant
Lernprogramm:
quelle
word_tokenize
dass Sie den Standard-Tokenizer verwenden, derTreebankWordTokenizer
Kontraktionen aufteilt (z. B.can't
nach (ca
,n't
). Istn't
jedoch nicht alphanumerisch und geht dabei verloren.Interpunktion entfernen (Es wird entfernt. Sowie Teil der Interpunktionsbehandlung mit dem folgenden Code)
Beispieleingabe / -ausgabe:
['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']
quelle
Wenn Sie nur @rmalouf zur Lösung hinzufügen, enthält dies keine Zahlen, da \ w + [a-zA-Z0-9_] entspricht.
quelle
Sie können dies in einer Zeile ohne nltk (Python 3.x) tun.
quelle