Stop word adalah kata fungsional berfrekuensi tinggi yang sering dibuang sebelum teks dihitung, dan keputusan membuangnya menentukan bentuk kosakata model. Topik ini membahas isi daftar stop word bahasa Inggris pada NLTK, konsep kosakata yang dibangun oleh CountVectorizer dari scikit-learn, serta kondisi ketika pembuangan stop word justru merugikan. Semua potongan dijalankan pada dokumen sintetis kecil yang deterministik, sehingga setiap angka pada keluaran dapat dihitung ulang.
Stop word sebagai kata fungsional#
Stop word adalah kata yang muncul sangat sering dan berfungsi menyusun kalimat, seperti the, is, dan on, tanpa membawa banyak isi. Frekuensinya yang tinggi membuat kata-kata ini mendominasi hitungan token, sedangkan kontribusinya untuk membedakan antardokumen kecil. Daftar stop word adalah daftar kata yang disepakati untuk dikecualikan dari analisis.
NLTK menyertakan daftar stop word untuk beberapa bahasa. Daftar untuk bahasa Inggris memuat 198 kata pada versi pustaka yang terpasang di sandbox. Jalankan potongan berikut untuk melihat jumlahnya, contoh isinya, dan keputusan keanggotaan untuk beberapa kata dari dokumen pada bagian berikutnya.
from nltk.corpus import stopwords
stop = set(stopwords.words("english"))
print("jumlah stop word bahasa Inggris:", len(stop))
print("contoh 12 pertama:", sorted(stop)[:12])
untuk_cek = ["the", "report", "is", "on", "quality", "out"]
for k in untuk_cek:
print(k, "->", k in stop)jumlah stop word bahasa Inggris: 198
contoh 12 pertama: ['a', 'about', 'above', 'after', 'again', 'against', 'ain', 'all', 'am', 'an', 'and', 'any']
the -> True
report -> False
is -> True
on -> True
quality -> False
out -> TrueDaftar tersebut berisi kata-kata fungsional umum, mulai dari artikel seperti a dan the hingga preposisi seperti on dan out. Angka 198 bersifat spesifik versi pustaka, sehingga daftar pada versi NLTK lain dapat berbeda. Kata seperti report dan quality tidak ada di daftar karena keduanya membawa isi, dan pemisahan inilah yang dikerjakan oleh daftar stop word secara sistematis.
Daftar semacam ini tidak cukup dibangun dari frekuensi semata. Deretan kata paling sering pada korpus nyata memang didominasi kata fungsional, tetapi kata isi yang umum, misalnya time dan people pada korpus berita, juga berada di urutan teratas. Daftar yang disertakan NLTK dan scikit-learn disusun dengan kriteria tambahan, yakni status gramatikal kata, sehingga kata isi tetap terjaga meskipun frekuensinya tinggi.
Kosakata dari CountVectorizer#
Kosakata adalah daftar token berbeda yang dikenali model, dan CountVectorizer dari scikit-learn membangunnya saat metode fit() dijalankan. Setiap kata pada kosakata dipetakan ke satu kolom matriks hitungan, sehingga ukuran kosakata menentukan jumlah kolom. Parameter stop_words="english" menyuruhnya membuang kata yang tercantum di daftar stop word scikit-learn.
from sklearn.feature_extraction.text import CountVectorizer
dokumen = [
"the report on air quality is out",
"the report on water quality is late",
"a quality report on soil is ready",
]
cv_lengkap = CountVectorizer()
cv_lengkap.fit(dokumen)
print("kosakata lengkap :", len(cv_lengkap.vocabulary_))
print("isi kosakata :", sorted(cv_lengkap.vocabulary_))
cv_stop = CountVectorizer(stop_words="english")
cv_stop.fit(dokumen)
print("tanpa stop word :", len(cv_stop.vocabulary_))
print("isi kosakata :", sorted(cv_stop.vocabulary_))kosakata lengkap : 11
isi kosakata : ['air', 'is', 'late', 'on', 'out', 'quality', 'ready', 'report', 'soil', 'the', 'water']
tanpa stop word : 7
isi kosakata : ['air', 'late', 'quality', 'ready', 'report', 'soil', 'water']Kosakata lengkap berisi 11 kata karena kata a hanya satu huruf dan sudah dikecualikan oleh pola token bawaan scikit-learn, yaitu pola yang hanya menerima token dua huruf atau lebih. Setelah stop word dibuang, kosakata menyusut menjadi 7 kata dan hanya menyisakan pembawa isi seperti report, quality, dan water. Perhatikan bahwa kata a hilang sebelum stop word pun bekerja, karena dua penyaringan berbeda terjadi pada satu tahap.
Kapan membuang stop word merugikan#
Pembuangan stop word menghapus informasi gramatikal yang kadang justru menjadi pembeda. Frasa out of date dan up to date berbeda maknanya pada partikel out, of, up, dan to. Ketika stop word dibuang, kedua dokumen menyusut menjadi kata-kata yang identik. Jalankan potongan berikut dan perhatikan matriksnya.
from sklearn.feature_extraction.text import CountVectorizer
dokumen = [
"the checklist is out of date",
"the checklist is up to date",
]
cv_tanpa = CountVectorizer(stop_words="english")
X = cv_tanpa.fit_transform(dokumen)
print("fitur tanpa stop word :", cv_tanpa.get_feature_names_out().tolist())
print("matriks :", X.toarray().tolist())
cv_lengkap = CountVectorizer()
cv_lengkap.fit(dokumen)
print("fitur dengan stop word:", cv_lengkap.get_feature_names_out().tolist())fitur tanpa stop word : ['checklist', 'date']
matriks : [[1, 1], [1, 1]]
fitur dengan stop word: ['checklist', 'date', 'is', 'of', 'out', 'the', 'to', 'up']Matriks pada keluaran menunjukkan dua baris yang persis sama, yaitu [1, 1], padahal dokumennya menyatakan dua keadaan yang berlawanan. Dengan stop word dipertahankan, kosakata berisi 8 fitur dan kedua barisnya terbedakan oleh kata-kata fungsionalnya. Kasus serupa terjadi pada pencarian frasa utuh, misalnya mencari frasa out of date di dalam dokumen, dan pada pengenalan entitas bernama karena banyak nama lembaga memuat kata seperti of dan the. Nama seperti Department of Education kehilangan bentuknya bila kata penghubungnya dibuang, sehingga pencocokan entitas gagal meskipun kata intinya masih ada.
Aturan praktisnya menautkan keputusan pada tugas. Klasifikasi topik dan pencarian berbasis kata kunci biasanya aman dengan stop word dibuang. Klasifikasi yang bergantung pada frasa, pencarian frasa utuh, dan pipeline linguistik seperti pengenalan entitas membutuhkan stop word yang dipertahankan, karena makna barisan kata itulah yang diolah.
Kesalahan umum#
- Menganggap semua daftar stop word sama. NLTK dan scikit-learn menyimpan daftar yang berbeda, dan ukurannya berubah antarversi pustaka. Periksa daftar yang digunakan pustakanya sebelum membandingkan hasil antareksperimen.
- Membuang stop word sebelum tahap yang membutuhkannya. Pengenalan entitas dan penandaan kelas kata bekerja lebih baik dengan kalimat utuh. Jalankan tahap linguistik terlebih dahulu, lalu buang stop word untuk tahap fitur frekuensi.
- Melupakan penyeragaman huruf kecil sebelum pencocokan daftar. Kata
Thetidak ditemukan di daftar stop word yang hanya berisithe. Terapkanlower()pada token sebelum memeriksa keanggotaan daftar.
Ringkasan#
- Stop word adalah kata fungsional berfrekuensi tinggi yang mendominasi hitungan token tanpa banyak membedakan antardokumen.
- Daftar stop word NLTK untuk bahasa Inggris memuat 198 kata, sedangkan CountVectorizer menggunakan daftar scikit-learn yang berbeda.
- Kosakata CountVectorizer menyusut dari 11 menjadi 7 kata pada korpus uji setelah stop word dibuang, dengan catatan pola token bawaan juga menyingkirkan kata satu huruf.
- Membuang stop word merugikan klasifikasi berbasis frasa, pencarian frasa utuh, dan pengenalan entitas, karena makna yang dibawa kata fungsionalnya hilang.
Referensi#
- Feature extraction dari teks — scikit-learn
— Mendokumentasikan parameter
stop_words,token_pattern, dan kosakata CountVectorizer. - NLTK Documentation
— Rujukan resmi modul
nltk.corpusyang memuat daftar stopwords. - Natural Language Processing with Python — Bird, Klein & Loper, O’Reilly/NLTK — Bab 2 dan 3 membahas daftar stopwords serta normalisasi kata pada korpus.