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?
Antwort
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)
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
'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. –
@rmalouf, weil Sie keine Interpunktions-Tokens benötigen? Also wollen Sie 'did' und' n't' haben, aber nicht '.' –
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']
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
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()]
Warum Tokens in Text konvertieren? – Sadik
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")
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 –
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).
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.
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']
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
- 1. Wie man den NLTK-Satz-Tokenizer zwickt
- 2. nltk regulären Ausdruck tokenizer
- 3. Nltk Satz Tokenizer gibt AttributeError
- 4. Wie man das nicht alphabetische Zeichen am Ende des Wortes loswerden mit Python Nltk
- 5. Wie vermeidet man, dass NLTK den Satztokenizer auf Abkürzungen spaltet?
- 6. Wie man einen Tokenizer in elasticsearch einrichtet
- 7. Wie man Interpunktion im Stanford Abhängigkeit Parser
- 8. Einfacher Tokenizer mit SWI Prolog
- 9. Wie verwende ich den Standard-Tokenizer von NLTK, um Spannen statt Strings zu erhalten?
- 10. Tokenizer, Stoppwortentfernung, Stemming in Java
- 11. Wie nur Worte Ausgabe, die drei Buchstaben oder mehr mit nltk
- 12. Kann nicht herausfinden, wie man NaN loswerden
- 13. Wie man ein in die Schlüsselabhängigkeit loswerden?
- 14. wie man anti-banner systeme loswerden
- 15. Wie man die Ausnahme 80000003 loswerden?
- 16. Wie man ein Extra loswerden kann Vielleicht
- 17. Wie man Duplikate in Regex loswerden
- 18. Tokenisierung arabischer Wörter mit NLTK
- 19. Streifen Interpunktion mit Regex - Python
- 20. Wie man ein hinteres Komma mit ASP.NET Repeater loswerden?
- 21. Trainingsdatenformat für nltk punkt
- 22. Wie implementiert man tokenizer.rbegin() und rend() für boost :: tokenizer?
- 23. Wie erzeugt man einfache Anagramme, die Interpunktion erhalten?
- 24. bekommen Alphabete nach dem Anwenden von Satz Tokenizer von Nltk anstelle von Sätzen in Python 3.5.1
- 25. Semantische Analyse mit NLTK
- 26. Interpunktion in LanguagueTool Regeln
- 27. Funktioniert PyPy mit NLTK?
- 28. Postgresql Volltextsuche Tokenizer
- 29. stanford nlp Tokenizer
- 30. Tokenizer vs Token Filter
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
Dies funktioniert nicht. Nichts passiert mit dem Text. – lizarisk
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. –