Algoritma NMF (Non-Negative Matrix Factorization)

Algoritma NMF (Non-Negative Matrix Factorization) 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.



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 input As New List(Of String)
input.Add("Saya suka sama suami situ sebab suami situ suka senyum-senyum sama saya.")
input.Add("Santapan kita setiap jam setengah satu siang satu soto sapi sama seratus tusuk sate sapi pula.")
input.Add("Saya sebal sama situ sebab situ suka senyum-senyum sama suami saya sehingga suami saya suka senyum-senyum sendiri saja.")
input.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 kalimat 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. Susun matriks A dan q sesuai dengan masing-masing kata yang ditemukan dalam semua kalimat (poin 2a – 2c)

2a. Lakukan perulangan pada masing-masing kalimat
Lakukan pemisahan masing-masing kata berdasarkan karakter spasi
Kemudian catat semua kata unik yang belum terdapat pada daftar kata

Dim daftarKata As New List(Of String)
For i As Integer = 0 To daftarDokumen.Count - 1
	Dim tmpKata() As String = daftarDokumen(i).Split(" ")

	For j As Integer = 0 To tmpKata.Length - 1
		Dim isTerpilih As Boolean = False

		For k As Integer = 0 To daftarKata.Count - 1
			If tmpKata(j) = daftarKata(k) Then
				isTerpilih = True
				Exit For
			End If
		Next

		If Not isTerpilih Then daftarKata.Add(tmpKata(j))
	Next
Next

2b. Lakukan pengurutan kata berdasarkan urutan alfabet
hal ini hanya dilakukan untuk memudahkan pembacaan saja

daftarKata.Sort()

2c. Lakukan perhitungan pada masing-masing kata yang ditemukan
Catat jumlah dari masing-masing kata yang terdapat dalam masing-masing kalimat

Dim tmpA(daftarKata.Count - 1)() As Double
For i As Integer = 0 To tmpA.Count - 1
	tmpA(i) = New Double(daftarDokumen.Count - 1) {}
Next

For i As Integer = 0 To daftarDokumen.Count - 1
	Dim tmpKata() As String = daftarDokumen(i).Split(" ")

	For j As Integer = 0 To tmpKata.Length - 1
		Dim idxKata As Integer = daftarKata.IndexOf(tmpKata(j))
		tmpA(idxKata)(i) += 1
	Next
Next

3. Lakukan proses dekomposisi matriks menggunakan metode non-negative matrix factorization
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini

Dim wh() As pMatrix = A.nmf(daftarKata.Count, 100, 0)
Dim W As pMatrix = wh(0)
Dim H As pMatrix = wh(1)

* Fungsi utama dari metode ini adalah untuk melakukan dekomposisi matriks sehingga memenuhi persamaan
A = WH
Pada awalnya, matriks W dan matriks H akan bernilai acak,
Kemudian nilai matriks akan diupdate agar hasilnya semakin mendekati A
Matriks H diupdate dengan menggunakan rumus
H = H * (W'A)/(W'WH)
Matriks W diupdate dengan menggunakan rumus
W = W * (AH')/(WHH')

Public Overridable Function nmf(ByVal k As Integer, ByVal n As Integer, ByVal e As Double) As pMatrix()
	Dim generator As New Random(0)

	Dim w As pMatrix = urandom(jumlahBaris, k, 1, n, generator)
	Dim h As pMatrix = urandom(k, jumlahKolom, 1, n, generator)
	Do
		w = urandom(jumlahBaris, k, 1, n, generator)
		h = urandom(k, jumlahKolom, 1, n, generator)
		For i As Integer = 0 To n - 1
			' Hitung W * H
			Dim wh As pMatrix = w.perkalianMatriks(h)
			Dim cost As Double = kuadratJarak(wh)

			' if found solution
			If cost < e Then
				Exit For
			End If

			' Lakukan update matriks fitur
			Dim wt As pMatrix = w.Transpos()
			Dim hn As pMatrix = wt.perkalianMatriks(Me)
			Dim hd As pMatrix = wt.perkalianMatriks(wh)
			h.perkalianSkalar(hn.perkalianSkalar(hd.inversiSkalar()))

			' Lakukan update matriks bobot
			Dim ht As pMatrix = h.Transpos()
			Dim wn As pMatrix = perkalianMatriks(ht)
			Dim wd As pMatrix = w.perkalianMatriks(h).perkalianMatriks(ht)
			w.perkalianSkalar(wn.perkalianSkalar(wd.inversiSkalar()))

			If Double.IsNaN(w.matriks(0)(0)) OrElse Double.IsNaN(h.matriks(0)(0)) Then
				Exit For
			End If
		Next i
	Loop While Double.IsNaN(w.matriks(0)(0)) OrElse Double.IsNaN(h.matriks(0)(0))

	Return New pMatrix() {w, h}
End Function

4. Hitung bobot Hi dengan rumus
bobot Hi* = E(Hiq) / E(Hpq)

Dim Hpq As Double = H.sum()
Dim bobotHi(daftarKata.Count - 1) As Double
For idxKata As Integer = 0 To daftarKata.Count - 1
	Dim Hiq As Double = 0
	For idxKalimat As Integer = 0 To daftarDokumen.Count - 1
		Hiq += H.matriks(idxKata)(idxKalimat)
	Next

	bobotHi(idxKata) = Hiq / Hpq
Next

5. Hitung GRS (Generic Relevance of Sentence) dengan rumus
GRSj = E(Hij * bobot Hi*)

Dim GRSj(daftarDokumen.Count - 1) As Double
For idxKata As Integer = 0 To daftarKata.Count - 1
	For idxKalimat As Integer = 0 To daftarDokumen.Count - 1
		GRSj(idxKalimat) += H.matriks(idxKata)(idxKalimat) * bobotHi(idxKata)
	Next

Next

6. Lakukan pengurutan kalimat berdasarkan skor GRS tertinggi
Kemudian tmapilkan hasil akhir perhitungan pada layar

Dim urutan(daftarDokumen.Count - 1) As Integer
For idxKalimat As Integer = 0 To daftarDokumen.Count - 1
	urutan(idxKalimat) = idxKalimat
Next
Array.Sort(GRSj, urutan)

Console.WriteLine("Hasil akhir perhitungan: ")
For i As Integer = GRSj.Count - 1 To 0 Step -1
	Console.WriteLine("Peringkat " & GRSj.Count - i & " adalah dokumen #" & urutan(i) + 1 & " dengan nilai GRS: " & GRSj(i).ToString("F6"))
Next

Hasil akhir adalah: (klik untuk perbesar gambar)

Contoh modul / source code dalam bahasa VB (Visual Basic) dapat didownload disini:

[sdm_download id=”3990″ 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.

Comments

8 responses to “Algoritma NMF (Non-Negative Matrix Factorization)”

  1. Steven Lo Avatar
    Steven Lo

    Querynya untuk apa dong? gga dipakai ?

    1. pip Avatar
      pip

      Setelah saya teliti kembali, ternyata memang teks query dalam kasus tersebut tidak dipakai. Silahkan diabaikan untuk saat ini. Skrip ini akan saya update pada waktu mendatang.

  2. loker studio Avatar

    mau tanya kalau algoritma untuk menampilkan produk yang cocok untuk karakteristik pengguna itu menggunakan algoritma apa ya.yang cocok

    1. pip Avatar
      pip

      Tanpa mengetahui sistem tersebut secara detail saya belum dapat memberikan rekomendasi yang tepat untuk menyelesaikan permasalahan tersebut. Silahkan coba jelaskan sistem tersebut lebih lanjut.

      1. loker studioku Avatar

        System nya sebuah website yang menampilkan produk, seperti tokopedia. Harapannya produk yang muncul pada kolom rekomendasi adalah produk produk yang sering atau mirip dengan apa yg sering di cari si pengguna tersebut. Nah menampilkan produk tersebut dalam teori algoritma biasanya menggunakan algortm apa ya.

        1. pip Avatar
          pip

          Untuk permasalahan rekomendasi seperti itu anda dapat menggunakan algoritma berbasis pengelompokan seperti K-Means https://piptools.net/algoritma-k-means-clustering-2/ atau k-Nearest Neighbors https://piptools.net/algoritma-knn-k-nearest-neighbors/ , atau beberapa algoritma lainnya yang saya kategorikan sebagai algoritma berbasis pengelompokan https://piptools.net/category/algoritma/algortima-pengelompokan-klasifikasi-data/ walaupun tidak semua dapat diterapkan untuk kasus anda.

  3. yogi ari winanda Avatar
    yogi ari winanda

    misal sebuah kelas memiliki 45 siswa dengan laki-laki 27 orang dan wanita 18 orang , akan di buat sebuah kelompok kerja dengan max = 5 dan min = 4 pada setiap kelompok ,dengan jumlah laki laki dan wanita di bagi rata ,
    maka algoritma apa yang sangat cocok untuk melakukan proses tersebut

    1. pip Avatar
      pip

      Jika saya asumsikan jumlah siswa laki-laki adalah x dan jumlah siswa perempuan adalah y, maka cara yang paling mudah adalah menggunakan perbandingan x/y. Dalam kasus diatas 27/18 = 3/2, dengan kata lain akan diambil 3 laki-laki dan 2 perempuan untuk setiap kelompok kerja sampai memenuhi jumlah siswa. Jika data memiliki perbandingan yang tidak bulat, misalnya 26/19 atau 23/22, maka akan diambil secara rata terlebih dahulu (2 laki-laki 2 perempuan) dan sisanya dimasukkan hanya untuk memenuhi kuota.

      Untuk menyelesaikan permasalahan seperti ini dapat digunakan algoritma optimasi secara umum. Contoh dari algoritma optimasi dapat dilihat pada kategori terkait pada website ini https://piptools.net/category/algoritma/algoritma-optimasi/

Leave a Reply

Your email address will not be published. Required fields are marked *