Saya mencari cara untuk membagi teks menjadi n-gram. Biasanya saya akan melakukan sesuatu seperti:
import nltk
from nltk import bigrams
string = "I really like python, it's pretty awesome."
string_bigrams = bigrams(string)
print string_bigrams
Saya sadar bahwa nltk hanya menawarkan bigrams dan trigram, tetapi apakah ada cara untuk membagi teks saya menjadi empat gram, lima gram atau bahkan seratus gram?
Terima kasih!
ingrams
yang parameter kedua adalah derajat ngram yang Anda inginkan. Apakah INI versi NLTK yang Anda gunakan? Bahkan jika tidak, inilah sumbernya EDIT: Adangrams
daningrams
di sana,ingrams
menjadi generator.Jawaban:
Jawaban berdasarkan python asli yang bagus diberikan oleh pengguna lain. Tapi inilah
nltk
pendekatannya (untuk berjaga-jaga, OP akan dihukum karena menemukan kembali apa yang sudah ada dinltk
perpustakaan).Ada modul ngram yang jarang digunakan orang
nltk
. Ini bukan karena sulit membaca ngram, tetapi melatih model berdasarkan ngrams di mana n> 3 akan menghasilkan banyak data yang jarang.sumber
sixgrams
?Saya terkejut bahwa ini belum muncul:
sumber
Hanya menggunakan alat nltk
Contoh output
Untuk menjaga agar ngrams dalam format array cukup hapus
' '.join
sumber
di sini adalah cara sederhana untuk melakukan n-gram
sumber
Orang-orang sudah menjawab dengan cukup baik untuk skenario di mana Anda membutuhkan bigrams atau trigram tetapi jika Anda membutuhkan everygram untuk kalimat dalam hal itu Anda dapat menggunakan
nltk.util.everygrams
Jika Anda memiliki batas seperti dalam kasus trigram di mana panjang maks harus 3 maka Anda dapat menggunakan param max_len untuk menentukannya.
Anda hanya dapat memodifikasi param max_len untuk mencapai apa pun gram yaitu empat gram, lima gram, enam atau bahkan seratus gram.
Solusi yang disebutkan sebelumnya dapat dimodifikasi untuk mengimplementasikan solusi yang disebutkan di atas tetapi solusi ini jauh lebih maju dari itu.
Untuk bacaan lebih lanjut klik di sini
Dan ketika Anda hanya membutuhkan gram spesifik seperti bigram atau trigram dll, Anda dapat menggunakan nltk.util.ngrams sebagaimana disebutkan dalam jawaban MAHassan.
sumber
Anda dapat dengan mudah menyiapkan fungsi Anda sendiri untuk melakukan ini menggunakan
itertools
:sumber
izip(*(islice(seq, index, None) for index, seq in enumerate(tee(s, N))))
saya tidak terlalu memahaminya.Pendekatan yang lebih elegan untuk membangun bigrams dengan built-in python
zip()
. Cukup konversikan string asli menjadi daftarsplit()
, lalu sampaikan daftar secara normal dan sekali diimbangi oleh satu elemen.sumber
Saya tidak pernah berurusan dengan nltk tetapi melakukan N-gram sebagai bagian dari beberapa proyek kelas kecil. Jika Anda ingin menemukan frekuensi semua N-gram yang terjadi dalam string, berikut adalah cara untuk melakukannya.
D
akan memberi Anda histogram kata-N Anda.sumber
collections.Counter(tuple(strparts[i:i+N]) for i in xrange(len(strparts)-N))
akan bekerja lebih cepat daripada coba-kecualiUntuk four_grams sudah ada di NLTK , berikut adalah sepotong kode yang dapat membantu Anda menuju ini:
Saya harap ini membantu.
sumber
Anda dapat menggunakan sklearn.feature_extraction.text.CountVectorizer :
output:
Anda dapat mengatur ke
ngram_size
bilangan bulat positif. Yaitu Anda dapat membagi teks menjadi empat gram, lima gram atau bahkan seratus gram.sumber
Jika efisiensi adalah masalah dan Anda harus membangun beberapa n-gram yang berbeda (hingga seratus seperti yang Anda katakan), tetapi Anda ingin menggunakan python murni saya akan lakukan:
Penggunaan:
~ Kecepatan yang sama dengan NLTK:
Repost dari jawaban saya sebelumnya .
sumber
Nltk hebat, tetapi kadang-kadang merupakan overhead untuk beberapa proyek:
Contoh penggunaan:
sumber
Anda bisa mendapatkan semua 4-6gram menggunakan kode tanpa paket lain di bawah ini:
output di bawah ini:
Anda dapat menemukan lebih banyak detail di blog ini
sumber
Setelah sekitar tujuh tahun, inilah jawaban yang lebih elegan menggunakan
collections.deque
:Keluaran:
sumber
Jika Anda menginginkan solusi iterator murni untuk string besar dengan penggunaan memori konstan:
Uji:
Keluaran:
sumber