Proses Stemming adalah proses pencarian kata dasar dari kata yang memiliki imbuhan. Salah satu metode stemming yang dapat digunakan adalah metode yang dikembangkan oleh Arifin.
Sebelum masuk kedalam langkah-langkah pembahasan algoritma, sistem membutuhkan daftar kata dasar, mirip seperti kamus, dan juga daftar kata stopword. Kedua data ini didapatkan dengan cara membaca teks file dari data yang bersangkutan.
* Untuk dapat menggunakan skrip ini, maka file teks kamus dan stopwords harus dimasukkan ke dalam proyek sebagai resources.
Dim kamus() As String = My.Resources.kamus.Split("|") Dim stopwords() As String = My.Resources.stopwords.Split("|")
Langkah-langkah penggunaan algoritma ini adalah
1. Lakukan proses pembuangan tanda baca dan karakter spesial dari kalimat input
input = Tokenizing(input.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. Lakukan pemisahan kata berdasarkan karakter spasi
Dim daftarInput() As String = input.Split(" ")
3. Lakukan perhitungan pada semua kata dalam input
Jika kata tersebut merupakan stop word, maka tidak perlu melakukan proses stemming
hal ini hanya dilakukan untuk memudahkan pembacaan saja
If isStopWord(daftarInput(i), stopwords) Then Console.Write("-".PadRight(15) & "(terdeteksi sebagai stopword)") . . .
* Gunakan fungsi ini untuk mengetahui apakah input teks merupakan stop word atau tidak
Public Function isStopWord(ByVal input As String, ByVal stopwords() As String) As Boolean For j As Integer = 0 To stopwords.Length - 1 If input = stopwords(j) Then Return True End If Next Return False End Function
4. lakukan proses stemming dari kata tersebut
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini (poin 4a – 4d)
Dim tmpTeks As String = s.stemming(daftarInput(i), kamus)
Memasuki perhitungan utama dari proses stemming
Berdasarkan teori stemming ini, maka sebuah kata akan selalu terdiri dari susunan
awalan 1 + awalan 2 + kata dasar + akhiran 3 + akhiran 2 + akhiran 1
4a. Lakukan pengecekan apakah input kata sudah tersedia dalam kamus
If kamus.Contains(kata) Then Return kata . . .
* Gunakan fungsi ini untuk mengecek input kata pada kamus
Public Function cekKamus(kata As String, kamus_arr As String()) As Boolean Dim ada As Boolean = False If kamus_arr.Contains(kata) Then ada = True End If Return ada End Function
4b. Dapatkan semua awalan, akhiran dan kata dasar dari kata tersebut
ingat bahwa kata akan selalu terdiri dari susunan
AW I + AW II + KD + AKH III + AKH II + AKH I
Dim awalan As String() = potongAwalan(kata) Dim akhiran As String() = potongAkhiran(kata) Dim panjang2Awalan As Integer = awalan(0).Length + awalan(1).Length Dim panjang3Akhiran As Integer = akhiran(0).Length + akhiran(1).Length + akhiran(2).Length Dim kataDasar As String = kata.Substring(panjang2Awalan, kata.Length - (panjang3Akhiran + panjang2Awalan))
* Gunakan fungsi ini untuk mendapatkan semua awalan dari sebuah kata
Public Function potongAwalan(kata As String) As String() 'lakukan konversi menjadi huruf kecil kata = kata.ToLower() Dim awalan1 As String() = New String() {"me", "di", "ke", "pe", "se", "be"} Dim awalan2 As String() = New String() {"bel", "ber", "ter", "per"} Dim _2hurufAwal As String = kata.Substring(0, 2) Dim awalan As String() = New String() {"", ""} For i As Integer = 0 To 1 Dim awalanTmp As String = "" If _2hurufAwal = "me" OrElse _2hurufAwal = "pe" Then awalanTmp = potongAwalanMe(kata) ElseIf _2hurufAwal = "be" Then awalanTmp = potongAwalanBe(kata) Else awalanTmp = potongAwalanLainnya(kata) End If If awalanTmp <> "" Then 'deklarasi ulang kata dan _2hurufAwal Dim pjgAwalan As Integer = awalanTmp.Length kata = kata.Substring(pjgAwalan, kata.Length - pjgAwalan) _2hurufAwal = kata.Substring(0, 2) If awalan2.Contains(awalanTmp) Then ' jika awalan[1] sudah ada isinya masukkan ke awalan[1]; 'if(awalan[1] != ""){ 'awalan[0] = awalanTmp; ' } 'else awalan(1) = awalanTmp Else ' pengecekan dilakukan untuk menangani kata yang berawalan ke seperti kerja, kemul, kemudan dll If awalan(0) = "" Then awalan(0) = awalanTmp Else awalan(1) = awalanTmp End If End If End If Next Return awalan End Function
* Gunakan fungsi ini untuk mendapatkan semua akhiran dari sebuah kata
Public Function potongAkhiran(kata As String) As String() 'lakukan konversi menjadi huruf kecil kata = kata.ToLower() Dim akhiran1 As String() = New String() {"lah", "kah", "pun", "tah"} Dim akhiran2 As String() = New String() {"ku", "mu", "nya"} Dim akhiran3 As String() = New String() {"i", "an", "kan"} Dim akhir As String() = New String() {"", "", ""} Dim _3hurufAkhir As String = kata.Substring(kata.Length - 3) Dim _2hurufAkhir As String = kata.Substring(kata.Length - 2) Dim _1hurufAkhir As String = kata.Substring(kata.Length - 1) For i As Integer = 0 To 2 If i = 0 Then If akhiran1.Contains(_3hurufAkhir) Then akhir(i) = _3hurufAkhir 'potong kata kata = kata.Substring(0, kata.Length - 3) 'deklarasi ulang akhiran _3hurufAkhir = kata.Substring(kata.Length - 3) _2hurufAkhir = kata.Substring(kata.Length - 2) _1hurufAkhir = kata.Substring(kata.Length - 1) End If ElseIf i = 1 Then If akhiran2.Contains(_3hurufAkhir) Then akhir(i) = _3hurufAkhir 'potong kata kata = kata.Substring(0, kata.Length - 3) 'deklarasi ulang akhiran _3hurufAkhir = kata.Substring(kata.Length - 3) _2hurufAkhir = kata.Substring(kata.Length - 2) _1hurufAkhir = kata.Substring(kata.Length - 1) ElseIf akhiran2.Contains(_2hurufAkhir) Then akhir(i) = _2hurufAkhir 'potong kata kata = kata.Substring(0, kata.Length - 2) 'deklarasi ulang akhiran _3hurufAkhir = kata.Substring(kata.Length - 3) _2hurufAkhir = kata.Substring(kata.Length - 2) _1hurufAkhir = kata.Substring(kata.Length - 1) End If Else If akhiran3.Contains(_3hurufAkhir) Then akhir(i) = _3hurufAkhir ElseIf akhiran3.Contains(_2hurufAkhir) Then akhir(i) = _2hurufAkhir ElseIf akhiran3.Contains(_1hurufAkhir) Then akhir(i) = _1hurufAkhir End If End If Next Return akhir End Function
4c. lakukan pengecekan apakah terjadi perubahan kata ketika kata dasar mendapatkan awalan me atau pe
* Jika awalan memiliki 2 huruf akhir “ng”, maka lakukan percobaan penambahan huruf “k” sebelum kata dasar
* Jika awalan memiliki 2 huruf akhir “ny”, maka lakukan percobaan penambahan huruf “s” sebelum kata dasar
* Jika awalan memiliki 1 huruf akhir “m”, maka lakukan percobaan penambahan huruf “p” sebelum kata dasar
* Jika awalan memiliki 1 huruf akhir “n”, maka lakukan percobaan penambahan huruf “t” sebelum kata dasar
Dim _2hurufAwalAwalan As String = "" Dim _2hurufAkhirAwalan As String = "" Dim _1hurufAkhirAwalan As String = "" If awalan(0).Length >= 2 Then _2hurufAwalAwalan = awalan(0).Substring(0, 2) _2hurufAkhirAwalan = awalan(0).Substring(awalan(0).Length - 2) End If If awalan(0).Length >= 1 Then _1hurufAkhirAwalan = awalan(0).Substring(awalan(0).Length - 1) End If Dim tempKataDasar As String If _2hurufAkhirAwalan = "ng" Then tempKataDasar = Convert.ToString("k") & kataDasar If cekKamus(tempKataDasar, kamus) Then Return tempKataDasar End If End If If _2hurufAkhirAwalan = "ny" Then tempKataDasar = Convert.ToString("s") & kataDasar If cekKamus(tempKataDasar, kamus) Then Return tempKataDasar End If End If If _1hurufAkhirAwalan = "m" Then ' tambahkan dengan huruf p tempKataDasar = Convert.ToString("p") & kataDasar If cekKamus(tempKataDasar, kamus) Then Return tempKataDasar End If End If If _1hurufAkhirAwalan = "n" Then ' tambahkan dengan huruf t tempKataDasar = Convert.ToString("t") & kataDasar If cekKamus(tempKataDasar, kamus) Then Return tempKataDasar End If End If
4d. Selanjutnya adalah melakukan pengecekan susunan berdasarkan setiap kemungkinan awalan dan akhiran dari kata tersebut
* AW II.KD.AKH III.AKH II.AKH I
* KD + AK III + AK II + AK I
* KD + AK III + AK II
* KD + AK III
* KD
* AW I.KD
* AW I.AW II.KD
* AW I.AW II.KD.AKH III
* AW I.AW II.KD.AKH III.AKH II
* AW I.AW II.KD.AKH III.AKH II.AKH I
* AW II.KD
* AW II.KD.AKH III
* AW II.KD.AKH III.AKH II
tempKataDasar = awalan(1) + kataDasar + akhiran(2) + akhiran(1) + akhiran(0) If cekKamus(tempKataDasar, kamus) Then Return tempKataDasar End If tempKataDasar = kataDasar + akhiran(2) + akhiran(1) + akhiran(0) If cekKamus(tempKataDasar, kamus) Then Return tempKataDasar End If tempKataDasar = kataDasar + akhiran(2) + akhiran(1) If cekKamus(tempKataDasar, kamus) Then Return tempKataDasar End If tempKataDasar = kataDasar + akhiran(2) If cekKamus(tempKataDasar, kamus) Then Return tempKataDasar End If If cekKamus(kataDasar, kamus) Then Return kataDasar End If tempKataDasar = awalan(0) + kataDasar If cekKamus(tempKataDasar, kamus) Then Return tempKataDasar End If tempKataDasar = awalan(0) + awalan(1) + kataDasar If cekKamus(tempKataDasar, kamus) Then Return tempKataDasar End If tempKataDasar = awalan(0) + awalan(1) + kataDasar + akhiran(2) If cekKamus(tempKataDasar, kamus) Then Return tempKataDasar End If tempKataDasar = awalan(0) + awalan(1) + kataDasar + akhiran(2) + akhiran(1) If cekKamus(tempKataDasar, kamus) Then Return tempKataDasar End If tempKataDasar = awalan(1) + kataDasar If cekKamus(tempKataDasar, kamus) Then Return tempKataDasar End If tempKataDasar = awalan(1) + kataDasar + akhiran(2) If cekKamus(tempKataDasar, kamus) Then Return tempKataDasar End If tempKataDasar = awalan(1) + kataDasar + akhiran(2) + akhiran(1) If cekKamus(tempKataDasar, kamus) Then Return tempKataDasar End If
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.