Mengenal Term Frequency-Inverse Document Frequency (TF-IDF) pada Model NLP

Rina
7 min readFeb 5, 2024

--

Dalam metode Bag of Words, kita mengubah teks menjadi vektor di mana setiap elemen merepresentasikan seberapa sering suatu kata muncul dalam dokumen. Meski metode ini sederhana dan mudah dimengerti, ada beberapa kelemahan di dalamnya. Misalnya, metode ini mungkin tidak efisien dalam hal memori dan komputasi jika kita memiliki banyak kata unik. Selain itu, metode ini tidak membedakan antara kata-kata yang sering muncul namun kurang informatif dengan kata-kata yang jarang muncul namun mungkin lebih informatif.

1. Apa itu TF-IDF?

Sebagai solusi terhadap beberapa kelemahan yang dimiliki metode Bag of Words, kita bisa menggunakan metode TF-IDF (Term Frequency — Inverse Document Frequency). Metode ini dirancang untuk memberikan bobot lebih tinggi pada kata-kata yang lebih informatif atau penting dalam sebuah dokumen atau korpus.

Sampai di sini, apakah sudah mulai terasa mual dan pusing? Jangan dulu, ya. Kita akan membahas semua istilah tersebut menggunakan pendekatan yang lebih mudah. Istilah di atas terdengar sulit karena penamaannya menggunakan bahasa asing sehingga otak kita membutuhkan waktu yang sedikit lebih lama untuk memprosesnya.

Sumber: betterprogramming.pub

Pertama, kita akan membahas apa itu Term Frequency atau lebih dikenal dengan nama TF. Cara kerja TF mirip dengan metode BoW, yaitu menghitung seberapa sering suatu kata muncul dalam suatu dokumen. Namun, untuk menghitung nilai TF, kita harus membagi jumlah kemunculan kata tersebut dengan total kata dalam dokumen. Perlu kita ketahui, terdapat beberapa pendekatan yang dapat digunakan untuk menghitung nilai TF-IDF. Namun, pada kasus ini, kita akan menggunakan pendekatan yang paling sederhana dan mudah diimplementasikan. Berikut persamaan yang digunakan untuk menghitung nilai TF (Term Frequency):

Untuk mengimplementasikan rumus di atas, kita akan menggunakan contoh data review yang sama seperti metode BoW. Berikut data review yang kita gunakan sebelumnya:

Dataset oleh Penulis

Untuk menghindari penjelasan yang terlalu panjang, di buku ini hanya akan disajikan perhitungan menggunakan contoh review 1 untuk menghitung nilai TF. Terlihat pada review tersebut terdiri dari lima korpus yaitu “durian”, “di”, “kedai”, “ini”, dan “enak” sehingga penerapan rumus di atas menjadi seperti ini:

Setelah proses perhitungan pada seluruh review selesai dilakukan, maka akan diperoleh hasil seperti berikut:

Tabel di atas merupakan hasil perhitungan Term Frequency yang sudah berhasil kita lakukan. Selanjutnya, kita akan membahas apa itu Inverse Document Frequency atau IDF. Seperti namanya, invers, yang berarti terbalik, IDF digunakan untuk mengurangi bobot kata-kata yang sering muncul di seluruh dokumen dan memberikan bobot lebih kepada kata-kata yang jarang muncul. Misalnya, dalam 1000 data, kata “durian” muncul di semua review, maka, kata “durian” mungkin tidak memberikan informasi yang berarti karena muncul di mana-mana. Rumus berikut ini digunakan untuk menghitung nilai IDF:

Setiap review yang diberikan oleh pelanggan merepresentasikan sebuah dokumen. Artinya, dokumen yang kita miliki pada contoh ini sebanyak tiga dokumen yaitu review 1, 2, dan 3. Sama seperti teknik TF, kita hanya akan mengambil 1 dokumen sebagai contoh perhitungan. Hal ini untuk menghindari penjelasan yang terlalu panjang pada buku ini.

Perhitungan di atas merupakan contoh kata unik yang dimiliki oleh dokumen 1. Silakan lakukan perhitungan secara mandiri untuk dokumen 2 dan 3. Perlu diingat, kita hanya perlu menghitung kata unik yang belum pernah muncul pada dokumen sebelumnya. Setelah semua dokumen sudah berhasil dihitung, maka diperoleh hasil seperti berikut:

Sampai di tahap ini, masing-masing nilai TF dan IDF sudah kita peroleh. Namun, ini masih belum selesai. Kita masih harus menghitung nilai dari TFIDF. Nilai tersebut diperoleh dari hasil perkalian antara TF dan IDF dengan persamaan seperti berikut:

Sekarang, kita akan menggunakan dokumen review 1 untuk melakukan perhitungan TF-IDF. Ingat, untuk melakukan perhitungan nilai TF-IDF, kita hanya membutuhkan nilai TF dan IDF yang sudah kita hitung sebelumnya. Untuk mempermudah, silakan perhatikan kolom TF (R1), TF (R2), TF (R3) dan IDF pada tabel di atas. Kenapa? Karena nilai yang terdapat pada empat kolom tersebut yang akan kita gunakan untuk menghitung nilai TF-IDF. Berikut implementasi persamaan di atas pada dokumen review 1:

Perhitungan yang sama juga dilakukan pada dokumen 2 dan 3. Setelah semua dokumen selesai dihitung, maka akan diperoleh hasil seperti tabel di bawah ini:

Berdasarkan tabel di atas, vektor yang dihasilkan dari dataset review kedai durian menjadi seperti berikut:

Vektor review 1: [0, 0.096, 0.096, 0.096, 0.096, 0, 0, 0, 0, 0, 0]

Vektor review 2: [0, 0, 0, 0, 0.036, 0.096, 0.096, 0.096, 0, 0, 0]

Vektor review 3: [0, 0, 0, 0, 0, 0, 0, 0, 0.12, 0.12, 0.12]

Meski metode TF-IDF dinilai lebih baik dibanding metode BoW, namun, metode ini masih memiliki beberapa kelemahan yaitu:

  • Metode TF-IDF memerlukan perhitungan yang lebih kompleks dibandingkan dengan metode BoW
  • Tidak mempertimbangkan urutan kata: Seperti halnya metode BoW, metode TF-IDF juga tidak mempertimbangkan urutan kata dalam dokumen.
  • Tidak cocok untuk dokumen pendek: Metode TF-IDF tidak cocok untuk dokumen yang sangat pendek, karena bobot kata yang dihitung dapat menjadi tidak akurat.

2. Implementasi TF-IDF dengan Python

Melakukan perhitungan manual untuk mencari nilai TF-IDF mungkin masih terasa efektif jika data yang kita miliki masih sedikit. Bayangkan jika data yang kita miliki tidak lagi terdiri dari puluhan atau ratusan kata, namun ribuan atau bahkan jutaan kata. Tentu metode ini sudah tidak lagi efektif dan efisien untuk dilakukan. Pada bagian ini, kita akan memanfaatkan library yang dimiliki bahasa pemrograman Python untuk menyelesaikan masalah tersebut. Namun, perlu kita ingat, untuk menghitung nilai TF-IDF, kita bisa menggunakan berbagai pendekatan. Sehingga, hasil yang diperoleh melalui perhitungan manual yang sudah kita lakukan akan berbeda dengan hasil perhitungan yang dihasilkan oleh library tersebut — misalnya library Skelarn yang melakukan normalisasi L2 pada vektor TF-IDF secara default, menambahkan angka 1 pada penghitungan IDF, dan lain sebagainya. Berikut contoh kode Python yang digunakan untuk melakukan TF-IDF:

from sklearn.feature_extraction.text import TfidfVectorizer
data = [
"Durian di kedai ini enak",
"Durian montong enak tapi mahal",
"Saya ga suka durian"
]
vectorizer = TfidfVectorizer()
tfidf = vectorizer.fit_transform(data)

print("Feature names: ", vectorizer.get_feature_names_out())
print("TF-IDF Matrix: ")
print(tfidf.toarray())

Keterangan kode:

  • from sklearn.feature_extraction.text import TfidfVectorizer: mengimpor modul TfidfVectorizer dari pustaka sklearn. Modul ini digunakan untuk mengubah data teks menjadi fitur menggunakan metode TF-IDF (Term Frequency-Inverse Document Frequency).
  • data = […]: mendefinisikan data teks yang akan kita olah. Data ini berupa daftar kalimat yang akan diubah menjadi fitur menggunakan TF-IDF.
  • vectorizer = TfidfVectorizer(): membuat instance dari kelas TfidfVectorizer. Instance ini akan digunakan untuk mengubah data teks menjadi fitur.
  • tfidf = vectorizer.fit_transform(data): Metode fit_transform() digunakan untuk mempelajari kosakata dari semua dokumen dalam data, dan kemudian mengubah setiap dokumen menjadi vektor TF-IDF. Hasilnya disimpan dalam variabel tfidf, yang merupakan matrix sparse (sebagian besar elemen-elemen di dalamnya adalah nol). Setiap baris dalam matrix ini sesuai dengan dokumen dalam data, dan setiap kolom sesuai dengan suatu kata dalam kosakata.
  • print(“Feature names: “, vectorizer.get_feature_names_out()): mencetak semua kata unik atau ‘fitur’ yang dipelajari oleh TfidfVectorizer dari semua dokumen dalam data. Metode get_feature_names_out() mengembalikan list yang berisi semua fitur ini.
  • print(“TF-IDF Matrix: “): mencetak string “TF-IDF Matrix: “ ke konsol, sebagai label untuk output berikutnya.
  • print(tfidf.toarray()): mencetak matriks TF-IDF dari data kita. Matriks ini berisi nilai TF-IDF untuk setiap kata di setiap dokumen. Kita menggunakan metode toarray() untuk mengubah representasi matriks sparse yang dihasilkan oleh fit_transform menjadi array NumPy biasa, yang lebih mudah dibaca dan dipahami.
  • Jika kode tersebut berhasil dijalankan, maka output-nya seperti berikut:
  • Matriks ini memiliki 3 baris dan 11 kolom. Setiap baris dalam matriks mewakili salah satu dari 3 teks dan setiap kolom mewakili salah satu dari 11 kata unik dalam semua teks yang kita miliki. Nama fitur (atau kata) ditunjukkan oleh ‘Feature names’.
  • Misalnya, kata “di” (kolom pertama) memiliki skor TF-IDF 0.50461134 dalam teks pertama (baris pertama), tetapi tidak muncul dalam teks kedua dan ketiga (0 pada baris kedua dan ketiga).
  • Selain itu, kata “durian” (kolom kedua) muncul di semua teks, oleh karena itu skor TF-IDF-nya lebih rendah (0.29803159 dan 0.32274454), mencerminkan fakta bahwa kata tersebut umum di seluruh teks.

Sampai di sini, apakah penjelasan di atas dapat dipahami dengan baik? Kalo belum, ga perlu bersedih. Kita cukup memahami ulang penjelasan di atas, bukan menyerah kemudian mengutuk keadaan. Mual dan pusing ketika belajar merupakan bentuk respon jika otak yang kita miliki digunakan untuk berpikir, bukan tanda jika kita adalah manusia yang bodoh :)

Sebagai pengingat untuk diri sendiri, jangan pernah lelah dan bosan untuk belajar. Orang yang kita sayangi memiliki potensi untuk meninggalkan dan mengecewakan. Namun pengetahuan, akan menjadi teman hidup yang paling setia. Dalam dunia yang dinamis ini, di mana tren baru selalu muncul dan teknologi terus berkembang, pengetahuan adalah aset yang tidak hanya memberi kita kekuatan, tetapi juga keamanan dan kemandirian. Setiap informasi baru yang kita serap, setiap keterampilan yang kita kembangkan, menyumbang pada pertumbuhan pribadi dan profesional kita.

--

--

Responses (1)