Dopiero zaczynam używać NLTK i nie do końca rozumiem, jak uzyskać listę słów z tekstu. Jeśli używam nltk.word_tokenize()
, otrzymuję listę słów i znaków interpunkcyjnych. Zamiast tego potrzebuję tylko słów. Jak pozbyć się interpunkcji? Również word_tokenize
nie działa z wieloma zdaniami: punkty są dodawane do ostatniego słowa.
125
nltk.word_tokenize(the_text.translate(None, string.punctuation))
powinien działać w python2, podczas gdy w python3 możesz to zrobićnltk.work_tokenize(the_text.translate(dict.fromkeys(string.punctuation)))
.word_tokenize()
nie działa z wieloma zdaniami. Aby pozbyć się interpunkcji, możesz użyć wyrażenia regularnego lubisalnum()
funkcji Pythona .>>> 'with dot.'.translate(None, string.punctuation) 'with dot'
(uwaga bez kropki na końcu wyniku) może powodować problemy, jeśli masz takie rzeczy'end of sentence.No space'
, w tym przypadku to zrobić w zamian:the_text.translate(string.maketrans(string.punctuation, ' '*len(string.punctuation)))
która zastępuje wszystkie znaki interpunkcyjne z białymi spacjami.Odpowiedzi:
Spójrz na inne opcje tokenizacji, które oferuje nltk tutaj . Na przykład możesz zdefiniować tokenizer, który wybiera sekwencje znaków alfanumerycznych jako tokeny i odrzuca wszystko inne:
Wynik:
źródło
word_tokenize
jak rozszczepianie skurczów. Możesz naiwnie podzielić wyrażenie regularne\w+
bez potrzeby używania NLTK.Naprawdę nie potrzebujesz NLTK, aby usunąć znaki interpunkcyjne. Możesz go usunąć za pomocą prostego Pythona. Na smyczki:
Lub dla Unicode:
a następnie użyj tego ciągu w swoim tokenizerze.
Moduł stringów PS ma kilka innych zestawów elementów, które można usunąć (np. Cyfry).
źródło
a = "*fa,fd.1lk#$" print("".join([w for w in a if w not in string.punctuation]))
Poniższy kod usunie wszystkie znaki interpunkcyjne, a także znaki spoza alfabetu. Skopiowane z ich książki.
http://www.nltk.org/book/ch01.html
wynik
źródło
Jak zauważono w komentarzach, zaczynaj się od sent_tokenize (), ponieważ word_tokenize () działa tylko na jednym zdaniu. Możesz odfiltrować znaki interpunkcyjne za pomocą funkcji filter (). A jeśli masz łańcuchy znaków Unicode, upewnij się, że jest to obiekt Unicode (a nie „str” zakodowany za pomocą jakiegoś kodowania, takiego jak „utf-8”).
źródło
word_tokenize
to funkcja, która zwraca[token for sent in sent_tokenize(text, language) for token in _treebank_word_tokenize(sent)]
. Więc myślę, że twoja odpowiedź to robienie tego, co już robi nltk: używaniesent_tokenize()
przed użyciemword_tokenize()
. Przynajmniej dotyczy to nltk3.did
, an't
jednak nie.
Właśnie użyłem następującego kodu, który usunął całą interpunkcję:
źródło
Myślę, że potrzebujesz jakiegoś dopasowania wyrażeń regularnych (poniższy kod jest w Pythonie 3):
Wynik:
Powinien działać dobrze w większości przypadków, ponieważ usuwa znaki interpunkcyjne, jednocześnie zachowując tokeny, takie jak „n't”, których nie można uzyskać z tokenizatorów regex, takich jak
wordpunct_tokenize
.źródło
...
i--
zachowując skurcze, cos.translate(None, string.punctuation)
nie będzieSzczerze pytasz, co to jest słowo? Jeśli zakładasz, że słowo składa się tylko ze znaków alfabetu, to się mylisz, ponieważ słowa takie jak
can't
zostaną zniszczone na kawałki (takie jakcan
it
), jeśli usuniesz znaki interpunkcyjne przed tokenizacją , co z dużym prawdopodobieństwem wpłynie negatywnie na Twój program.Dlatego rozwiązaniem jest tokenizacja, a następnie usunięcie tokenów interpunkcyjnych .
... a jeśli chcesz, możesz zastąpić pewne znaki, takie jak
'm
zam
.źródło
Używam tego kodu, aby usunąć interpunkcję:
A jeśli chcesz sprawdzić, czy token jest prawidłowym angielskim słowem, czy nie, możesz potrzebować PyEnchant
Instruktaż:
źródło
word_tokenize
stosowanie średnia tokenizer,TreebankWordTokenizer
, która dzieli skurcze (npcan't
do (ca
,n't
) Jednakże,n't
nie jest alfanumeryczny i zgubić się w tym procesie.Usuń interpunkcję (usunie., A także część obsługi interpunkcji za pomocą poniższego kodu)
Przykładowe wejście / wyjście:
['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']
źródło
Samo dodanie do rozwiązania przez @rmalouf nie będzie zawierało żadnych liczb, ponieważ \ w + jest równoważne z [a-zA-Z0-9_]
źródło
Możesz to zrobić w jednej linii bez nltk (python 3.x).
źródło