Stemming Arifin


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.

Tinggalkan sebuah komentar

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *