Algoritma TF-IDF (Term Frequency – Inverse Document Frequency) adalah salah satu algoritma yang dapat digunakan untuk menganalisa hubungan antara sebuah frase/kalimat dengan sekumpulan dokumen. Contoh yang dibahas kali ini adalah mengenai penentuan urutan peringkat data berdasarkan query yang digunakan.
Inti utama dari algoritma ini adalah melakukan perhitungan nilai TF dan nilai IDF dari sebuah setiap kata kunci terhadap masing-masing dokumen. Nilai TF dihitung dengan rumus TF = jumlah frekuensi kata terpilih / jumlah kata
dan nilai IDF dihitung dengan rumus IDF = log(jumlah dokumen / jumlah frekuensi kata terpilih)
. Selanjutnya adalah melakukan perkalian antara nilai TF dan IDF untuk mendapatkan jawaban akhir.
Diasumsikan data kalimat yang tersedia adalah sebagai berikut:
Isi kalimat |
---|
Saya suka sama suami situ sebab suami situ suka senyum-senyum sama saya. |
Santapan kita setiap jam setengah satu siang satu soto sapi sama seratus tusuk sate sapi pula. |
Saya sebal sama situ sebab situ suka senyum-senyum sama suami saya sehingga suami saya suka senyum-senyum sendiri saja. |
Sempat-sempatnya semut-semut itu saling senyum-senyum dan salam-salaman sama semut-semut yang mau senyum-senyum dan salam-salaman sama semut-semut itu. |
Contoh data awal adalah sebagai berikut:
Dim daftarDokumen As New List(Of String) daftarDokumen.Add("Saya suka sama suami situ sebab suami situ suka senyum-senyum sama saya.") daftarDokumen.Add("Santapan kita setiap jam setengah satu siang satu soto sapi sama seratus tusuk sate sapi pula.") daftarDokumen.Add("Saya sebal sama situ sebab situ suka senyum-senyum sama suami saya sehingga suami saya suka senyum-senyum sendiri saja.") daftarDokumen.Add("Sempat-sempatnya semut-semut itu saling senyum-senyum dan salam-salaman sama semut-semut yang mau senyum-senyum dan salam-salaman sama semut-semut itu.")
Dan query data yang digunakan adalah
Isi kalimat |
---|
Sapi saling suka |
Contoh data baru adalah sebagai berikut:
Dim query As String = "Sapi saling suka"
Langkah-langkah penggunaan algoritma ini adalah
1. Lakukan proses tokenizing dan lowercase pada masing-masing dokumen dan query
Setiap kata akan dijadikan huruf kecil semua,
dan kemudian dilakukan proses penghilangan tanda baca
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini
For i As Integer = 0 To daftarDokumen.Count - 1 daftarDokumen(i) = Tokenizing(daftarDokumen(i).ToLower) Next query = Tokenizing(query.ToLower)
* Gunakan fungsi ini untuk menghilangkan tanda baca
Tanda baca yang diperhitungkan adalah:
titik ,koma, titik koma, titik dua, hubung -, tanda tanya, tanda seru, kurung biasa (), kurung kotak [], kurung kurawal {}, tanda petik satu, tanda petik ganda, garis miring
Public Function Tokenizing(ByVal input As String) As String input = input.Replace(".", "") input = input.Replace(",", "") input = input.Replace(":", "") input = input.Replace("-", " ") input = input.Replace("?", "") input = input.Replace("!", "") input = input.Replace("(", "") input = input.Replace(")", "") input = input.Replace("[", "") input = input.Replace("]", "") input = input.Replace("{", "") input = input.Replace("}", "") input = input.Replace("'", "") input = input.Replace("""", "") input = input.Replace("/", "") Return input End Function
2. Hitung jumlah dari masing-masing kata yang terdapat pada masing-masing dokumen
Sebagai contoh jika dokumen berisi kalimat “hati hati ya”
Maka jumlah kata “hati” adalah 2, dan jumlah kata “ya” adalah 1
jumlahKataPerDokumen(i) = New List(Of JumlahKata) Dim daftarKata As String() = daftarDokumen(i).Split(" ") Dim cekKata As New List(Of String) For j As Integer = 0 To daftarKata.Count - 1 If Not cekKata.Contains(daftarKata(j)) Then Dim jumlah As Integer = 0 For k As Integer = 0 To daftarKata.Count - 1 If daftarKata(j) = daftarKata(k) Then jumlah += 1 Next jumlahKataPerDokumen(i).Add(New JumlahKata(daftarKata(j), jumlah)) cekKata.Add(daftarKata(j)) End If Next
3. Hitung nilai TF dengan rumus
TF = jumlah frekuensi kata terpilih / jumlah kata
For j As Integer = 0 To daftarKataQuery.Count - 1 Dim frekuensi As Integer = 0 For k As Integer = 0 To jumlahKataPerDokumen(i).Count - 1 If daftarKataQuery(j) = jumlahKataPerDokumen(i)(k).kata Then frekuensi = jumlahKataPerDokumen(i)(k).jumlah Exit For End If Next TF(i).Add(frekuensi / daftarKata.Length) Next
4. Hitung IDF dengan rumus
IDF = log(jumlah dokumen / jumlah frekuensi kata terpilih)
Dim frekuensiDokumen(daftarKataQuery.Count - 1) As Integer For i As Integer = 0 To daftarDokumen.Count - 1 For j As Integer = 0 To daftarKataQuery.Count - 1 If TF(i)(j) > 0 Then frekuensiDokumen(j) += 1 Next Next For j As Integer = 0 To daftarKataQuery.Count - 1 IDF(j) = Math.Log10(daftarDokumen.Count / frekuensiDokumen(j)) Next
5. Nilai jawaban dilakukan dengan cara melakukan perkalian antara nilai TF dan nilai IDF
Tampilkan hasil jawaban akhir pada layar
For i As Integer = 0 To daftarDokumen.Count - 1 For j As Integer = 0 To daftarKataQuery.Count - 1 Console.WriteLine("Nilai TF-IDF untuk kata " & daftarKataQuery(j).PadRight(8) & " terhadap dokumen " & (i + 1) & " adalah " & (TF(i)(j) * IDF(j)).ToString("F4")) Next Next
Hasil akhir adalah: (klik untuk perbesar gambar)
Contoh modul / source code dalam bahasa VB (Visual Basic) dapat didownload disini:
Jika membutuhkan jasa kami dalam pembuatan program, keterangan selanjutnya dapat dilihat di Fasilitas dan Harga
Jika ada yang kurang paham dengan langkah-langkah algoritma diatas, silahkan berikan komentar Anda.
Selamat mencoba.
bisa dibuat contohnya dengan aplikasi delphi nggak mas
Saya tidak memahami bahasa tersebut, tetapi skrip yang saya rancang adalah murni skrip (tidak bergantung pada fungsi-fungsi tertentu yang disediakan oleh perangkat lunak), sehingga tentunya dapat dikonversi ke dalam bahasa apapun setelah memahami konsep dari algoritmanya.
apakah tf idf ini tingkat kesulitan nya sulit ?
Menurut pendapat saya algoritma ini termasuk dalam kategori mudah untuk diimplementasikan
bagaimana jika ada penggunaan kata sinonim pada data awal dan query semisal pada data awal terdapat kata ‘samasama’ dan pada query terdapat kata ‘saling’
Algoritma ini tidak mengenal sinonim sehingga kedua kata tersebut dikategorikan menjadi 2 kata yang berbeda dan dihitung terpisah.
Apakah algoritma ini cocok digunakan untuk sistem koreksi essay otomatis ?
Seperti yang terlihat pada screenshot hasil implementasi, hasil utama perhitungan adalah mengetahui nilai dari masing-masing kata dalam query terhadap dokumen, sehingga tidak digunakan untuk melakukan koreksi terhadap kata dalam dokumen.