Saya baru mulai menggunakan NLTK dan saya tidak begitu mengerti bagaimana cara mendapatkan daftar kata dari teks. Jika saya menggunakan nltk.word_tokenize()
, saya mendapatkan daftar kata dan tanda baca. Saya hanya membutuhkan kata-kata saja. Bagaimana cara menghilangkan tanda baca? Juga word_tokenize
tidak berfungsi dengan beberapa kalimat: titik ditambahkan ke kata terakhir.
125
nltk.word_tokenize(the_text.translate(None, string.punctuation))
harus bekerja di python2 sedangkan di python3 Anda bisa melakukannyanltk.work_tokenize(the_text.translate(dict.fromkeys(string.punctuation)))
.word_tokenize()
tidak bekerja dengan banyak kalimat. Untuk menghilangkan tanda baca, Anda dapat menggunakan ekspresi reguler atauisalnum()
fungsi python .>>> 'with dot.'.translate(None, string.punctuation) 'with dot'
(catatan tidak ada dot pada akhir hasil) itu dapat menyebabkan masalah jika Anda memiliki hal-hal seperti'end of sentence.No space'
, dalam hal melakukan ini sebagai gantinya:the_text.translate(string.maketrans(string.punctuation, ' '*len(string.punctuation)))
yang menggantikan semua tanda baca dengan spasi putih.Jawaban:
Lihat opsi tokenisasi lain yang disediakan nltk di sini . Misalnya, Anda dapat menentukan tokenizer yang memilih urutan karakter alfanumerik sebagai token dan menghapus yang lainnya:
Keluaran:
sumber
word_tokenize
seperti memisahkan kontraksi. Anda dapat membagi regex secara naif\w+
tanpa perlu NLTK.Anda tidak benar-benar membutuhkan NLTK untuk menghapus tanda baca. Anda dapat menghapusnya dengan python sederhana. Untuk string:
Atau untuk unicode:
dan kemudian gunakan string ini di tokenizer Anda.
Modul string PS memiliki beberapa set elemen lain yang dapat dihapus (seperti digit).
sumber
a = "*fa,fd.1lk#$" print("".join([w for w in a if w not in string.punctuation]))
Kode di bawah ini akan menghapus semua tanda baca serta karakter non abjad. Disalin dari buku mereka.
http://www.nltk.org/book/ch01.html
keluaran
sumber
Seperti yang terlihat di komentar dimulai dengan sent_tokenize (), karena word_tokenize () hanya berfungsi pada satu kalimat. Anda dapat memfilter tanda baca dengan filter (). Dan jika Anda memiliki string unicode, pastikan itu adalah objek unicode (bukan 'str' yang dikodekan dengan beberapa pengkodean seperti 'utf-8').
sumber
word_tokenize
adalah fungsi yang mengembalikan[token for sent in sent_tokenize(text, language) for token in _treebank_word_tokenize(sent)]
. Jadi saya pikir jawaban Anda adalah melakukan apa yang sudah dilakukan nltk: menggunakansent_tokenize()
sebelum menggunakanword_tokenize()
. Setidaknya ini untuk nltk3.did
dann't
tetapi tidak.
Saya baru saja menggunakan kode berikut, yang menghapus semua tanda baca:
sumber
Saya pikir Anda memerlukan semacam pencocokan ekspresi reguler (kode berikut ada di Python 3):
Keluaran:
Seharusnya berfungsi dengan baik dalam banyak kasus karena ini menghapus tanda baca sambil mempertahankan token seperti "n't", yang tidak dapat diperoleh dari tokenizers regex seperti
wordpunct_tokenize
.sumber
...
dan--
sambil mempertahankan kontraksi, yangs.translate(None, string.punctuation)
tidak akanDengan tulus bertanya, apa itu kata? Jika asumsi Anda adalah bahwa sebuah kata hanya terdiri dari karakter abjad, Anda salah karena kata-kata seperti
can't
akan dihancurkan menjadi beberapa bagian (sepertican
dant
) jika Anda menghapus tanda baca sebelum tokenisasi , yang sangat mungkin mempengaruhi program Anda secara negatif.Karenanya, solusinya adalah dengan melakukan tokenisasi dan kemudian menghapus token tanda baca .
... dan kemudian jika Anda mau, Anda dapat mengganti token tertentu seperti
'm
denganam
.sumber
Saya menggunakan kode ini untuk menghapus tanda baca:
Dan jika Anda ingin memeriksa apakah token adalah kata bahasa Inggris yang valid atau tidak, Anda mungkin memerlukan PyEnchant
Tutorial:
sumber
word_tokenize
menggunakan tokenizer standarTreebankWordTokenizer
,, yang membagi kontraksi (misalnyacan't
ke (ca
,n't
). Namunn't
bukan alfanumerik dan tersesat dalam prosesnya.Hapus tanda baca (Ini akan menghapus. Serta bagian dari penanganan tanda baca menggunakan kode di bawah ini)
Contoh Masukan / Keluaran:
['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']
sumber
Hanya menambahkan solusi dengan @rmalouf, ini tidak akan menyertakan angka apa pun karena \ w + sama dengan [a-zA-Z0-9_]
sumber
Anda dapat melakukannya dalam satu baris tanpa nltk (python 3.x).
sumber