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:
[sdm_download id=”3988″ fancy=”0″]
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.
