Ketika kita berhubungan dengan data teks seperti klasifikasi teks misalnya, kita tentunya harus melakukan transformasi data teks menjadi sekumpulan angka (vektor) terlebih dahulu sebelum melakukan modelling. Nah, 2 metode yang cukup populer diantaranya adalah Bag of Words dan TF-IDF. Mari kita bahas bagaimana mereka bekerja serta apa perbedaannya!
The Story
Bayangkan saja kita adalah pemilik restoran. Setiap pengunjung selesai makan, kita meminta mereka untuk menuliskan review dari segi apapun sebagai bahan evaluasi restoran. Dan setiap akhir bulan kita melakukan evaluasi berdasarkan review pengunjung. Kebetulan, bulan ini kita mendapat 3 review yang isinya seperti berikut:
Review 1: Makanan disini gurih dan enak!
Review 2: Makanan disini biasa saja.
Review 3: Makanan disini hambar dan tidak enak!
Sebagai pemilik restoran yang melek IT, kita ingin seluruh review nantinya diproses menggunakan komputer. Sayangnya oh sayangnya, komputer tidak mengerti bahasa manusia. Mereka hanya memahami angka. Oleh karena itu, kita perlu melakukan transformasi terhadap data kita dari teks menjadi sekumpulan angka yang biasa disebut vektor. Yuk, mari kita lakukan!
Bag of Words
Bag of Words (BoW) merupakan salah satu metode paling sederhana dalam mengubah data teks menjadi vektor yang dapat dipahami oleh komputer. Metode ini sejatinya hanya menghitung frekuensi kemunculan kata pada seluruh dokumen.
Mari kita ingat kembali contoh yang sudah kita baca sebelumnya.
Review 1: Makanan disini gurih dan enak!
Review 2: Makanan disini biasa saja.
Review 3: Makanan disini hambar dan tidak enak!
Pertama, kita abaikan tanda baca serta huruf kapital dari ketiga review tersebut. Kemudian kita bisa membentuk sebuah korpus / kamus kata seperti berikut.
“makanan”
“disini”
“gurih”
“dan”
“enak”
“biasa”
“saja”
“hambar”
“tidak”
Perlu diperhatikan sebelumnya, bahwa dalam membentuk korpus, kita hanya menghitung kata secara unik. Artinya, setiap kata yang berulang hanya akan ditulis sekali.
Berikutnya, mari kita hitung frekuensi kemunculan kata di korpus tersebut kepada ketiga review sebelumnya. Kita beri nilai 1 jika kata tersebut muncul pada sebuah review dan 0 jika tidak muncul.
Agar lebih mudah dalam memahminya, mari kita perhatikan tabel berikut. Perhitungan Bag of Words (BoW)
Dari tabel tersebut, akhirnya kita dapatkan vektor dari setiap review seperti berikut.
Vektor Review 1 = [1, 1, 1, 1, 1, 0, 0, 0, 0]
Vektor Review 2 = [1, 1, 0, 0, 0, 1, 1, 0, 0]
Vektor Review 3 = [1, 1, 0, 1, 1, 0, 0, 1, 1]
Itulah konsep dari Bag of Words, cukup mudah bukan? Namun, meski demikian metode ini ternyata memiliki beberapa kekurangan. Yuk mari kita ulas.
Kekurangan Bag of Words
- Ukuran korpus Bag of Words mengikuti jumlah kata unik dari seluruh dokumen. Artinya, jika nantinya terdapat berbagai kata unik baru maka ukuran korpus juga akan semakin membesar. Tentunya hal ini akan berpengaruh pada komputasi yang dibutuhkan pada saat kita melatih model machine learning.
- Seperti yang kita lihat pada tabel diatas, ada banyak angka 0 dalam vektor kita. Kondisi ini biasa juga disebut dengan sparse matrix. Hal tersebut harusnya kita hindari karena model harus menemukan informasi yang sedikit dalam ukuran data yang besar, yang tentunya juga akan membutuhkan proses komputasi lebih tinggi.
- Bag of Words menghilangkan konteks kalimat akibat tidak memperhatikan urutan kata.
TF-IDF
TF-IDF merupakan singkatan dari Term Frequency — Inverse Document Frequency. Sejatinya, TF-IDF merupakan gabungan dari 2 proses yaitu Term Frequency (TF) dan Inverse Document Frequency (IDF).
TF-IDF biasa digunakan ketika kita ingin mengubah data teks menjadi vektor namun dengan memperhatikan apakah sebuah kata tersebut cukup informatif atau tidak. Mudahnya, TF-IDF membuat kata yang sering muncul memiliki nilai yang cenderung kecil, sedangkan untuk kata yang semakin jarang muncul akan memiliki nilai yang cenderung besar. Kata yang sering muncul disebut juga Stopwords biasanya dianggap kurang penting, salah satu contohnya adalah kata hubung (yang, di, akan, dengan, dll).
Sekarang, mari kita coba aplikasikan TF-IDF terhadap 3 review yang telah kita miliki sebelumnya.
Term Frequency (TF)
Term Frequency (TF) menghitung frekuensi jumlah kemunculan kata pada sebuah dokumen. Karena panjang dari setiap dokumen bisa berbeda-beda, maka umumnya nilai TF ini dibagi dengan panjang dokumen (jumlah seluruh kata pada dokumen).
Rumus Term Frequency (TF)
Keterangan
tf = frekuensi kemunculan kata pada sebuah dokumen
Mari kita ambil contoh kalimat Review 1 untuk dihitung nilai TF nya.
Review 1: Makanan disini gurih dan enak!
- Korpus = [“makanan”, “disini”, “gurih”, “dan”, “enak”]
- Panjang kalimat = 5
Sehingga perhitungan untuk nilai TF nya menjadi:
- TF(“makanan”) = 1/5 ≈ 0.2
- TF(“disini”) = 1/5 ≈ 0.2
- TF(“gurih”) = 1/5 ≈ 0.2
- TF(“dan”) = 1/5 ≈ 0.2
- TF(“enak”) = 1/5 ≈ 0.2
Berikutnya, mari kita coba terapkan pada seluruh review dan kita formulasikan ke dalam bentuk tabel seperti berikut.
Perhitungan Term Frequency (TF)
R1, R2, R3 merupakan notasi untuk setiap Review 1, Review 2, dan Review 3. Sedangkan TF1, TF2, TF3 merupakan notasi untuk nilai Term Frequency setiap Review.
Inverse Document Frequency (IDF)
Setelah kita berhasil menghitung nilai Term Frequency, selanjutnya kita hitung nilai Inverse Document Frequency (IDF), yang merupakan nilai untuk mengukur seberapa penting sebuah kata. IDF akan menilai kata yang sering muncul sebagai kata yang kurang penting berdasarkan kemunculan kata tersebut pada seluruh dokumen. Semakin kecil nilai IDF maka akan dianggap semakin tidak penting kata tersebut, begitu pula sebaliknya.
Rumus Inverse Document Frequency (IDF)
Setiap review yang diberikan oleh pelanggan merupakan sebuah dokumen. Karena pada tulisan ini kita mempunyai 3 review, maka artinya kita mempunyai 3 dokumen.
Mari kita coba hitung nilai IDF untuk masing-masing kata pada Review 1.
Review 1: Makanan disini gurih dan enak!
- Korpus = [“makanan”, “disini”, “gurih”, “dan”, “enak”]
- Jumlah dokumen = 3
Sehingga perhitungan untuk nilai IDF nya menjadi:
- IDF(“makanan”) = $log(\frac{3} {3})$ ≈ 0
- IDF(“disini”) = $log(\frac{3} {3})$ ≈ 0
- IDF(“gurih”) = $log(\frac{3} {1})$ ≈ 0.48
- IDF(“dan”) = $log(\frac{3} {2})$ ≈ 0.18
- IDF(“enak”) = $log(\frac{3} {2})$ ≈ 0.18
Sekarang, mari kita coba terapkan pada seluruh kata dan kita lengkapi tabel TF sebelumnya seperti berikut.
Perhitungan Inverse Document Frequency (IDF)
Term Frequency — Inverse Document Frequency (TF-IDF)
Setelah kita punya TF dan IDF, berikutnya kita bisa menghitung nilai TF-IDF yang merupakan hasil perkalian dari TF dan IDF.
Rumus TF-IDF
Karena kita sudah memiliki nilai TF dan IDF untuk setiap kata, maka mari kita coba hitung nilai TF-IDF untuk setiap kata pada Review 1.
Review 1: Makanan disini gurih dan enak!
makanan
- TF(“makanan”) = 1/5 ≈ 0.2
- IDF(“makanan”) = $log(\frac{3} {3})$ ≈ 0
- TFIDF(“makanan”) = $0.2 \times0=0$
disini
- TF(“disini”) = 1/5 ≈ 0.2
- IDF(“disini”) = $log(\frac{3} {3})$ ≈ 0
- TFIDF(“disini”) = $0.2 \times0=0$
gurih
- TF(“gurih”) = 1/5 ≈ 0.2
- IDF(“gurih”) = $log(\frac{3} {1})$ ≈ 0.48
- TFIDF(“gurih”) = $0.2 \times0.48=0.095$
dan
- TF(“dan”) = 1/5 ≈ 0.2
- IDF(“dan”) = $log(\frac{3} {2})$ ≈ 0.18
- TFIDF(“makanan”) = $0.2 \times0.18=0.035$
enak
- TF(“enak”) = 1/5 ≈ 0.2
- IDF(“enak”) = $log(\frac{3} {2})$ ≈ 0.18
- TFIDF(“makanan”) = $0.2 \times0.18=0.035$
Sekarang, mari kita coba lengkapi tabel sebelumnya dengan nilai TF-IDF pada seluruh kata seperti berikut.
Perhitungan Term Frequency — Inverse Document Frequency (TF-IDF)
Note: Mungkin untuk sebagian perhitungan, angkanya tidak presisi dikarenakan tools yang saya gunakan. Semoga bisa dimaklumi dan tetap bisa diambil konsepnya 🙂
Dari tabel tersebut, akhirnya kita dapatkan vektor dari setiap review yang dinotasikan oleh TFIDF1, TFIDF2, dan TFIDF3 seperti berikut.
Vektor Review 1 = [0, 0, 0.095, 0.035, 0.035, 0, 0, 0, 0]
Vektor Review 2 = [0, 0, 0, 0, 0, 0.119, 0.119, 0, 0]
Vektor Review 3 = [0, 0, 0, 0.0293, 0.0293, 0, 0, 0.080, 0.080]
Kekurangan TF-IDF
- TF-IDF sejatinya berdasar pada Bag of Words (BoW), sehingga TF-IDF pun tidak bisa menangkap posisi teks dan semantiknya.
- TF-IDF hanya berguna sebagai fitur di level leksikal.
So, itulah perbedaan antara Bag of Words (BoW) dan TF-IDF sebagai metode untuk transformasi teks menjadi vektor. Jika ada pertanyaan, diskusi, sanggahan, kritik, maupun saran jangan pernah ragu untuk menuliskannya di kolom komentar 🙂
Sekian tulisan saya kali ini, mohon maaf apabila ada kekurangan dan salah kata, semoga bermanfaat. Terima kasih!
Yuk, belajar dan diskusi lebih lanjut tentang seputar Data Science, Artificial Intelligence, dan Machine Learning dengan gabung di discord Jakarta AI Research. Dan jangan lupa follow medium Data Folks Indonesia biar nggak ketinggalan update terbaru dari kami.