Stemming Nazief & Andriani 2


Proses Stemming adalah proses pencarian kata dasar dari kata yang memiliki imbuhan. Salah satu metode stemming yang dapat digunakan adalah metode yang dikembangkan oleh Nazief & Andriani.



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(" ")

* Lakukan inisialisasi variabel yang digunakan oleh metode ini

Dim s As New StemmingNaziefAndriani(kamus)

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 – 4e)

Dim tmpTeks As String = s.stemming(daftarInput(i))

Memasuki perhitungan utama dari proses stemming
Berdasarkan teori stemming ini, maka ada 3 tahapan proses untuk mendapatkan kata dasar, yaitu
* Proses penghapusan infleksional suffiks
* Proses penghapusan derivation suffiks
* Proses penghapusan derivation prefiks

4a. Lakukan pengecekan apakah input kata sudah tersedia dalam kamus

If daftarKataKamus.Contains(kata) Then
	Return akarKata
	. . .

* Lakukan proses penghapusan Infleksional Suffixes, Derivation Suffiks, dan Derivation Prefiks pada kata tersebut (poin 4b – 4d)

hapusInfleksionalSuffiks()
hapusDerivationSuffiks()
hapusDerivationPrefiks()

4b. proses penghapusan Infleksional Suffixes
merupakan proses menghapus partikel suffiks -lah,-kah,-nya,-tah,-pun,-ku,-mu
jika kata dasar ditemukan pada kamus maka perhitungan akan dihentikan

Public Overridable Sub hapusInfleksionalSuffiks()
	' akhiran -lah, -kah, -nya, -tah, -pun
	If kata.EndsWith("lah") OrElse kata.EndsWith("kah") OrElse kata.EndsWith("nya") OrElse kata.EndsWith("tah") OrElse kata.EndsWith("pun") Then
		kata = kata.Substring(0, kata.Length - 3)
		If daftarKataKamus.Contains(kata) Then
			akarKata = kata
			Return
		End If

		' akhiran -ku, -mu
	ElseIf kata.EndsWith("ku") OrElse kata.EndsWith("mu") Then
		kata = kata.Substring(0, kata.Length - 2)
		If daftarKataKamus.Contains(kata) Then
			akarKata = kata
			Return
		End If
	End If
End Sub

4c. proses penghapusan Derivation Suffixes
merupakan proses menghapus partikel suffiks -i,-an,-kan
jika kata dasar ditemukan pada kamus maka perhitungan akan dihentikan

Public Overridable Sub hapusDerivationSuffiks()
	Dim kataAsal As String = kata

	' akhiran -i
	If kata.EndsWith("i") Then
		kata = kata.Substring(0, kata.Length - 1)
		If daftarKataKamus.Contains(kata) Then
			akarKata = kata
			Return
		End If

		kata = kataAsal

		' akhiran -an
	ElseIf kata.EndsWith("an") Then
		kata = kata.Substring(0, kata.Length - 2)
		If daftarKataKamus.Contains(kata) Then
			akarKata = kata
			Return
		End If

		kata = kataAsal

		' akhiran -kan
		If kata.EndsWith("kan") Then
			kata = kata.Substring(0, kata.Length - 3)
			If daftarKataKamus.Contains(kata) Then
				akarKata = kata
				Return
			End If
		End If

		kata = kataAsal
	End If
End Sub

4d. proses penghapusan Derivation Prefixes
merupakan proses menghapus beberapa partikel prefiks
jika kata dasar ditemukan pada kamus maka perhitungan akan dihentikan
Urutan proses pengecekan yang dilakukan adalah
* Tipe awalan ke 1 : di-, ke-, se-
* Tipe awalan ke 1 : di-, ke-, se-, kemudian lakukan penghapusan Derivation Suffixes
* Tipe awalan ke 1a: diper-, keber-, keter-
* Tipe awalan ke 1a: diper-, keber-, keter-, kemudian lakukan penghapusan Derivation Suffixes
* Tipe awalan ke 2 : be-, te-,
* Tipe awalan ke 2 : be-, te-, kemudian lakukan penghapusan Derivation Suffixes
* Tipe awalan ke 2a: bel-, ber-, tel-, ter-
* Tipe awalan ke 2a: bel-, ber-, tel-, ter-, kemudian lakukan penghapusan Derivation Suffixes
* Tipe awalan ke 3 : me-, pe-
* Tipe awalan ke 3 : me-, pe-, kemudian lakukan penghapusan Derivation Suffixes
* Tipe awalan ke 3a : mempel-
* Tipe awalan ke 3a : mempel-, kemudian lakukan penghapusan Derivation Suffixes
* Tipe awalan ke 3b : memper-
* Tipe awalan ke 3b : memper-, kemudian lakukan penghapusan Derivation Suffixes
* Tipe awalan ke 3c : meng-, peng-
* Tipe awalan ke 3c : meng-, peng-, kemudian lakukan penghapusan Derivation Suffixes
* Tipe awalan ke 3c : meng-, peng-, kemudian tambahkan huruf k sebelum kata dasar
* Tipe awalan ke 3c : meng-, peng-, kemudian tambahkan huruf k sebelum kata dasar, dan lakukan penghapusan Derivation Suffixes
* Tipe awalan ke 3d : meny-, peny-
* Tipe awalan ke 3d : meny-, peny-, kemudian lakukan penghapusan Derivation Suffixes
* Tipe awalan ke 3d : meny-, peny-, kemudian tambahkan huruf s sebelum kata dasar
* Tipe awalan ke 3d : meny-, peny-, kemudian tambahkan huruf s sebelum kata dasar, dan lakukan penghapusan Derivation Suffixes
* Tipe awalan ke 3e : mel-, mer-, pel-, per-
* Tipe awalan ke 3e : mel-, mer-, pel-, per-, kemudian lakukan penghapusan Derivation Suffixes
* Tipe awalan ke 3f : men-, pen-
* Tipe awalan ke 3f : men-, pen-, kemudian lakukan penghapusan Derivation Suffixes
* Tipe awalan ke 3f : men-, pen-, kemudian tambahkan huruf t sebelum kata dasar
* Tipe awalan ke 3f : men-, pen-, kemudian tambahkan huruf t sebelum kata dasar, dan lakukan penghapusan Derivation Suffixes
* Tipe awalan ke 3g : mem-, pem-
* Tipe awalan ke 3g : mem-, pem-, kemudian lakukan penghapusan Derivation Suffixes
* Tipe awalan ke 3g : mem-, pem-, kemudian tambahkan huruf p sebelum kata dasar
* Tipe awalan ke 3g : mem-, pem-, kemudian tambahkan huruf p sebelum kata dasar, dan lakukan penghapusan Derivation Suffixes

Public Overridable Sub hapusDerivationPrefiks()
	Dim kataAsal As String = kata

	'4d1. tipe awalan ke 1 : di-, ke-, se-
	If (kata.StartsWith("di") OrElse kata.StartsWith("ke") OrElse kata.StartsWith("se")) AndAlso kata.Length > 2 Then
		kata = kata.Substring(2)
		If daftarKataKamus.Contains(kata) Then
			akarKata = kata
			Return
		End If

		hapusDerivationSuffiks()
		If daftarKataKamus.Contains(kata) Then
			akarKata = kata
			Return
		End If

		' Jika kata dasar tidak ditemukan, maka kembalikan menjadi kata asal untuk percobaan berikutnya
		kata = kataAsal

		' awalan diper-, keber-, keter-
		If (kata.StartsWith("diper") OrElse kata.StartsWith("keber") OrElse kata.StartsWith("keter")) AndAlso kata.Length > 5 Then
			kata = kata.Substring(5)
			If daftarKataKamus.Contains(kata) Then
				akarKata = kata
				Return
			End If

			hapusDerivationSuffiks()
			If daftarKataKamus.Contains(kata) Then
				akarKata = kata
				Return
			End If

			' Jika kata dasar tidak ditemukan, maka kembalikan menjadi kata asal untuk percobaan berikutnya
			kata = kataAsal
		End If

		'4d2. tipe awalan ke 2 : be-, te-,
	ElseIf (kata.StartsWith("be") OrElse kata.StartsWith("te")) AndAlso kata.Length > 2 Then
		kata = kata.Substring(2)
		If daftarKataKamus.Contains(kata) Then
			akarKata = kata
			Return
		End If

		hapusDerivationSuffiks()
		If daftarKataKamus.Contains(kata) Then
			akarKata = kata
			Return
		End If

		' Jika kata dasar tidak ditemukan, maka kembalikan menjadi kata asal untuk percobaan berikutnya
		kata = kataAsal

		' awalan bel-, ber-, tel-, ter-
		If (kata.StartsWith("bel") OrElse kata.StartsWith("ber") OrElse kata.StartsWith("tel") OrElse kata.StartsWith("ter")) AndAlso kata.Length > 3 Then
			kata = kata.Substring(3)
			If daftarKataKamus.Contains(kata) Then
				akarKata = kata
				Return
			End If

			hapusDerivationSuffiks()
			If daftarKataKamus.Contains(kata) Then
				akarKata = kata
				Return
			End If

			' Jika kata dasar tidak ditemukan, maka kembalikan menjadi kata asal untuk percobaan berikutnya
			kata = kataAsal
		End If

		'4d3. tipe awalan ke 3 : me-, pe-
	ElseIf (kata.StartsWith("me") OrElse kata.StartsWith("pe")) AndAlso kata.Length > 2 Then
		kata = kata.Substring(2)
		If daftarKataKamus.Contains(kata) Then
			akarKata = kata
			Return
		End If

		hapusDerivationSuffiks()
		If daftarKataKamus.Contains(kata) Then
			akarKata = kata
			Return
		End If

		' Jika kata dasar tidak ditemukan, maka kembalikan menjadi kata asal untuk percobaan berikutnya
		kata = kataAsal

		'4d3a. awalan mempel-
		If (kata.StartsWith("mempel")) AndAlso kata.Length > 6 Then
			kata = kata.Substring(6)
			If daftarKataKamus.Contains(kata) Then
				akarKata = kata
				Return
			End If

			hapusDerivationSuffiks()
			If daftarKataKamus.Contains(kata) Then
				akarKata = kata
				Return
			End If

			' Jika kata dasar tidak ditemukan, maka kembalikan menjadi kata asal untuk percobaan berikutnya
			kata = kataAsal
		End If

		'4d3b. awalan memper-
		If (kata.StartsWith("memper")) AndAlso kata.Length > 6 Then
			kata = kata.Substring(6)
			If daftarKataKamus.Contains(kata) Then
				akarKata = kata
				Return
			End If

			hapusDerivationSuffiks()
			If daftarKataKamus.Contains(kata) Then
				akarKata = kata
				Return
			End If

			' Jika kata dasar tidak ditemukan, maka kembalikan menjadi kata asal untuk percobaan berikutnya
			kata = kataAsal
		End If

		'4d3c. awalan meng-, peng-
		If (kata.StartsWith("meng") OrElse kata.StartsWith("peng")) AndAlso kata.Length > 4 Then
			kata = kata.Substring(4)
			If daftarKataKamus.Contains(kata) Then
				akarKata = kata
				Return
			End If

			hapusDerivationSuffiks()
			If daftarKataKamus.Contains(kata) Then
				akarKata = kata
				Return
			End If

			' Jika kata dasar tidak ditemukan, maka kembalikan menjadi kata asal untuk percobaan berikutnya
			kata = kataAsal

			' tambahkan "k" pada awal kata
			kata = "k" & kata.Substring(4)
			If daftarKataKamus.Contains(kata) Then
				akarKata = kata
				Return
			End If

			hapusDerivationSuffiks()
			If daftarKataKamus.Contains(kata) Then
				akarKata = kata
				Return
			End If

			' Jika kata dasar tidak ditemukan, maka kembalikan menjadi kata asal untuk percobaan berikutnya
			kata = kataAsal
		End If

		'4d3d. awalan meny-, peny-
		If (kata.StartsWith("meny") OrElse kata.StartsWith("peny")) AndAlso kata.Length > 4 Then
			kata = kata.Substring(4)
			If daftarKataKamus.Contains(kata) Then
				akarKata = kata
				Return
			End If

			hapusDerivationSuffiks()
			If daftarKataKamus.Contains(kata) Then
				akarKata = kata
				Return
			End If

			' Jika kata dasar tidak ditemukan, maka kembalikan menjadi kata asal untuk percobaan berikutnya
			kata = kataAsal

			' tambahkan "s" pada awal kata
			kata = "s" & kata.Substring(4)
			If daftarKataKamus.Contains(kata) Then
				akarKata = kata
				Return
			End If

			hapusDerivationSuffiks()
			If daftarKataKamus.Contains(kata) Then
				akarKata = kata
				Return
			End If

			' Jika kata dasar tidak ditemukan, maka kembalikan menjadi kata asal untuk percobaan berikutnya
			kata = kataAsal
		End If

		'4d3e. awalan mel-, mer-, pel-, per-
		If (kata.StartsWith("mel") OrElse kata.StartsWith("mer") OrElse kata.StartsWith("pel") OrElse kata.StartsWith("per")) AndAlso kata.Length > 3 Then
			kata = kata.Substring(3)
			If daftarKataKamus.Contains(kata) Then
				akarKata = kata
				Return
			End If

			hapusDerivationSuffiks()
			If daftarKataKamus.Contains(kata) Then
				akarKata = kata
				Return
			End If

			' Jika kata dasar tidak ditemukan, maka kembalikan menjadi kata asal untuk percobaan berikutnya
			kata = kataAsal
		End If

		'4d3f. awalan men-, pen-
		If (kata.StartsWith("men") OrElse kata.StartsWith("pen")) AndAlso kata.Length > 3 Then
			kata = kata.Substring(3)
			If daftarKataKamus.Contains(kata) Then
				akarKata = kata
				Return
			End If

			hapusDerivationSuffiks()
			If daftarKataKamus.Contains(kata) Then
				akarKata = kata
				Return
			End If

			' Jika kata dasar tidak ditemukan, maka kembalikan menjadi kata asal untuk percobaan berikutnya
			kata = kataAsal

			' tambahkan "t" pada awal kata
			kata = "t" & kata.Substring(3)
			If daftarKataKamus.Contains(kata) Then
				akarKata = kata
				Return
			End If

			hapusDerivationSuffiks()
			If daftarKataKamus.Contains(kata) Then
				akarKata = kata
				Return
			End If

			' Jika kata dasar tidak ditemukan, maka kembalikan menjadi kata asal untuk percobaan berikutnya
			kata = kataAsal
		End If

		'4d3g. awalan mem-, pem-
		If (kata.StartsWith("mem") OrElse kata.StartsWith("pem")) AndAlso kata.Length > 3 Then
			kata = kata.Substring(3)
			If daftarKataKamus.Contains(kata) Then
				akarKata = kata
				Return
			End If

			hapusDerivationSuffiks()
			If daftarKataKamus.Contains(kata) Then
				akarKata = kata
				Return
			End If

			' Jika kata dasar tidak ditemukan, maka kembalikan menjadi kata asal untuk percobaan berikutnya
			kata = kataAsal

			' tambahkan "p" pada awal kata
			kata = "p" & kata.Substring(3)
			If daftarKataKamus.Contains(kata) Then
				akarKata = kata
				Return
			End If

			hapusDerivationSuffiks()
			If daftarKataKamus.Contains(kata) Then
				akarKata = kata
				Return
			End If

			' Jika kata dasar tidak ditemukan, maka kembalikan menjadi kata asal untuk percobaan berikutnya
			kata = kataAsal
		End If
	End If
End Sub


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 *

2 pemikiran di “Stemming Nazief & Andriani