PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
SISTEM PEMEROLEHAN INFORMASI KARYA ILMIAH BERBASIS CLUSTER DENGAN G-MEANS CLUSTERING
SKRIPSI Diajukan untuk memenuhi salah satu syarat memperoleh gelar Sarjana Teknik Informatika (S.Kom.) Program Studi Teknik Informatika
Disusun Oleh : AGUSTINUS AGRI ARDYAN NIM
: 125314109
PROGRAM STUDI TEKNIK INFORMATIKA JURUSAN TEKNIK INFORMATIKA FAKULTAS SAINS DAN TEKNOLOGI UNIVERSITAS SANATA DHARMA YOGYAKARTA 2016
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
CLUSTER BASED INFORMATION RETRIEVAL SYSTEM FOR SCIENTIFIC PAPER RETRIEVAL USING G-MEANS CLUSTERING
THESIS Presented as partial fulfillment of the requirements To obtain the Bachelor Degree of Computer (S.Kom.) In Informatics Engineering
Written by : AGUSTINUS AGRI ARDYAN NIM
: 125314109
DEPARTMENT OF INFORMATICS ENGINEERING FACULTY OF SCIENCE AND TECHNOLOGY SANATA DHARMA UNIVERSITY YOGYAKARTA 2016
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
HALAMAN MOTTO
- Ad maiorem Dei gloriam -
vi
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
HALAMAN PERSEMBAHAN
Penelitian ini dipersembahkan untuk : Allah Bapa, Putera dan Roh Kudus atas berkat dan bimbinganNya Kedua orangtuaku, Mikael ‘Pae’ Santosa dan Fransiska ‘Ibuk’ Tasri Aryani yang dengan sabar selalu membimbing langkahku Adikku, Philipus ‘Bro' Agri Adhiatma, yang selalu menghibur setiap saat Teman-teman Teknik Informatika yang selalu suportif dan memberikan banyak sekali pengalaman dan ilmu baru. Kepada segenap masyarakat yang terpanggil dan ikut berkontribusi dalam kemajuan ilmu pengetahuan. Semoga penelitian ini bisa ikut memberikan kontribusi yang baik bagi ilmu pengetahuan. Amin.
vii
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
DAFTAR ISI
SISTEM PEMEROLEHAN INFORMASI KARYA ILMIAH BERBASIS CLUSTER DENGAN G-MEANS CLUSTERING ................................................. i CLUSTER BASED INFORMATION RETRIEVAL SYSTEM FOR SCIENTIFIC PAPER RETRIEVAL USING G-MEANS CLUSTERING ............ ii HALAMAN PERSETUJUAN SKRIPSI .............................................................. iii HALAMAN PENGESAHAN SKRIPSI ............................................................... iv PERNYATAAN KEASLIAN KARYA ................................................................ v HALAMAN MOTTO ........................................................................................... vi HALAMAN PERSEMBAHAN .......................................................................... vii DAFTAR ISI ....................................................................................................... viii DAFTAR GAMBAR ........................................................................................... xii DAFTAR TABEL ............................................................................................... xiv DAFTAR PERSAMAAN ................................................................................. xviii ABSTRAK .......................................................................................................... xix ABSTRACT ......................................................................................................... xx LEMBAR PERNYATAAN PERSETUJUAN PUBLIKASI.............................. xxi KATA PENGANTAR ....................................................................................... xxii BAB I PENDAHULUAN ...................................................................................... 1 1.1.
Latar Belakang..................................................................................................... 1
1.2.
Rumusan Masalah ............................................................................................... 2
1.3.
Tujuan Penelitian ................................................................................................ 2
1.4.
Batasan Masalah ................................................................................................. 3
1.5.
Metodologi Penelitian......................................................................................... 3
1.6.
Sistematika Penulisan ......................................................................................... 5
BAB II LANDASAN TEORI ............................................................................... 7 2.1.
Konsep Pemerolehan Informasi .......................................................................... 7
2.1.1.
Operasi Teks ................................................................................................ 7
2.1.1.1.
Stopword ............................................................................................. 7
2.1.1.2.
Stemming ............................................................................................ 7
2.1.1.3.
Tokenisasi .......................................................................................... 10
viii
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
2.1.2.
Term-Document Matrix ............................................................................ 10
2.1.3.
TF-IDF sebagai Metode Pembobotan ....................................................... 11
2.1.4.
Evaluasi Pemerolehan Informasi............................................................... 12
2.2.
Konsep Pengelompokan Dokumen ................................................................... 12
2.2.1.
Clustering dalam Pemerolehan Informasi................................................. 12
2.2.2.
Hipotesis Cluster ....................................................................................... 13
2.2.3.
K-Means .................................................................................................... 13
2.2.4.
G-Means .................................................................................................... 15
2.2.5.
Evaluasi Cluster ......................................................................................... 18
2.2.5.1.
Purity ................................................................................................. 18
BAB III ANALISIS DAN PERANCANGAN SISTEM ..................................... 19 3.1.
Analisis Sistem................................................................................................... 19
3.1.1.
Deskripsi Sistem ........................................................................................ 19
3.1.1.1.
Sub Sistem Pengelompokan Dokumen ............................................. 19
3.1.1.2.
Sub Sistem Pencarian Dokumen ....................................................... 23
3.1.2.
Data yang Digunakan ................................................................................ 26
3.1.3.
Analisis Kebutuhan Pengguna ................................................................... 26
3.2.
Perancangan Sistem .......................................................................................... 26
3.2.1.
Data Flow Diagram .................................................................................... 26
3.2.1.1.
Diagram Konteks ............................................................................... 26
3.2.1.2.
Overview DFD .................................................................................... 27
3.2.1.3.
DFD Level 2........................................................................................ 28
3.2.2.
Diagram Berjenjang................................................................................... 30
3.2.3.
Deskripsi Proses ........................................................................................ 30
3.2.3.1.
Deskripsi Proses 1 : Pengelompokan Dokumen ................................ 30
3.2.3.2.
Deskripsi Proses 2 : Pencarian Dokumen .......................................... 31
3.2.4.
Rancangan Basis Data ............................................................................... 33
3.2.4.1.
Desain Konseptual............................................................................. 33
3.2.4.2.
Desain Logikal.................................................................................... 33
3.2.4.3.
Desain Fisikal ..................................................................................... 34
3.2.5.
Rancangan Antarmuka Pengguna ............................................................. 37
3.2.5.1.
Antarmuka Pengelompokan Dokumen ............................................. 37
3.2.5.2.
Antarmuka Pencarian Dokumen ....................................................... 37
ix
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
BAB IV IMPLEMENTASI SISTEM .................................................................. 38 4.1.
Struktur Data ..................................................................................................... 38
4.2.
Implementasi Basis Data ................................................................................... 39
4.3.
Implementasi Pengelompokan Dokumen......................................................... 39
4.3.1. 4.4.
Implementasi G-Means ............................................................................. 39
Implementasi Pencarian Dokumen ................................................................... 48
4.4.1.
Implementasi Preprocessing Query .......................................................... 48
4.4.2.
Implementasi Pencarian Berbasis Cluster dan Konvensional ................... 50
4.5.
Implementasi Antarmuka Pengguna................................................................. 51
4.5.1.
Implementasi Antarmuka Pengelompokan Dokumen .............................. 51
4.5.2.
Implementasi Antarmuka Pencarian Dokumen ........................................ 52
BAB V ANALISIS HASIL PENELITIAN ......................................................... 54 5.1.
Analisis Hasil Sistem .......................................................................................... 54
5.1.1.
Hasil Pengelompokan Dokumen ............................................................... 54
5.1.1.1. 5.1.2.
5.2.
Hasil Pengujian Pencarian Dokumen berdasar Kueri Pengguna ............... 59
5.1.2.1.
Pencarian dengan query data
5.1.2.2.
Pencarian dengan query
5.1.2.3.
Pencarian dengan query klasifikasi ................................................ 68
5.1.2.4.
Pencarian dengan query siste
5.1.2.5.
Pencarian dengan query jari ga ko puter ................................. 78
5.1.2.6.
Pencarian dengan query data
5.1.2.7.
Pencarian dengan query kesehata
5.1.2.8.
Pencarian dengan query diag osa pe yakit .................................. 90
5.1.2.9.
Pencarian dengan query t p udp ................................................... 94
5.1.2.10.
Pencarian dengan query
i i g ............................................ 59
aï e ayes ............................................ 64 pe duku g keputusa ................ 73 i i g
e ggu aka k- ea s ...... 82 a usia ................................ 86
ireless .................................................. 98
Pembahasan .................................................................................................... 102
5.2.1.
Rerata Interpolasi 11 Titik Recall – Precision .......................................... 102
5.2.1.1.
Sistem Pemerolehan Informasi berbasis Cluster ............................ 102
5.2.1.2.
Sistem Pemerolehan Informasi Konvensional ................................ 103
5.2.2. 5.3.
Purity ................................................................................................. 58
Waktu Eksekusi ....................................................................................... 105
Kelebihan dan Kekurangan Sistem.................................................................. 107
5.3.1.
Kelebihan Sistem ..................................................................................... 107
x
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
5.3.2.
Kekurangan Sistem.................................................................................. 107
BAB VI KESIMPULAN DAN SARAN ........................................................... 108 6.1.
Kesimpulan...................................................................................................... 108
6.2.
Saran ............................................................................................................... 108
DAFTAR PUSTAKA ........................................................................................ 109
xi
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
DAFTAR GAMBAR
Gambar 2.1. Visualisasi term-document matrix................................................................ 11 Gambar 2.2. Pseudocode algoritma K-Means (Manning et al, 2008)............................... 13 Gambar 2.3. Visualisasi proses yang terjadi dalam algoritma K-Means (Manning et al, 2008) ................................................................................................................................. 14 Gambar 2.4. Visualisasi G-Means dalam suatu dataset 2 dimensi dengan 1000 point. Algoritma G-Means mencoba mencari normalitas dalam sebaran titik pada suatu cluster (Hamerly et al., 2004) ....................................................................................................... 15 Gambar 3.1. Alur proses pengklusteran dokumen ........................................................... 20 Gambar 3.2. Alur proses pencarian dokumen .................................................................. 24 Gambar 3.3. Sistem Pemerolehan Informasi Konvensional (Baeza, 1999)....................... 25 Gambar 3.4. Sistem Pemerolehan Informasi Berbasis Cluster ......................................... 25 Gambar 3.5. Diagram konteks dari sistem yang akan dibangun ...................................... 26 Gambar 3.6. Overview DFD dari sistem yang akan dibangun ........................................... 27 Gambar 3.7. DFD level 2 dari proses pengelompokan dokumen ..................................... 28 Gambar 3.8. DFD level 2 dari proses pencarian dokumen ............................................... 29 Gambar 3.9. Diagram berjenjang dari sistem yang akan dikembangkan ......................... 30 Gambar 3.10. ERD untuk sistem yang akan dibangun ...................................................... 33 Gambar 3.11. Model relasional untuk sistem yang akan dibangun ................................. 33 Gambar 3.12. Rancangan antarmuka pengguna untuk proses pengelompokan dokumen .......................................................................................................................................... 37 Gambar 3.13. Rancangan antarmuka pengguna untuk proses pencarian dokumen ....... 37 Gambar 4.1 Struktur data untuk term list yang menggunakan LinkedList dan document list yang menggunakan ArrayList ...................................................................................... 38 Gambar 4.2. Struktur data untuk master term list yang berupa HashMap ...................... 39 Gambar 4.3 Capture screen antarmuka subsistem pengelompokan dokumen (1).......... 51 Gambar 4.4. Capture screen antarmuka subsistem pengelompokan dokumen (2)......... 52 Gambar 4.5. Capture screen antarmuka subsistem pencarian dokumen ........................ 52 Gambar 4.6. Implementasi antarmuka pengguna subsistem pencarian dokumen berbasis cluster................................................................................................................................ 53 Gambar 4.7. Implementasi antarmuka pengguna subsistem pencarian dokumen berbasis cluster................................................................................................................................ 53 Gambar 5.1. Grafik interpolasi 11 titik recall precision terhadap query data i i g pada Sistem Pemerolehan Informasi berbasis Cluster ..................................................... 61 Gambar 5.2. Grafik interpolasi 11 titik recall precision terhadap query data i i g pada Sistem Pemerolehan Informasi Konvensional ......................................................... 64 Gambar 5.3. Grafik interpolasi 11 titik recall precision terhadap query aï e ayes pada Sistem Pemerolehan Informasi berbasis Cluster .............................................................. 66 Gambar 5.4. Grafik interpolasi 11 titik recall precision terhadap query aï e ayes pada Sistem Pemerolehan Informasi Konvensional .................................................................. 68
xii
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
Gambar 5.5. Grafik interpolasi 11 titik recall precision terhadap query klasifikasi pada Sistem Pemerolehan Informasi berbasis Cluster .............................................................. 70 Gambar 5.6. Grafik interpolasi 11 titik recall precision terhadap query klasifikasi pada Sistem Pemerolehan Informasi Konvensional .................................................................. 72 Gambar 5.7. Grafik interpolasi 11 titik recall precision terhadap query siste pe duku g keputusa pada “iste Pe eroleha I for asi er asis Cluster............... 75 Gambar 5.8. Grafik interpolasi 11 titik recall precision terhadap query siste pe duku g keputusa pada “iste Pe eroleha I formasi Konvensional................... 78 Gambar 5.9. Grafik interpolasi 11 titik recall precision terhadap query jari ga ko puter pada “iste Pe eroleha I for asi er asis Cluster ................................... 80 Gambar 5.10. Grafik interpolasi 11 titik recall precision terhadap query jari ga ko puter pada “iste Pe eroleha I for asi Ko e sio al ....................................... 82 Gambar 5.11. Grafik interpolasi 11 titik recall precision terhadap query aï e ayes pada Sistem Pemerolehan Informasi berbasis Cluster ..................................................... 84 Gambar 5.12. Grafik interpolasi 11 titik recall precision terhadap query data i i g menggunakan k- ea s pada “iste Pe eroleha I for asi Ko e sio al ................. 86 Gambar 5.13. Grafik interpolasi 11 titik recall precision terhadap query kesehata a usia pada “iste Pe eroleha I for asi er asis Cluster ..................................... 88 Gambar 5.14. Grafik interpolasi 11 titik recall precision terhadap query aï e ayes pada Sistem Pemerolehan Informasi Konvensional ......................................................... 90 Gambar 5.15. Grafik interpolasi 11 titik recall precision terhadap query diag osa pe yakit pada “iste Pe eroleha I for asi er asis Cluster ..................................... 92 Gambar 5.16. Grafik interpolasi 11 titik recall precision terhadap query diag osa pe yakit pada “iste Pe eroleha I for asi Ko e sio al ......................................... 94 Gambar 5.17. Grafik interpolasi 11 titik recall precision terhadap query t p udp pada Sistem Pemerolehan Informasi berbasis Cluster .............................................................. 96 Gambar 5.18. Grafik interpolasi 11 titik recall precision terhadap query t p udp pada Sistem Pemerolehan Informasi Konvensional .................................................................. 98 Gambar 5.19. Grafik interpolasi 11 titik recall precision terhadap query ireless pada Sistem Pemerolehan Informasi berbasis Cluster ............................................................ 100 Gambar 5.20. Grafik interpolasi 11 titik recall precision terhadap query ireless pada Sistem Pemerolehan Informasi Konvensional ................................................................ 102 Gambar 5.21. Grafik rerata interpolasi 11 titik recall precision kedua jenis sistem ....... 104 Gambar 5.22 Grafik rerata waktu retrieval kedua jenis sistem (1) ................................. 106 Gambar 5.23. Grafik rerata waktu retrieval kedua jenis sistem (2) ................................ 106
xiii
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
DAFTAR TABEL
Tabel 2.1. Tabel kombinasi awalan dan akhiran yang tidak diijinkan ................................. 8 Ta el 2.2. Cara Me e tuka Tipe A ala U tuk a ala te- .......................................... 9 Tabel 2.3. Awalan yang diijinkan dihapus berdasarkan Tipe Awalannya ......................... 10 Tabel 2.4. Perancangan term document matrix ............................................................... 10 Tabel 3.1. Kebutuhan fungsional pengguna sistem .......................................................... 26 Tabel 3.2. Desain basis data untuk Sistem Pemerolehan Informasi berbasis Cluster pada level fisikal untuk relasi Cluster......................................................................................... 34 Tabel 3.3. Desain basis data untuk Sistem Pemerolehan Informasi berbasis Cluster pada level fisikal untuk relasi Documents .................................................................................. 34 Tabel 3.4. Desain basis data untuk Sistem Pemerolehan Informasi berbasis Cluster pada level fisikal untuk relasi Centroid ...................................................................................... 35 Tabel 3.5. Desain basis data untuk Sistem Pemerolehan Informasi berbasis Cluster pada level fisikal untuk relasi Term............................................................................................ 35 Tabel 3.6. Desain basis data untuk Sistem Pemerolehan Informasi berbasis Cluster pada level fisikal untuk relasi Term_Document ......................................................................... 36 Tabel 3.7. Desain basis data untuk Sistem Pemerolehan Informasi berbasis Cluster pada level fisikal untuk relasi Stopword_Ina ............................................................................. 36 Tabel 3.8. Desain basis data untuk Sistem Pemerolehan Informasi berbasis Cluster pada level fisikal untuk relasi Rootword_Ina ............................................................................. 36 Tabel 5.1. Hasil pengelompokan dokumen yang dilakukan oleh sistem .......................... 58 Tabel 5.2. Hasil penghitungan dokumen-dokumen yang sesuai dengan cluster yang ditempati........................................................................................................................... 58 Tabel 5.3. Hasil pencarian dengan query data i i g pada “iste Pe eroleha Informasi berbasis Cluster................................................................................................. 60 Tabel 5.4. Penghitungan recall - precision terhadap query data i i g pada “iste Pemerolehan Informasi berbasis Cluster .......................................................................... 60 Tabel 5.5. Interpolasi 11 titik recall precision terhadap query data i i g pada “iste Pemerolehan Informasi berbasis Cluster .......................................................................... 61 Tabel 5.6. Hasil pencarian dengan query data i i g pada “iste Pe eroleha Informasi Konvensional..................................................................................................... 62 Tabel 5.7. Penghitungan recall - precision terhadap query data i i g pada “iste Pemerolehan Informasi Konvensional .............................................................................. 63 Tabel 5.8. Interpolasi 11 titik recall precision terhadap query data i i g pada “iste Pemerolehan Informasi berbasis Cluster .......................................................................... 63 Tabel 5.9. Hasil pencarian dengan query aï e ayes pada “iste Pe eroleha Informasi berbasis Cluster................................................................................................. 64 Tabel 5.10. Penghitungan recall - precision terhadap query aï e ayes pada “iste Pemerolehan Informasi berbasis Cluster .......................................................................... 65 Tabel 5.11. Interpolasi 11 titik recall precision terhadap query aï e ayes pada “iste Pemerolehan Informasi berbasis Cluster .......................................................................... 65
xiv
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
Tabel 5.12. Hasil pencarian dengan query aï e ayes pada “iste Pe eroleha Informasi Konvensional..................................................................................................... 66 Tabel 5.13. Penghitungan recall - precision terhadap query aï e ayes pada “iste Pemerolehan Informasi Konvensional .............................................................................. 67 Tabel 5.14. Interpolasi 11 titik recall precision terhadap query aï e ayes pada “iste Pemerolehan Informasi Konvensional .............................................................................. 67 Tabel 5.15. Hasil pencarian dengan query klasifikasi pada “iste Pe eroleha Informasi berbasis Cluster................................................................................................. 69 Tabel 5.16. Penghitungan recall - precision terhadap query klasifikasi pada “iste Pemerolehan Informasi berbasis Cluster .......................................................................... 69 Tabel 5.17. Interpolasi 11 titik recall precision terhadap query klasifikasi pada “iste Pemerolehan Informasi berbasis Cluster .......................................................................... 69 Tabel 5.18. Hasil pencarian dengan query klasifikasi pada “iste Pe eroleha Informasi Konvensional..................................................................................................... 71 Tabel 5.19. Penghitungan recall - precision terhadap query klasifikasi pada “iste Pemerolehan Informasi Konvensional .............................................................................. 72 Tabel 5.20. Interpolasi 11 titik recall precision terhadap query “klasifikasi” pada Sistem Pemerolehan Informasi Konvensional .............................................................................. 72 Tabel 5.21. Hasil pencarian dengan query siste pe duku g keputusa pada “iste Pemerolehan Informasi berbasis Cluster .......................................................................... 74 Tabel 5.22. Penghitungan recall - precision terhadap query siste pe duku g keputusa pada “iste Pe eroleha I for asi er asis Cluster .................................. 74 Tabel 5.23. Interpolasi 11 titik recall precision terhadap query siste pe duku g keputusa pada “iste Pe eroleha I for asi er asis Cluster .................................. 75 Tabel 5.24. Hasil pencarian dengan query siste pe duku g keputusa pada “iste Pemerolehan Informasi Konvensional .............................................................................. 77 Tabel 5.25. Penghitungan recall - precision terhadap query siste pe duku g keputusa pada “iste Pe eroleha I for asi Ko e sio al ...................................... 77 Tabel 5.26. Interpolasi 11 titik recall precision terhadap query siste pe duku g keputusa pada “iste Pe eroleha I for asi Ko e sio al ...................................... 78 Tabel 5.27. Hasil pencarian dengan query jari ga ko puter pada “iste Pemerolehan Informasi berbasis Cluster .......................................................................... 79 Tabel 5.28. Penghitungan recall - precision terhadap query jari ga ko puter pada Sistem Pemerolehan Informasi berbasis Cluster .............................................................. 79 Tabel 5.29. Interpolasi 11 titik recall precision terhadap query jari ga ko puter pada Sistem Pemerolehan Informasi berbasis Cluster .............................................................. 79 Tabel 5.30. Hasil pencarian dengan query jari ga ko puter pada “iste Pemerolehan Informasi berbasis Cluster .......................................................................... 81 Tabel 5.31. Penghitungan recall - precision terhadap query jari ga ko puter pada Sistem Pemerolehan Informasi Konvensional .................................................................. 81 Tabel 5.32. Interpolasi 11 titik recall precision terhadap query jari ga ko puter pada Sistem Pemerolehan Informasi Konvensional .................................................................. 82 Tabel 5.33. Hasil pencarian dengan query data i i g e ggu aka k- ea s pada Sistem Pemerolehan Informasi berbasis Cluster .............................................................. 83
xv
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
Tabel 5.34. Penghitungan recall - precision terhadap query data i i g e ggu aka kea s pada “iste Pe eroleha I for asi erbasis Cluster ........................................ 83 Tabel 5.35. Interpolasi 11 titik recall precision terhadap query data i i g menggunakan k- ea s pada “iste Pemerolehan Informasi berbasis Cluster ............. 83 Tabel 5.36. Hasil pencarian dengan query data i i g e ggu aka k- ea s pada Sistem Pemerolehan Informasi Konvensional .................................................................. 84 Tabel 5.37. Penghitungan recall - precision terhadap query data i i g e ggu aka kmeans pada “iste Pe eroleha I for asi Ko e sio al ............................................ 85 Tabel 5.38. Interpolasi 11 titik recall precision terhadap query data i i g menggunakan k- ea s pada “iste Pe eroleha I for asi Ko e sio al ................. 85 Tabel 5.39. Hasil pencarian dengan query kesehata a usia pada “iste Pemerolehan Informasi berbasis Cluster .......................................................................... 87 Tabel 5.40. Penghitungan recall - precision terhadap query kesehata a usia pada Sistem Pemerolehan Informasi berbasis Cluster .............................................................. 87 Tabel 5.41. Interpolasi 11 titik recall precision terhadap query kesehata a usia pada Sistem Pemerolehan Informasi berbasis Cluster .............................................................. 87 Tabel 5.42. Hasil pencarian dengan query kesehata a usia pada “iste Pemerolehan Informasi Konvensional .............................................................................. 88 Tabel 5.43. Penghitungan recall - precision terhadap query kesehata a usia pada Sistem Pemerolehan Informasi Konvensional .................................................................. 89 Tabel 5.44. Interpolasi 11 titik recall precision terhadap query aï e ayes pada “iste Pemerolehan Informasi Konvensional .............................................................................. 89 Tabel 5.45. Hasil pencarian dengan query diag osa pe yakit pada “iste Pe eroleha Informasi berbasis Cluster................................................................................................. 90 Tabel 5.46. Penghitungan recall - precision terhadap query diag osa pe yakit pada Sistem Pemerolehan Informasi berbasis Cluster .............................................................. 91 Tabel 5.47. Interpolasi 11 titik recall precision terhadap query diag osa pe yakit pada Sistem Pemerolehan Informasi berbasis Cluster .............................................................. 91 Tabel 5.48. Hasil pencarian dengan query diag osa pe yakit pada “iste Pe eroleha Informasi Konvensional..................................................................................................... 93 Tabel 5.49. Penghitungan recall - precision terhadap query diag osa pe yakit pada Sistem Pemerolehan Informasi Konvensional .................................................................. 93 Tabel 5.50. Interpolasi 11 titik recall precision terhadap query diag osa pe yakit pada Sistem Pemerolehan Informasi Konvensional .................................................................. 93 Tabel 5.51. Hasil pencarian dengan query t p udp pada “iste Pe eroleha I for asi berbasis Cluster ................................................................................................................. 95 Tabel 5.52. Penghitungan recall - precision terhadap query t p udp pada “iste Pemerolehan Informasi berbasis Cluster .......................................................................... 95 Tabel 5.53. Interpolasi 11 titik recall precision terhadap query t p udp pada “iste Pemerolehan Informasi berbasis Cluster .......................................................................... 95 Tabel 5.54. Hasil pencarian dengan query t p udp pada “iste Pe eroleha I for asi Konvensional ..................................................................................................................... 96 Tabel 5.55. Penghitungan recall - precision terhadap query t p udp pada “iste Pemerolehan Informasi Konvensional .............................................................................. 97
xvi
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
Tabel 5.56. Interpolasi 11 titik recall precision terhadap query t p udp pada “iste Pemerolehan Informasi Konvensional .............................................................................. 97 Tabel 5.57. Hasil pencarian dengan query ireless pada “iste Pe eroleha I for asi berbasis Cluster ................................................................................................................. 99 Tabel 5.58. Penghitungan recall - precision terhadap query ireless pada “iste Pemerolehan Informasi berbasis Cluster .......................................................................... 99 Tabel 5.59. Interpolasi 11 titik recall precision terhadap query ireless pada “iste Pemerolehan Informasi berbasis Cluster .......................................................................... 99 Tabel 5.60. Hasil pencarian dengan query ireless pada “iste Pe eroleha I for asi Konvensional ................................................................................................................... 101 Tabel 5.61. Penghitungan recall - precision terhadap query ireless pada “iste Pemerolehan Informasi Konvensional ............................................................................ 101 Tabel 5.62. Interpolasi 11 titik recall precision terhadap query ireless pada “iste Pemerolehan Informasi Konvensional ............................................................................ 101 Tabel 5.63. Interpolasi 11 titik recall precision dari pengujian dengan 10 query pencarian dengan menggunakan Sistem Pemerolehan Informasi berbasis Cluster ....................... 102 Tabel 5.64. Interpolasi 11 titik recall precision dari pengujian dengan 10 query pencarian dengan menggunakan Sistem Pemerolehan Informasi Konvensional ........................... 103 Tabel 5.65. Rata-rata interpolasi 11 titik recall precision dari pengujian dengan 10 query pencarian dari kedua sistem ........................................................................................... 103 Tabel 5.66. Hasil penghitungan rerata waktu eksekusi dalam satuan detik dari kedua sistem .............................................................................................................................. 105
xvii
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
DAFTAR PERSAMAAN
Persamaan 2.1. Rumus pembobotan TF-IDF (Savoy, 1993) .............................................. 11 Persamaan 2.2. Rumus penghitungan skor dan perankingan dokumen terhadap query 12 Persamaan 2.3. Rumus penghitungan nilai recall (Manning et al, 2008) ......................... 12 Persamaan 2.4. Rumus penghitungan nilai precision (Manning et al, 2008) ................... 12 Persamaan 2.5. Rumus Uji Statistik Anderson Darling ..................................................... 16 Persamaan 2.6. Rumus Uji Statistik Anderson Darling ..................................................... 17 Persamaan 2.7. Rumus mencari anak cluster (Hamerly et al., 2004) ............................... 17 Persamaan 2.8. Rumus proyeksi vektor-vektor di X ke vektor v ...................................... 17 Persamaan 2.9. Rumus penghitungan nilai purity ............................................................ 18 Persamaan 3.1. Rumus penghitungan normalisasi z-score pada suatu data ................... 22
xviii
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
ABSTRAK
Dalam kurun waktu terakhir, pertambahan jumlah dokumen karya ilmiah berbahasa Indonesia meningkat sangat pesat. Tanpa ada pengubahan dalam sistem pemerolehan informasi, volume data yang meningkat dapat mengakibatkan turunnya performa sistem pemerolehan informasi, terutama dalam hal waktu retrieval. Salah satu metode yang diusulkan untuk mempersingkat waktu retrieval adalah pengelompokan koleksi. Dalam tugas akhir ini, G-Means dipilih sebagai algoritma pemodelan cluster. Keuntungan implementasi G-Means adalah kemampuan algoritma ini untuk memilih jumlah cluster yang paling optimal. Hasil pengelompokan koleksi kemudian diuji dalam lingkungan sistem pemerolehan informasi untuk melihat seberapa baik pengelompokan koleksi dalam mempersingkat waktu retrieval, dan seberapa besar pengaruhnya terhadap precision. Data yang digunakan adalah karya ilmiah berbahasa Indonesia sebanyak 100 karya. Dari hasil pengujian, ditemukan bahwa waktu retrieval lebih singkat hingga 16,3%, dengan rerata waktu retrieval sebesar 12,88 detik dan precision sebesar 47%.
Kata Kunci:pemerolehan informasi, clustering, g-means, dokumen karya ilmiah
xix
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
ABSTRACT
In recent years, Indonesian-written scientific papers grow significantly in term of number. Without any improvement in information retrieval systems, increasing data volume could lead to poor system performance, especially in its retrieval time. One proposed method to improve retrieval time is collection clustering. GMeans was chosen for cluster modeling algorithm, as it can determine number of generated clusters automatically. Clustering collection results are tested in information retrieval system to find how significant clustering can reduce retrieval time, and whether it has impact to system’s average precision. We use 100 Indonesian scientific papers as collection. Based from the results, retrieval time gain 16.3% faster, with average retrieval time is about 12,88 seconds and average precision is about 47%.
Keyword: information retrieval, clustering, g-means, scientific paper
xx
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
KATA PENGANTAR
Puji dan Syukur saya panjatkan kepada Tuhan Yang Maha Esa, atas berkat dan kuasa-Nya yang diberikan sehingga penelitian ini dapat berhasil dan selesai. Penelitian ini tidak mungkin diselesaikan tanpa adanya keterlibatan dan dukungan dari banyak pihak. Dalam penyelesaian penelitian ini, saya ingin mengucapkan terima kasih sebesar-besarnya kepada pihak-pihak tersebut, antara lain : 1. Bapak Sudi Mungkasi, S.Si, M.Sc.Math., Ph.D. selaku dekan Fakultas Sains dan Teknologi, Universitas Sanata Dharma. 2. Ibu Dr. Anastasia Rita Widiarti selaku Ketua Program Studi Teknik Informatika, Universitas Sanata Dharma 3. Bapak J.B. Budi Darmawan, M.Sc. selaku dosen pembimbing penelitian. Beliau memberikan banyak masukan dan saran serta pembelajaran yang amat sangat berharga dalam penelitian ini. 4. Bapak Puspaningtyas Sanjoyo Adi, S.T., M.T., selaku dosen penguji skripsi, atas saran dan kritik yang diberikan untuk menunjang skripsi ini. 5.
Ibu Sri Hartati Wijono, S.Si., M.Kom. selaku dosen penguji skripsi, atas saran dan kritik yang diberikan untuk menunjang skripsi ini.
6. Keluarga yang tercinta, Bapak, Mikael Santosa, Ibu, Fransiska Tasri Aryani, dan Adik, Philipus Agri Adhiatma yang selalu memberi dukungan terbaik dan kasih sayang. 7. Adika Dwi Ananda Putra (Dika), yang telah berbaik hati meminjami unit komputer untuk menyelesaikan penelitian ini. 8. Seluruh teman-teman Teknik Informatika angkatan 2012 yang sangat suportif.
xxii
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
BAB I PENDAHULUAN
1.1. Latar Belakang Jumlah publikasi karya ilmiah dari Indonesia terus bertambah dari tahun ke tahun. Dari tahun 2011 hingga 2016, prosiding KNSI menampung 1590 karya ilmiah, SRITI menampung 51 karya ilmiah pada tahun 2016. Sementara itu, terdapat 110 karya ilmiah dipublikasikan di JUTI, jurnal teknologi informasi ITS, sejak 2010 hingga 2016 dan 51 karya ilmiah pada JURTEK Akprind dari tahun 2014 hingga 2016. Jumlah karya ilmiah yang tidak termasuk dalam publikasi tersebut tentunya jauh lebih besar lagi. Dengan pertambahan jumlah karya ilmiah yang tersebut, permasalahan yang muncul berasal dari besarnya volume data yang ada. semakin besar suatu koleksi dokumen, maka proses pemerolehan informasi cenderung makin membutuhkan waktu yang lebih banyak (Grossman et al., 2004). Untuk itu, diperlukan pengembangan dalam sistem pemerolehan informasi. Salah satu pengembangan yang dapat dilakukan antara lain dengan mengelompokkan koleksi dokumen yang ada. Antar dokumen dalam satu kelompok memiliki kemiripan yang semirip-miripnya, dan antar dokumen dalam kelompok yang berbeda memiliki ketidakmiripan yang sejauh-jauhnya. Sehingga sistem tidak membutuhkan waktu eksekusi yang lama, karena tiap koleksi sudah dibagi menjadi kelompok-kelompok yang seragam, atau yang disebut juga dengan cluster.
1
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
Tiap cluster direpresentasikan dengan satu centroid. Pengelompokan akan dilakukan dengan algoritma G-Means. Keuntungan menggunakan algoritma GMeans adalah selain melakukan pengelompokan, algoritma ini juga dapat menghitung jumlah cluster yang optimum dengan melihat apakah suatu cluster sudah terdistribusi normal atau belum. Setelah terbentuk kelompok-kelompok dokumen, maka tiap query dari user akan dicocokan dengan centroid tiap cluster saja. Kluster yang memiliki skor paling tinggi dengan query pencarian akan dicatat, lalu isi dari cluster itulah yang akan diberikan skor terhadap query dari pengguna, lalu kemudian ditampilkan.
1.2. Rumusan Masalah 1.
Bagaimana hasil dan kualitas cluster yang dihasilkan dari proses pengelompokan dokumen oleh sistem?
2.
Bagaimana pengaruh pengelompokan dokumen dalam sistem pemerolehan informasi berbasis cluster terhadap waktu retrieval dan dampaknya terhadap precision?
1.3. Tujuan Penelitian 1.
Mengetahui hasil evaluasi dan kualitas cluster yang dihasilkan dari proses pengelompokan dokumen oleh sistem.
2
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
2.
Mengetahui seberapa baik sistem pemerolehan informasi berbasis cluster dalam menurunkan waktu retrieval, dan seberapa besar pengaruhnya terhadap precision.
1.4. Batasan Masalah 1.
Dokumen yang digunakan sebagai korpus adalah karya ilmiah dalam bentuk digital yang diambil dari prosiding berbagai seminar.
2.
Dokumen yang digunakan sebagai korpus adalah dokumen yang menggunakan bahasa Indonesia.
3.
Dokumen yang digunakan sebagai korpus untuk penelitian ini diambil secara acak.
4.
Dokumen digital yang digunakan sebagai korpus dalam penelitian ini telah diubah menjadi format TXT.
5.
Pengelompokan dokumen dalam karya tulis ini tidak menggunakan data training.
1.5. Metodologi Penelitian Langkah-langkah metodologi penelitian yang dilakukan dalam penelitian ini adalah sebagai berikut : 1.
Studi Pustaka Studi pustaka dilakukan untuk mengumpulkan teori-teori yang mendukung penelitian ini. Teori tersebut antara lain mengenai pemerolehan informasi (information retrieval), clustering dokumen dengan menggunakan G-Means, dan informasi lain yang mendukung implementasian pemerolehan informasi berbasis cluster ini.
3
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
2.
Pembangunan Sistem Pemerolehan Informasi berbasis Cluster Pembangunan
sistem
pemerolehan
informasi
berbasis
cluster
ini
menggunakan metode Framework for the Application System Technique (FAST) dengan tahap sebagai berikut: a. Analisis Sistem 1) Analisis Masalah Hal yang dilakukan dalam tahap ini adalah analisis masalah yang dapat dipecahkan dengan pembangunan sistem. 2) Analisis Kebutuhan Hal yang dilakukan dalam tahap ini adalah identifikasi kebutuhan sistem dengan mengumpulkan data kebutuhan pengguna sistem yang kemudian dimodelkan dalam diagram Use Case.
b. Desain Sistem 1) Logical Design Hal yang dilakukan dalam tahap ini adalah penggambaran model data, proses dan antarmuka dalam bentuk logical.
2) Physical Design and Integration Implementasi secara teknis dengan pembuatan desain antarmuka pengguna secara fisik dan desain basis data apabila diperlukan.
3) Construction and Testing Pengembangan rancangan ke dalam program dengan menggunakan bahasa pemrograman Java, dan MySQL sebagai pengelola basis datanya.
3.
Uji Coba Relevansi terhadap Pengguna Uji coba terhadap pengguna dilakukan untuk melihat unjuk kerja sistem yang telah dibangun. Parameter yang diberikan adalah tingkat relevansi untuk
4
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
uji relevansi. Hasil dari uji coba ini akan menjadi sumber data untuk analisis hasil uji coba.
4.
Analisis Hasil Uji Coba Relevansi Analisis hasil uji coba dilakukan dengan melihat data yang didapatkan dari uji coba pengguna. Tujuan dari analisis ini adalah untuk mendapatkan kesimpulan dari tujuan penelitian.
1.6. Sistematika Penulisan 1. BAB I
: PENDAHULUAN
Berisi pendahuluan berupa permasalahan yang melatarbelakangi penelitian ini, tujuan dari penelitian ini, batasan-batasan yang ada dalam penelitian, serta sistematika dokumen proposal ini.
2. BAB II
: TINJAUAN PUSTAKA
Berisi jabaran konsep dan hasil penelitian dari peneliti lain yang berkaitan dengan penelitian ini. Isinya antara lain konsep dasar pemerolehan informasi, stemming, eliminasi stopword, term weighting, evaluasi hasil pemerolehan informasi, serta konsep dasar pengelompokan teks, dan algoritma G-Means untuk pemodelan data dan pemilihan jumlah cluster optimum.
3. BAB III
: ANALISIS DAN PERANCANGAN
Bab ini berisi gambaran umum dari sistem yang akan dibangun, analisis kebutuhan sistem dan rancangan basis data untuk sistem tersebut.
4. BAB IV
: IMPLEMENTASI
Bab ini berisi jabaran dari implementasi pemodelan G-Means dalam bahasa pemrograman Java.
5
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
5. BAB V
: ANALISIS HASIL PENELITIAN
Bab ini berisi hasil pengujian sistem, serta pembahasan dari hasil pengujian tersebut.
6. DAFTAR PUSTAKA Berisi referensi pustaka yang digunakan dalam penulisan karya ilmiah ini.
7. LAMPIRAN Lampiran lain apabila diperlukan.
6
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
BAB II LANDASAN TEORI
2.1. Konsep Pemerolehan Informasi Pemerolehan informasi (Information Retrieval) adalah kumpulan berbagai algoritma dan teknologi untuk melakukan pemrosesan, penyimpanan, dan temu kembali informasi pada suatu koleksi data yang besar dan tidak terstruktur (Manning et al, 2008). Jenis informasi tersebut beragam, bisa berupa teks dokumen, halaman web, maupun objek multimedia seperti foto dan video. 2.1.1. Operasi Teks 2.1.1.1. Stopword Stopword adalah suatu kata yang sangat sering muncul dalam berbagai dokumen adalah diskriminator yang buruk dan tidak berguna dalam temu kembali informasi. Stopword perlu dieliminasi untuk mengurangi waktu eksekusi query dengan cara menghindari proses list yang panjang (Butcher et al., 2010). Pembuangan stopword ini akan mengurangi ukuran indeks, meningkatkan efisiensi dan keefektifan dari pemerolehan informasi (Croft et al., 2010). Contoh stopword dalam bahasa Indonesia, yaitu kata ganti orang (“aku”, “kamu”, “kita”, dsb.), konjungsi (“dan”, “atau”, dsb.), dan beberapa kata lainnya.
2.1.1.2. Stemming Stemming adalah proses pengenalan suatu kata. Stemming sering melibatkan pemisahan kata dari imbuhan dan tanda baca (Göker et al, 2009). Menurut Agusta (2010), pola suatu kata dalam bahasa Indonesia adalah sebagai berikut : Prefiks I + Prefiks II + kata dasar + Sufiks III + Sufiks II + Sufiks I
7
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
2.1.1.2.1. Algoritma Nazief – Adriani sebagai Algoritma Stemming Algoritma Stemming Nazief – Adriani diperkenalkan oleh Nazief dan Adriani (1996). Algoritma ini memiliki tahap-tahap sebagai berikut ini : 1. Cari kata yang akan diistem dalam basis data kata dasar. Jika ditemukan maka diasumsikan kata adalah root word. Maka algoritma berhenti. 2. Selanjutnya adalah pembuangan Inflection Suffixes (“-lah”, “-kah”, “-ku”, “mu”, atau “-nya”). Jika berupa particles (“-lah”, “-kah”, “-tah” atau “-pun”) dan terdapat Possesive Pronouns (“-ku”, “-mu”, atau “-nya”), maka langkah ini diulangi lagi untuk menghapus Possesive Pronouns. 3. Hapus Derivation Suffixes (“-i”, “-an” atau “-kan”). Jika kata ditemukan di kamus, maka algoritma berhenti. Jika tidak maka ke langkah 3a berikut ini : a. Jika “-an” telah dihapus dan huruf terakhir dari kata tersebut adalah “-k”, maka “-k” juga ikut dihapus. Jika kata tersebut ditemukan dalam kamus maka algoritma berhenti. Jika tidak ditemukan maka lakukan langkah 3b. b. Akhiran yang dihapus (“-i”, “-an” atau “-kan”) dikembalikan, lanjut ke langkah 4. 4. Hapus Derivation Prefix. Jika pada langkah 3 ada sufiks yang dihapus maka pergi ke langkah 4a, jika tidak pergi ke langkah 4b. a. Periksa tabel kombinasi awalan-akhiran yang tidak diijinkan pada Tabel 2.1. Jika ditemukan maka algoritma berhenti, jika tidak, pergi ke langkah
4b. Tabel kombinasi awalan-akhiran yang tidak diijinkan ditampilkan pada tabel berikut ini : Awalan bedikemese-
Akhiran yang tidak diizinkan -i -an -i, -kan -an -i, -kan
Tabel 2.1. Tabel kombinasi awalan dan akhiran yang tidak diijinkan
b. Tentukan tipe awalan kemudian hapus awalan. Jika awalan kedua sama dengan awalan pertama algoritma berhenti. 8
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
c. Jika root word belum juga ditemukan lakukan langkah 5, jika sudah maka algoritma berhenti.. 5. Jika semua langkah telah selesai tetapi tidak juga berhasil maka kata awal diasumsikan sebagai root word. Proses selesai.
Tipe awalan ditentukan melalui langkah-langkah berikut: 1. Jika awalannya adalah: “di-”, “ke-”, atau “se-” maka tipe awalannya secara berturut-turut adalah “di-”, “ke-”, atau “se-”. 2. Jika awalannya adalah “te-”, “me-”, “be-”, atau “pe-” maka dibutuhkan sebuah proses tambahan untuk menentukan tipe awalannya. 3. Jika dua karakter pertama bukan “di-”, “ke-”, “se-”, “te-”, “be-”, “me-”, atau “pe-” maka berhenti. 4. Dengan melihat Tabel 2.2, jika tipe awalan adalah “none” maka berhenti. Jika tipe awalan adalah bukan “none” maka awalan dapat dilihat pada Tabel 2.4. Hapus awalan jika ditemukan. Tipe-tipe awalan dapat dilihat dalam tabel berikut ini : Karakter huruf setelah awalan Set 1
Set 2
“-r-“ “-r-“ “-r-“ “-r-“ “-r-“ not (vowel or “-r-”) not (vowel or “-r-”)
Set 3
“-r-“
– – not (vowel or “-r-”) “-er-“ not (vowel or “-r-”) “-er-“ not (vowel or “-r-”) not “-er-“ “-er-“ vowel “-er-“ not vowel
Tipe awalan Set 4 – – vowel not vowel – – –
None ter-luluh Ter terTer None Te
Tabel 2.2. Cara Menentukan Tipe Awalan Untuk awalan “te-”
Awalan yang diijinkan dihapus berdasarkan tipe awalannya ditunjukkan pada tabel berikut ini : Tipe Awalan Awalan yang harus dihapus didikekesesetete-
9
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
terter-luluh
terter
Tabel 2.3. Awalan yang diijinkan dihapus berdasarkan Tipe Awalannya
2.1.1.3. Tokenisasi Tokenisasi adalah proses pemisahan kata dari kumpulannya, sehingga menghasilkan suatu kata yang berdiri sendiri, baik dalam bentuk perulangan maupun tunggal. Proses ini juga akan menghilangkan tanda baca maupun karakter yang ada pada kata tersebut dan semua huruf menjadi huruf kecil. (Manning et al, 2008). Contoh dari input dan output dari tokenisasi adalah sebagai berikut : Input : Suatu deret angka genap Output : suatu, deret, angka, genap
2.1.2. Term-Document Matrix Term-document
matrix
adalah
matriks
yang
memperlihatkan
frekuensi
kemunculan suatu term didalam suatu dokumen. Dalam term-document matrix, baris-baris menunjukkan term dalam suatu koleksi dan kolom menunjukkan dokumen. (Manning et al, 2008). Contoh perancangan matriks term-document diperlihatkan seperti berikut ini : doc 1
doc 2
doc 3
doc 4
doc 5
doc 6
term 1
1
2
2
1
1
0
term 2
0
4
4
1
2
0
term 3
2
5
0
1
3
0
term 4
3
1
0
0
1
1
term 5
2
0
2
0
0
1
term 6
1
0
1
1
3
2
Tabel 2.4. Perancangan term document matrix
Sehingga matriks term-documentnya (matriks M) akan menjadi seperti berikut ini : 10
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
[
]
Gambar 2.1. Visualisasi term-document matrix
2.1.3. TF-IDF sebagai Metode Pembobotan Terms Frequency – Inverse Documents Frequency (TF-IDF) adalah skema pembobotan term yang
paling populer dalam ranah pemerolehan informasi
(Baeza – Yates, 1999). Rumus pembobotan TF-IDF menurut Savoy (1993) adalah sebagai berikut :
Persamaan 2.1. Rumus pembobotan TF-IDF (Savoy, 1993)
Dimana, , dan
Keterangan :
w
= bobot term (Tj) pada dokumen Di
tfij
= frekuensi kemunculan term (Tj) pada dokumen Di
m
= jumlah dokumen Di pada kumpulan dokumen
dfj
= jumlah dokumen yang mengandung term (Tj)
idfj
= invers frekuensi dokumen (inverse document frequency)
max tfi
= frekuensi term terbesar dalam suatu dokumen
Dari penghitungan nilai TF-IDF ini, scoring atau penilaian terhadap query didefinisikan sebagai berikut (Manning et al, 2008) :
11
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
∑ Persamaan 2.2. Rumus penghitungan skor dan perankingan dokumen terhadap query
2.1.4. Evaluasi Pemerolehan Informasi Pengukuran hasil relevansi dapat dilakukan dengan penghitungan recall dan precision. Recall digunakan untuk mengukur seberapa baik suatu sistem melakukan pencarian terhadap dokumen yang relevan terhadap suatu query pengguna. Sementara itu, precision digunakan untuk melihat seberapa baik sistem pemerolehan informasi mengeliminasi dokumen yang tidak relevan (Croft et al., 2010). Rumus dari recall dan precision adalah sebagai berikut (Manning et al, 2008) : ∑
∑
Persamaan 2.3. Rumus penghitungan nilai recall (Manning et al, 2008)
∑
∑
Persamaan 2.4. Rumus penghitungan nilai precision (Manning et al, 2008)
2.2. Konsep Pengelompokan Dokumen 2.2.1. Clustering dalam Pemerolehan Informasi Algoritma clustering mengelompokan sekumpulan dokumen ke dalam suatu subset atau cluster. Tujuan algoritma clustering dalam pemerolehan informasi bertujuan untuk mengelompokan sekumpulan dokumen yang koheren secara internal, namun memiliki perbedaan jauh dengan dokumen dari cluster yang lain. Dengan kata lain, antar dokumen di dalam satu cluster yang sama seharusnya memiliki tingkat kemiripan yang tinggi, dan antar dokumen di dalam
12
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
cluster yang berbeda seharusnya memiliki tingkat perbedaan yang setinggitingginya (Manning et al, 2008).
2.2.2. Hipotesis Cluster Hipotesis cluster berisi tentang asumsi dasar yang dibuat ketika menerapkan clustering dalam pemerolehan informasi. Hipotesis cluster menyebutkan bahwa dokumen dalam cluster yang sama akan memiliki keidentikan sifat, berkenaan dengan relevansi terhadap kebutuhan informasi (Manning et al, 2008).
2.2.3. K-Means K-Means adalah salah satu algoritma flat clustering yang paling penting (Manning et al, 2008). Tujuan K-Means adalah meminimalkan rata-rata kuadrat jarak Euclidean dokumen terhadap centroid (pusat cluster) dokumen tersebut (Manning et al, 2008). Algoritma k-Means ditunjukkan dalam gambar berikut ini :
Gambar 2.2. Pseudocode algoritma K-Means (Manning et al, 2008)
Dalam bukunya, Manning (2008) menjabarkan langkah dari algoritma KMeans. Pertama-tama, dilakukan pemilihan pusat cluster K secara acak dari dokumen yang ada. Terjadi proses iteratif dimana pusat cluster bergerak terus
13
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
untuk meminimalkan RSS (residual sum of squares). Setelah itu, tiap dokumen ditempatkan pada cluster yang memiliki centroid terdekat dengan dokumen tersebut. Proses kembali lagi ke iterasi pergerakan pusat cluster. Visualisasi proses yang terjadi dalam k-Means ditampilkan dalam gambar berikut ini :
Gambar 2.3. Visualisasi proses yang terjadi dalam algoritma K-Means (Manning et al, 2008)
14
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
Ada beberapa cara penghentian iterasi, antara lain :
Banyak iterasi I yang telah ditetapkan sebelumnya. Ketika iterasi telah mencapai langkah ke-i, maka proses akan berhenti.
Penempatan dokumen dalam suatu cluster (fungsi partisi γ) tidak berubahubah lagi.
Centroid µ k tidak berubah lagi. Hal ini sama dengan γ tidak berubah.
Berhenti ketika nilai RSS dibawah batas yang ditentukan.
2.2.4. G-Means Algoritma G-Means diperkenalkan oleh Greg Hamerly dan Charles Elkan dari University of California pada tahun 2004. G-Means adalah algoritma pengembangan dari K-Means yang memiliki fitur penghitungan jumlah cluster yang optimum dengan menggunakan uji statistik untuk memutuskan apakah suatu pusat cluster perlu dipecah menjadi dua pusat cluster (Hamerly et al., 2004). Algoritma G-Means akan dimuai dari jumlah pusat cluster yang kecil, misalnya satu atau dua. Tiap iterasi dimulai dengan pengelompokan data menggunakan K-Means seperti biasa untuk mendapatkan himpunan anggota tiap cluster, selanjutnya algoritma ini akan memecah pusat cluster menjadi dua apabila suatu cluster nampak tidak terdistribusi normal. Visualisasi G-Means dalam suatu dataset 2 dimensi dengan 1000 point ditampilkan dalam gambar berikut ini :
Gambar 2.4. Visualisasi G-Means dalam suatu dataset 2 dimensi dengan 1000 point. Algoritma GMeans mencoba mencari normalitas dalam sebaran titik pada suatu cluster (Hamerly et al., 2004)
15
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
Algoritma G-Means dapat dilihat sebagai berikut (Hamerly et al., 2004) : 1. Pilih C sebagai sekumpulan pusat cluster (centroid) awal 2. Lakukan K-Means pada dataset X dengan C sebagai pusat-pusat clusternya. 3. xi adalah sekumpulan datapoint yang menjadi member centroid cj, dimana { xi | class(xi) = j } 4. Gunakan uji statistik untuk melihat apakah tiap { xi | class(xi) = j } mengikuti distribusi normal (pada suatu confidence level α). 5. Jika data terlihat terdistribusi normal, maka cj tidak berubah. Namun jika sebaliknya, maka cj diganti menjadi dua pusat cluster 6. Ulangi langkah no. 2 hingga tidak ada lagi pusat cluster yang ditambahkan.
Terdapat dua hipotesis dalam uji statistik pada no. 4, yaitu sebagai berikut (Hamerly et al., 2004) :
H0 : data disekitar pusat cluster terdistribusi normal
H1 : data disekitar pusat cluster tidak terdistribusi normal
Jika H0 diterima, maka pusat cluster tidak perlu dipisah lagi menjadi dua. Sementara itu, jika H1 diterima, maka pusat cluster harus dipecah menjadi dua.
Uji statistik yang digunakan adalah adalah uji Anderson-Darling, dengan formula sebagai berikut :
Persamaan 2.5. Rumus Uji Statistik Anderson Darling
dengan :
16
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
[
∑
Persamaan 2.6. Rumus Uji Statistik Anderson Darling
X adalah subset dengan pusat cluster C. Tiap instance dari X diwakili dengan xi, xi+1,
…,
xn-1, xn. Sementara itu, zi adalah hasil dari fungsi distribusi
kumulatif untuk distribusi normal baku terhadap nilai xi. Untuk melakukan uji statistik diatas, dilakukan langkah seperti berikut ini (Hamerly et al., 2004) : 1. Ambil suatu subset X 2. Pilih level signifikan α untuk uji. 3. Dari pusat cluster tersebut, ambil dua buah “anak” pusat cluster, dinotasikan dengan c1 dan c2. Caranya dengan menggunakan rumus c±m, dimana m adalah random atau dengan rumus berikut : √
Persamaan 2.7. Rumus mencari anak cluster (Hamerly et al., 2004)
Dimana, m = vector anak s
= eigenvalue terbesar yang didapat dari data
λ
= principal component utama, yaitu eigenvector dengan eigenvalue
terbesar 4. Jalankan K-Means pada X dengan dua centroid tersebut (c1 dan c2). 5. Hitung nilai vektor v dengan v = c1 – c2. 6. Proyeksikan X ke v, menjadi X’, dengan rumus sebagai berikut ‖ ‖
Persamaan 2.8. Rumus proyeksi vektor-vektor di X ke vektor v
7. Normalisasi X` sehingga memiliki rerata 0 dan varian 1.
17
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
8. Hitung zi dengan rumus zi = F(xi). 9. Hitung
. Apabila
diterima. Sebaliknya apabila
berada pada daerah non-kritis, maka H0 berada di dalam daerah kritis, maka H1
diterima dan pusat cluster yang baru adalah c1 dan c2.
2.2.5. Evaluasi Cluster 2.2.5.1. Purity Purity adalah salah satu pengukuran dalam evaluasi cluster. Untuk menghitung purity, tiap cluster diberikan label kelas berdasarkan label yang paling sering muncul dalam cluster tersebut, dan kemudian akurasi cluster dihitung dengan jumlah data yang benar dibagi dengan banyak data (Chen, 2010). Rentang purity dari 0 hingga 1. Semakin besar nilai purity, semakin baik cluster tersebut. Formula purity adalah sebagai berikut (Chen, 2010) : ∑
|
|
Persamaan 2.9. Rumus penghitungan nilai purity
18
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
BAB III ANALISIS DAN PERANCANGAN SISTEM
3.1. Analisis Sistem 3.1.1. Deskripsi Sistem Sistem yang akan dikembangkan dalam penelitian ini adalah sebuah sistem pengelompokan koleksi dan pencarian dokumen berdasarkan input query pengguna. Sistem ini terdiri dari dua sub sistem, yaitu sub sistem pengelompokan dokumen dan sub sistem pencarian dokumen. 3.1.1.1. Sub Sistem Pengelompokan Dokumen Sub sistem pengelompokan dokumen bertindak sebagai modul clustering dokumen. Nantinya koleksi dokumen yang diunggah oleh User ke dalam sistem mula-mula diproses oleh subsistem ini. Proses yang terjadi adalah tokenisasi, eliminasi stopword, stemming, lalu dilanjutkan dengan pembangunan termdocument matrix. Dalam
penelitian
ini,
kolom
dalam
term-document
matrix
akan
merepresentasikan term, selanjutnya disebut atribut atau feature. Sementara baris dalam term-document matrix akan merepresentasikan dokumen. Dari termdocument matrix inilah akan dilakukan pengelompokan koleksi. Jumlah cluster optimum akan dicari secara otomatis oleh sistem menggunakan algoritma G-Means,
yaitu pemodelan
cluster
dengan memperhitungkan
kenormalan distribusi dari tiap anggota cluster terhadap pusatnya masing-masing. Dari situ, dapat diketahui berapa jumlah cluster yang optimum.
19
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
Normalitas distribusi tiap cluster akan dihitung dengan menggunakan test statistik, dimana akan digunakan uji Anderson-Darling untuk menentukan apakah cluster sudah terdistribusi normal atau belum. Apabila suatu cluster belum terdistribusi normal, maka suatu cluster akan dipecah menjadi dua, dan seterusnya hingga terdistribusi normal. Alur subsistem ini ditunjukkan dalam gambar berikut ini :
Pengklusteran Dokumen
Input dokumen karya ilmiah
Operasi tokenizing
Feature selection
Operasi stopword
Operasi stemming
Penghitungan tf, df dan w
Pembangunan term-document matrix
Implementasi G-Means untuk pemodelan cluster
Simpan data cluster dan membernya, serta centroidnya
Gambar 3.1. Alur proses pengklusteran dokumen
20
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
3.1.1.1.1. Clustering dengan G-Means Penggunaan algoritma G-Means serta parameter-parameter yang digunakan dalam penelitian ini adalah sebagai berikut : 1. Ambil suatu subset X Subset X pada saat ini adalah seluruh dataset yang ada. Dataset ini dianggap sebagai satu cluster. Karena hanya terdapat satu cluster saja, centroid dari cluster ini adalah rerata dari tiap atribut dari dataset tersebut. 2. Pilih level signifikan α untuk uji. Level signifikan α dalam penelitian ini diinisalisasi dengan nilai 0.05. Nilai ini nantinya akan dibandingkan dengan p-value dari hasil penghitungan uji statistik Anderson – Darling. 3. Dari pusat cluster (centroid) yang dibentuk pada point 1 tadi, ambil dua buah “anak” pusat cluster, dinotasikan dengan c1 dan c2. Caranya dengan menggunakan rumus pada Persamaan 2.1.
4. Jalankan K-Means pada X dengan dua centroid tersebut (c1 dan c2). K-Means dilakukan pada cluster yang diobservasi. Parameter jumlah cluster (k) memiliki nilai 2, dan seed untuk centroid awal adalah c1 dan c2. Kriteria penghentian iterasi dalam tahap ini adalah sebagai berikut : a. Jumlah iterasi telah melewati batas iterasi yang ditentukan, yaitu 1000 kali iterasi, atau, b. Salah satu cluster kehilangan seluruh anggotanya (empty cluster), atau, c. Cluster sudah konvergen, ditandai dengan centroid dan anggota cluster tidak mengalami perubahan. Dengan kata lain, memiliki nilai dan jumlah yang sama dengan iterasi sebelumnya. 5. Hitung nilai vektor v dengan v = c1 – c2.
21
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
6. Proyeksikan X ke v, menjadi X’, dengan rumus pada Persamaan 2.8. 7. Normalisasi X` sehingga memiliki rerata 0 dan varian 1. Normalisasi untuk mengubah X’ sehingga memiliki rerata 0 dan varian 1 dilakukan dengan menggunakan normalisasi z-score, yaitu normalisasi dengan rumus berikut ini :
Persamaan 3.1. Rumus penghitungan normalisasi z-score pada suatu data
Dimana, -
si = nilai normalisasi di titik data ke i dalam suatu atribut
-
xi = nilai awal data di titik data ke i dalam suatu atribut
-
µ
-
= nilai atribut dari atribut dimana terdapat data i = nilai standar deviasi dari atribut dimana terdapat data i
8. Hitung zi dengan rumus zi = F(xi). Penghitungan Cummulative Distribution Function (CDF) menggunakan java library yang dikhususkan untuk statistika, yaitu jdistlib.
9. Hitung
. Apabila
diterima. Sebaliknya apabila
berada pada daerah non-kritis, maka H0 berada di dalam daerah kritis, maka H1
diterima dan pusat cluster yang baru adalah c1 dan c2. Penghitungan p-value akan digunakan untuk mengetahui apakah nilai berada pada daerah kritis atau non-kritis. Penghitungan p-value dilakukan dengan java library yang dikhususkan untuk statistika, yaitu jdistlib. Apabila nilai p-value lebih besar sama dengan nilai α, maka H0 diterima, yang artinya cluster tidak perlu dipecah menjadi dua cluster. Begitu pula sebaliknya, maka H1 diterima, yang artinya cluster perlu dipecah menjadi dua cluster.
22
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
3.1.1.2. Sub Sistem Pencarian Dokumen Sub sistem pencarian dokumen berfungsi untuk mencari dokumen yang memiliki kemiripan atau relevan dengan query yang diberikan oleh pengguna sistem. Query hanya akan dicocokkan dengan centroid tiap cluster dengan menggunakan operator boolean AND, dengan menggunakan Persamaan 2.2 untuk menghitung skor. Cluster yang memiliki centroid dengan skor yang tertinggi terhadap query pencarian user akan dicatat oleh sistem. Apabila tidak ada kecocokan
dengan
semua
centroid,
maka
dicoba
pencocokan
dengan
menggunakan operator OR. Apabila sudah ditemukan cluster yang sesuai, dokumen yang berada dalam cluster tersebut akan dibobot ulang oleh sistem menggunakan TF-IDF untuk kemudian ditampilkan urut ke pengguna berdasarkan bobot terhadap query yang diberikan oleh pengguna. Jumlah dokumen untuk penghitungan IDF didasarkan pada jumlah dokumen yang berada pada cluster terpilih. Aktor yang terlibat dalam sistem ini adalah User. User adalah aktor yang memiliki wewenang untuk melakukan pencarian dokumen dengan memberikan input berupa query pencarian pada sistem. Selain itu, user memiliki wewenang untuk memulai proses clustering dokumen. Alur subsistem ini ditampilkan dalam gambar berikut :
23
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
Pencarian Input query pencarian
Operasi tokenizing
Operasi stopword
Operasi stemming
Penghitungan tf, df, w
Pembangunan term-query matrix
Pembobotan cluster terhadap kueri, dengan membandingkan centroid terhadap kueri, dapat ditemukan bobot yang paling besar (cluster yg paling mirip dgn kueri)
Load document id dari cluster yang paling mirip
Hitung ulang bobot document member cluster tadi terhadap kueri
Tampilkan hasil pencarian ke user
Gambar 3.2. Alur proses pencarian dokumen
Subsistem ini memiliki dua opsi untuk retrieval, yaitu retrieval berbasis cluster dan retrieval tanpa cluster. Retrieval berbasis cluster selanjutnya disebut dengan Sistem Pemerolehan Informasi berbasis Cluster, sementara retrieval tanpa cluster disebut dengan Sistem Pemerolehan Informasi Konvensional. Perbedaan kedua jenis sistem tersebut ditampilkan dalam gambar berikut ini :
24
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
User interface
Text
User need Text feedback Text operation
Logical operation
Logical view
Query operation
Indexing
query
Inverted file
Searching
Index Index
Ranked docs DB Manager Module
Text database
Retrieved docs
Ranking
Gambar 3.3. Sistem Pemerolehan Informasi Konvensional (Baeza, 1999) User interface
Text
User need Text feedback Text operation
Logical operation
Logical view
Query operation
Indexing
query
Inverted file
Ranked docs
Searching
Cluster Cluster Index Index (Centroid) (Centroid)
Clustering
Retrieved docs Cluster Cluster Member Member (Documents) (Documents)
Ranking
Gambar 3.4. Sistem Pemerolehan Informasi Berbasis Cluster
25
DB Manager Module
Text database
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
3.1.2. Data yang Digunakan Data yang digunakan dalam penelitian ini adalah 100 karya ilmiah berbahasa Indonesia yang diambil dari berbagai prosiding dan jurnal.
3.1.3. Analisis Kebutuhan Pengguna Kebutuhan yang dibutuhkan tiap aktor dalam sistem ini disajikan dalam tabel berikut ini : Pengguna Sistem User
Kebutuhan 1. Melakukan clustering dokumen 2. Melakukan pencarian dengan menggunakan query 3. Melihat isi dokumen
Tabel 3.1. Kebutuhan fungsional pengguna sistem
3.2. Perancangan Sistem 3.2.1. Data Flow Diagram 3.2.1.1. Diagram Konteks Diagram konteks atau diagram aliran data pada level 0 untuk sistem yang akan dibangun, ditampilkan pada gambar berikut ini :
koleksi Dokumen
Sistem
query pencarian
Sistem Pemerolehan pemerolehan Informasi
User
informasi
cluster
list dokumen
Gambar 3.5. Diagram konteks dari sistem yang akan dibangun
26
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
3.2.1.2. Overview DFD
Record
tro id cen
x de , in i s er lek Ko clust
Dokumen
cluster
koleksi
1.
dokumen
Sistem Pemerolehan Pengelompokan Informasi
rm Te
Index dokumen
Term
Cluster
Centroid
id tro cen
Dokumen sesuai index cluster
kum en
t lis
In
de xd o
2.
dokumen
Sistem Pemerolehan Pencarian Informasi
list dokumen
query pencarian
User
Overview dari diagram aliran data untuk sistem yang akan dibangun, ditampilkan pada gambar berikut ini :
Gambar 3.6. Overview DFD dari sistem yang akan dibangun
27
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
3.2.1.3. DFD Level 2 3.2.1.3.1. DFD Proses 1
: Pengelompokan Dokumen
Diagram aliran data pada level 2 untuk proses pengelompokan dokumen ditampilkan pada gambar berikut :
koleksi Dokumen
1.1. Sistem Pemerolehan Informasi preprocessing
Token list, koleksi
1.2. pembobotan Term
Te rm
li s t
Tf,df,w, term-document matrix, koleksi
1.3. Pengelompokan dokumen
Index
doku
men
Cluster
centr oid Centroid
Kolek si, index cluste r
Record
Gambar 3.7. DFD level 2 dari proses pengelompokan dokumen
28
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
3.2.1.3.2. DFD Proses 2
: Pencarian Dokumen
Diagram aliran data pada level 2 untuk proses pencarian dokumen ditampilkan pada gambar berikut :
query User
Sistem Pemerolehan 1.1. Informasiquery Preprocessing
Token list
Dokumen terurut
df
1.2. Pembobotan query
Term
TF-IDF query
Centroid 1.3. Pemilihan cluster termirip
oid centr
Index cluster, TFIDF query
1.4. Perankingan dokumen
Index
doku
men
Doku me sesua n i index cluste r
Cluster
Record
Gambar 3.8. DFD level 2 dari proses pencarian dokumen
29
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
3.2.2. Diagram Berjenjang Diagram berjenjang (hierarchial chart) dari system yang akan dibangun ini ditampilkan pada gambar berikut :
Sistem pemerolehan informasi Level 0
1. Pengelompokan dokumen
2. Pencarian dokumen
Level 1
1.1. preprocessing
1.3. Pengelompokan dokumen
1.2. pembobotan
2.1. Preprocessing query
2.2. Pembobotan query
2.3. Pemilihan cluster termirip
2.4. Perankingan dokumen
Level 2
Gambar 3.9. Diagram berjenjang dari sistem yang akan dikembangkan
3.2.3. Deskripsi Proses 3.2.3.1. Deskripsi Proses 1 : Pengelompokan Dokumen 3.2.3.1.1. Deskripsi Proses 1.1 Preprocessing
dilakukan
: Preprocessing untuk
menghilangkan
stopword
dan
menyederhanakan bentuk-bentuk term dengan cara stemming. Preprocessing ini berguna untuk mengurangi dimensi matriks term-document. Setelah semua term diubah menjadi bentuk kata dasarnya, selanjutnya dilakukan tokenisasi. Dalam sistem ini, token yang diambil adalah semua token yang mengandung alfabet saja. Apabila token terdiri dari karakter alphanumeric atau numerik, maka token akan dibuang. Setiap token akan dicatat kemunculannya di tiap dokumen. Nilai ini menghasilkan term frequency (TF).
30
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
Selain itu, jumlah dokumen yang mengandung token tersebut akan dicatat juga. Jumlah ini menghasilkan nilai document frequency (DF). Hasil dari proses ini adalah TF, DF, dan token-token yang nantinya akan dibobot oleh proses selanjutnya.
3.2.3.1.2. Deskripsi Proses 1.2
: Pembobotan
Input dari proses pembobotan adalah nilai-nilai TF tiap dokumen, DF tiap term, serta token list. Token list selanjutnya disebut term list. Pembobotan dilakukan dengan rumus pada Persamaan 2.1. Metode yang digunakan untuk pembobotan ini adalah metode TF-IDF. Hasil dari pembobotan ini kemudian dinormalisasi dengan normalisasi kosinus. Hasil dari proses ini adalah tabel berisi bobot kata di tiap dokumen, dengan kolom sebagai term dan baris sebagai dokumen.
3.2.3.1.3. Deskripsi Proses 1.3
: Pengelompokan Dokumen
Setelah bobot kata per dokumen diketahui, maka pengelompokan dokumen dapat dilakukan. Algoritma yang digunakan adalah G-Means. Hasil dari proses ini adalah term list, centroid, serta dokumen yang telah dikelompokkan. Hasil ini kemudian disimpan dalam basis data.
3.2.3.2. Deskripsi Proses 2 : Pencarian Dokumen 3.2.3.2.1. Deskripsi Proses 2.1
: Preprocessing Query
Proses ini mirip dengan proses preprocessing dokumen. Perbedaannya adalah preprocessing ini dilakukan hanya untuk mendapat token dalam bentuk sederhana saja dari query dengan cara penghilangan stopword dan stemming.
31
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
3.2.3.2.2. Deskripsi Proses 2.2
: Pembobotan Query
Karena DF sudah diketahui dari proses pembobotan saat pengelompokan dokumen yang disimpan dalam basis data, maka proses pembobotan dapat dilakukan dengan menggunakan Persamaan 2.1.
3.2.3.2.3. Deskripsi Proses 2.3
: Pemilihan Cluster Termirip
Dalam proses ini, centroid bertindak sebagai dokumen. Dengan rumus pada Persamaan 2.2, maka dapat ditemukan cluster mana yang paling mirip dengan
query, yaitu yang memiliki skor paling tinggi.
3.2.3.2.4. Deskripsi Proses 2.4
: Perangkingan Dokumen
Dalam proses ini, dilakukan pembobotan ulang terhadap dokumen yang ada di dalam cluster yang terpilih. Pembobotan ulang dilakukan dengan menghitung DF dari tiap term yang ada. Hasil penghitungan DF akan digunakan untuk menghitung ulang nilai TF-IDF. Dari hasil tersebut, rumus pada Persamaan 2.2 digunakan lagi untuk memberikan ranking pada dokumen. Hasil proses ini adalah daftar dokumen-dokumen yang dianggap relevan oleh sistem, tersusun dari paling relevan ke paling tidak relevan.
32
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
3.2.4. Rancangan Basis Data 3.2.4.1. Desain Konseptual Desain basis data untuk Sistem Pemerolehan Informasi berbasis Cluster pada level konseptual disajikan dalam gambar berikut : Id_cluster Id_cluster
uuid uuid
value value
Id_term Id_term
N
tftf
term term
N
Cluster
wakil
value value
N Term
punya
1 Id_document Id_document
Record_id Record_id
N
N assign assign
Document
content content Id_stopword Id_stopword
topic topic
stopword stopword
Id_rootword Id_rootword
Stopword_Ina
rootword rootword
Rootword_Ina
Gambar 3.10. ERD untuk sistem yang akan dibangun
3.2.4.2. Desain Logikal Desain basis data untuk Sistem Pemerolehan Informasi berbasis Cluster pada level logikal disajikan dalam gambar berikut : Document Cluster
Id_document (PK) Id_cluster Record_id Topic content
Id_cluster (PK) uuid
Centroid
Term_Document Term
Id_cluster (FK) Id_term (FK) value
Id_term (PK) term
Stopword_Ina
Id_document (FK) Id_term (FK) Tf w
Rootword_Ina
Id_stopword stopword
Id_rootword rootword
Gambar 3.11. Model relasional untuk sistem yang akan dibangun
33
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
3.2.4.3. Desain Fisikal 3.2.4.3.1. Tabel Cluster Desain basis data untuk Sistem Pemerolehan Informasi berbasis Cluster pada level fisikal untuk relasi Cluster disajikan dalam gambar berikut : NO
Nama Field
Tipe Data
Ukuran
Keterangan
1
idCluster
INT
11
Primary key dari tabel Cluster
2
Uuid
VARCHAR
300
UUID dari tiap cluster
Tabel 3.2. Desain basis data untuk Sistem Pemerolehan Informasi berbasis Cluster pada level fisikal untuk relasi Cluster
3.2.4.3.2. Tabel Document Desain basis data untuk Sistem Pemerolehan Informasi berbasis Cluster pada level fisikal untuk relasi Document disajikan dalam gambar berikut : NO
Nama Field
Tipe Data
Ukuran
Keterangan
1
Id_document
INT
11
Primary key dari tabel ClusterMember
2
Id_cluster
INT
11
Foreign key tabel ini, referensi
dari
tabel
Cluster 3
Record_id
VARCHAR
1000
Path
menuju
ke
dokumen terkait 4
Content
TEXT
Isi
dari
dokumen
terkait 5
Topic
TEXT
Topik dari dokumen terkait
Tabel 3.3. Desain basis data untuk Sistem Pemerolehan Informasi berbasis Cluster pada level fisikal untuk relasi Documents
34
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
3.2.4.3.3. Tabel Centroid Desain basis data untuk Sistem Pemerolehan Informasi berbasis Cluster pada level fisikal untuk relasi Centroid disajikan dalam gambar berikut : NO
Nama Field
Tipe Data
Ukuran
Keterangan
1
Id_cluster
INT
100
Foreign key tabel ini, referensi
dari
tabel
Cluster 2
Id_term
INT
11
Foreign key tabel ini, referensi
dari
tabel
Term 3
Value
Nilai bobot tiap term
DOUBLE
di centroid Tabel 3.4. Desain basis data untuk Sistem Pemerolehan Informasi berbasis Cluster pada level fisikal untuk relasi Centroid
3.2.4.3.4. Tabel Term Desain basis data untuk Sistem Pemerolehan Informasi berbasis Cluster pada level fisikal untuk relasi Term disajikan dalam gambar berikut : NO
Nama Field
Tipe Data
Ukuran
Keterangan
1
Id_term
INT
11
Primary key dari tabel ini
Term
2
VARCHAR
300
Kata yang disimpan
Tabel 3.5. Desain basis data untuk Sistem Pemerolehan Informasi berbasis Cluster pada level fisikal untuk relasi Term
3.2.4.3.5. Tabel Term_Document Desain basis data untuk Sistem Pemerolehan Informasi berbasis Cluster pada level fisikal untuk relasi Term_Document disajikan dalam gambar berikut : NO
Nama Field
Tipe Data
Ukuran
Keterangan
1
Id_document
INT
11
Foreign key tabel ini, referensi
35
dari
tabel
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
Document 2
Id_term
INT
11
Foreign key tabel ini, referensi
dari
tabel
Term 3
Tf
INT
11
4
W
DOUBLE
Term frequency Bobot term
Tabel 3.6. Desain basis data untuk Sistem Pemerolehan Informasi berbasis Cluster pada level fisikal untuk relasi Term_Document
3.2.4.3.6. Tabel Stopword_Ina Desain basis data untuk Sistem Pemerolehan Informasi berbasis Cluster pada level fisikal untuk relasi Stopword_Ina disajikan dalam gambar berikut : NO
Nama Field
Tipe Data
Ukuran
Keterangan
1
Id
INT
11
Primary key dari tabel ini
Stopword
2
VARCHAR
50
Kata
yang
menjadi
stopword Tabel 3.7. Desain basis data untuk Sistem Pemerolehan Informasi berbasis Cluster pada level fisikal untuk relasi Stopword_Ina
3.2.4.3.7. Tabel Rootword_Ina Desain basis data untuk Sistem Pemerolehan Informasi berbasis Cluster pada level fisikal untuk relasi Rootword_Ina disajikan dalam gambar berikut : NO
Nama Field
Tipe Data
Ukuran
Keterangan
1
Id
INT
11
Primary key dari tabel Rootword
2
Rootword
VARCHAR
50
Kata
yang
menjadi
rootword Tabel 3.8. Desain basis data untuk Sistem Pemerolehan Informasi berbasis Cluster pada level fisikal untuk relasi Rootword_Ina
36
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
3.2.5. Rancangan Antarmuka Pengguna 3.2.5.1. Antarmuka Pengelompokan Dokumen Rancangan antarmuka pengguna untuk proses pengelompokan dokumen ditunjukkan dalam gambar berikut ini :
Gambar 3.12. Rancangan antarmuka pengguna untuk proses pengelompokan dokumen
3.2.5.2. Antarmuka Pencarian Dokumen Rancangan antarmuka pengguna untuk proses pencarian dokumen ditunjukkan dalam gambar berikut ini :
Gambar 3.13. Rancangan antarmuka pengguna untuk proses pencarian dokumen
37
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
BAB IV IMPLEMENTASI SISTEM
4.1. Struktur Data Data berupa daftar term dan hubungannya dengan dokumen yang terkait disimpan dalam sebuah matriks logikal. Matriks ini tersusun atas baris sebagai dokumendokumen dan kolom sebagai term, selanjutnya disebut atribut. Dokumen disimpan dalam list yang disebut document list. Struktur data yang diimplementasikan untuk document list ini adalah ArrayList. Sementara itu, term disimpan dalam term list. Term list menggunakan struktur data LinkedList yang dimodifikasi, selanjutnya disebut Modified LinkedList. Modified LinkedList pada dasarnya adalah LinkedList yang secara otomatis mengurutkan data yang masuk ke dalamnya. Pemilihan LinkedList didasarkan pada kemampuan struktur data tersebut dalam penyimpanan dengan ruang dinamis. Dalam sistem ini, term digunakan sebagai basis pengurutan. Secara ringkas, struktur data untuk menyimpan informasi hubungan dokumen dan term ini ditampilkan dalam gambar berikut ini : ClusterPool
Cluster 1
Cluster 1
Cluster 1
Cluster
Doc 1
Document Term 1
Term 2
Doc 2
Gambar 4.1 Struktur data untuk term list yang menggunakan LinkedList dan document list yang menggunakan ArrayList
38
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
Sementara itu, HashMap digunakan untuk menyimpan master term dan DFnya. Master term ini nantinya digunakan untuk melakukan merge term list agar seluruh dokumen memiliki panjang term list yang sama. Dengan kata lain, memiliki index yang sama untuk term yang sama. Hashmap dalam penelitian ini memiliki struktur String term sebagai key dan int DF sebagai value. Pemilihan HashMap pada kasus ini didasarkan pada efisiensi HashMap dalam kecepatan pencarian nilai DF dibandingkan dengan penyimpanan dalam array ataupun List. Visualisasi HashMap yang diimplementasikan adalah sebagai berikut :
Gambar 4.2. Struktur data untuk master term list yang berupa HashMap
4.2. Implementasi Basis Data Tabel-tabel yang digunakan dalam sistem ini terlampir dalam bentuk create statement di bagian lampiran dokumen ini.
4.3. Implementasi Pengelompokan Dokumen 4.3.1. Implementasi G-Means Implementasi algoritma G-Means menurut Hamerly (2004), dengan Java adalah sebagai berikut: 1. Pilih level signifikan α untuk uji. 1. public double step1() { 2.
double alpha = 0.05;
39
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
3. 4.
return alpha; } Listing 4.1. Penentuan level signifikan 0.05
2. Dari pusat cluster tersebut, ambil dua buah “anak” pusat cluster, dinotasikan dengan c1 dan c2. 1. public double[][] step2Alternate2(Cluster cs) { 2.
Calculation calc = new Calculation();
3.
Utility util = new Utility();
4.
double[][] valueMatrix = util.convert2DPCAListToMatrix(cs);
5.
double[] clusterCenter = util.convert1DPCARecordToArray(cs.getCentroid());
6. 7.
for (int i = 0; i < valueMatrix.length; i++) {
8.
for (int j = 0; j < valueMatrix[i].length; j++) {
9.
if (j == valueMatrix[i].length - 1) {
10.
System.out.println(valueMatrix[i][j] + "");
11.
} else {
12.
System.out.print(valueMatrix[i][j] + ",");
13.
}
14. 15.
} }
16. 17.
Matrix dataMatrix = new Matrix(valueMatrix);
18. 19.
PCA pca = new PCA(dataMatrix, true);
20. 21.
Matrix eigenvectorsMatrix = pca.getEigenvectorsMatrix();
22.
double eigenval = pca.getEigenvalue(0);
23. 24.
Matrix princCompMtr = eigenvectorsMatrix.getMatrix(0,
40
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
eigenvectorsMatrix.getRowDimension() - 1, 0, 0); 25.
double[][] array = princCompMtr.getArray();
26. 27.
double[] princComp = new double[array.length];
28.
for (int i = 0; i < array.length; i++) {
29.
princComp[i] = (array[i][0] * (Math.sqrt(2*eigenval/Math.PI)));
30.
}
31. 32.
double[] initCentroid1 = new double[clusterCenter.length];
33.
double[] initCentroid2 = new double[clusterCenter.length];
34. 35.
for (int i = 0; i < clusterCenter.length; i++) {
36. 37.
if(Double.isNaN(princComp[i]) || Double.isInfinite(princComp[i])) {
38.
princComp[i] = 0.0;
39.
}
40. 41.
initCentroid1[i] = clusterCenter[i] + princComp[i];
42.
initCentroid2[i] = clusterCenter[i] - princComp[i];
43.
}
44. 45.
double[][] child = new double[2][initCentroid1.length];
46. 47.
child[0] = initCentroid1;
48.
child[1] = initCentroid2;
49. 50.
return child;
51. 52.
} Listing 4.2. Pemilihan “anak cluster utama”
41
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
3. Jalankan k-Means untuk memperbaiki anak cluster 1. public Cluster[] runKMeans(Cluster cluster, double[] initCentroid1, double[] initCentroid2) { 2. 3.
Utility util = new Utility();
4.
Calculation calc = new Calculation();
5. 6.
int limit = 1000;
7.
int index = 0;
8.
Cluster activeCluster = cluster;
9. 10.
double[] centroid1 = initCentroid1;
11.
double[] centroid2 = initCentroid2;
12. 13.
Cluster cluster1 = new Cluster();
14.
Cluster cluster2 = new Cluster();
15. 16.
// isi centroid awal
17.
cluster1.setCentroid(util.convert1DPCAArrayToRecord(centroid1));
18.
cluster2.setCentroid(util.convert1DPCAArrayToRecord(centroid2));
19. 20.
// beri nama cluster secara random
21.
cluster1.setClusterID(AutoGeneratedID.generateRandomString());
22.
cluster2.setClusterID(AutoGeneratedID.generateRandomString());
23. 24.
// assign ke variabel recordList (gak penting, hanya saja kadung tdk bisa refactor rename)
25.
LinkedList
recordList = activeCluster.getRecordList();
26. 27.
// buat list penampungan record yang telah diassign ke centroid
42
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
terdekat (sudah ditemukan clusternya) 28.
LinkedList tempRecordListCluster1 = null;
29.
LinkedList tempRecordListCluster2 = null;
30. 31.
a : while (true) {
32. 33.
tempRecordListCluster1 = new LinkedList<>();
34.
tempRecordListCluster2 = new LinkedList<>();
35. 36.
// assign ke centroid terdekat
37.
for (int j = 0; j < recordList.size(); j++) {
38.
Record rec = recordList.get(j);
39.
double[] dataArray = util.convert1DPCARecordToArray(rec);
40.
double distToCentroid1 = calc.euclideanDistance(dataArray, centroid1);
41.
double distToCentroid2 = calc.euclideanDistance(dataArray, centroid2);
42. 43.
if (distToCentroid1 > distToCentroid2) {
44.
tempRecordListCluster2.add(rec);
45.
} else {
46.
tempRecordListCluster1.add(rec);
47. 48.
} }
49. 50.
// hitung centroid baru
51.
if(tempRecordListCluster1.isEmpty() == false) {
52. 53.
centroid1 = calculateNewCentroid(tempRecordListCluster1); } else {
54.
System.out.println("empty cluster");
55.
cluster1.setRecordList(tempRecordListCluster1);
43
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
56. cluster1.setCentroid(util.convert1DPCAArrayToRecord(centroid1)); 57.
cluster2.setRecordList(tempRecordListCluster2);
58. cluster2.setCentroid(util.convert1DPCAArrayToRecord(centroid2)); 59. 60.
break a; }
61. 62.
if(tempRecordListCluster2.isEmpty() == false) {
63. 64.
centroid2 = calculateNewCentroid(tempRecordListCluster2); } else {
65.
System.out.println("empty cluster");
66.
cluster1.setRecordList(tempRecordListCluster1);
67. cluster1.setCentroid(util.convert1DPCAArrayToRecord(centroid1)); 68.
cluster2.setRecordList(tempRecordListCluster2);
69. cluster2.setCentroid(util.convert1DPCAArrayToRecord(centroid2)); 70. 71.
break a; }
72. 73.
// cek centroid baru thd centroid lama, apabila centroidBaru = centroidLama, maka kmeans selesai (stop while loop)
74.
boolean checkCluster1 = checkNewWithOldCentroid(centroid1, util.convert1DPCARecordToArray(cluster1.getCentroid()));
75.
boolean checkCluster2 = checkNewWithOldCentroid(centroid2, util.convert1DPCARecordToArray(cluster2.getCentroid()));
76. 77.
// pindahkan isi tempRecordListCluster ke recordList di Cluster yang sesuai
78.
cluster1.setRecordList(tempRecordListCluster1);
44
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
79. cluster1.setCentroid(util.convert1DPCAArrayToRecord(centroid1)); 80.
cluster2.setRecordList(tempRecordListCluster2);
81. cluster2.setCentroid(util.convert1DPCAArrayToRecord(centroid2)); 82. 83.
if(checkCluster1 && checkCluster2) {
84.
break a;
85.
}
86.
if(index >= limit) {
87.
break a;
88.
}
89. 90.
index++;
91.
}
92. 93.
Cluster[] arrayCluster = new Cluster[2];
94.
arrayCluster[0] = cluster1;
95.
arrayCluster[1] = cluster2;
96. 97. 98.
return arrayCluster; } Listing 4.3. Pemilihan anak cluster dengan k-means
4. Hitung nilai vektor v dengan v = c1 – c2. Lalu proyeksikan X ke v, menjadi X’, dengan rumus sebagai berikut ‖ ‖
Setelah itu, dilakukan normalisasi X` sehingga memiliki rerata 0 dan varian 1. 1. public double[] step4(double[] centroid1, double[] centroid2, Cluster
45
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
cluster) { 2.
Utility util = new Utility();
3. 4.
Calculation calc = new Calculation();
5. 6.
if (centroid1.length != centroid2.length) {
7. 8.
throw new IllegalArgumentException(); }
9. 10.
double[] v = new double[centroid1.length];
11. 12.
for (int i = 0; i < v.length; i++) {
13. 14.
v[i] = centroid1[i] - centroid2[i]; }
15. 16.
List recordList = cluster.getRecordList();
17.
int recListSize = recordList.size();
18. 19.
double[][]
xi
=
double[recListSize][recordList.get(0).getDataList().size()]; 20. 21.
for (int i = 0; i < recListSize; i++) {
22. 23.
xi[i] = util.convert1DPCARecordToArray(recordList.get(i)); }
24. 25.
double[] xiac = new double[recordList.size()];
26. 27.
double dotProduct = 0;
28.
double norm = 0;
29.
for (int i = 0; i < xi.length; i++) {
30.
dotProduct = calc.dotProduct(xi[i], v);
46
new
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
31.
norm = Math.sqrt(calc.dotProduct(v, v));
32.
xiac[i] = dotProduct / norm; // hati2 disini, kita tdk tahu di paper yg dimaksud dgn 2norm adl 2norm euclidean ataukah norm^2 (euc_norm^2), di code ini, asumsi yg dimaksud paper adalah norm^2
33.
}
34. 35.
double[] transform = calc.zScoreNormalization(xiac);
36. 37.
// mengurutkan xiac (ORDERED xi')
38.
double[] sortTransf = util.sortArray(transform);
39.
double[] z = new double[sortTransf.length];
40.
for (int i = 0; i < z.length; i++) {
41.
z[i] = calc.calculateCDF(sortTransf[i]);
42.
}
43. 44.
return z;
45.
}
Listing 4.4. Penghitungan vektor arah data dan proyeksi dataset X ke vektor arah data, serta normalisasi hasil proyeksi dengan z-score normalization
5. Hitung
. Apabila
diterima. Sebaliknya apabila
berada pada daerah non-kritis, maka H0 berada di dalam daerah kritis, maka H1
diterima dan pusat cluster yang baru adalah c1 dan c2. 1. public boolean step5(double[] x, double alpha) { 2.
boolean stat = false;
3.
double ad = NormalityTest.anderson_darling_statistic(x);
4. 5.
// adjustment for few datapoints
-- fitur ini dicoba justru membuat
jml cluster mjd tdk akurat (mjd lebih sedikit) 6.
ad = ad * (1 + (4 / x.length) - (25 / (Math.pow(x.length, 2))));
7.
47
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
8.
double
pValue
=
NormalityTest.anderson_darling_pvalue(ad,
x.length); 9. 10.
if (pValue >= alpha) {
11.
stat = true;
12.
} else {
13.
stat = false;
14.
}
15.
return stat;
16.
}
Listing 4.5. Uji statistik Anderson-Darling untuk melihat apakah cluster sudah terdistribusi normal atau belum
Source code sub sistem pengelompokan dokumen terlampir di bagian lampiran dokumen ini.
4.4. Implementasi Pencarian Dokumen 4.4.1. Implementasi Preprocessing Query Preprocessing
dilakukan
untuk
menghilangkan
stopword
dalam
query,
menyederhanakan query ke bentuk dasar, serta membobot query dengan TF-IDF. 1. 2. 3. 4. 5. 6. 7. 8.
Preprocess prep = new Preprocess(); Utility util = new Utility(); DatabaseRWOperation dbrw = new DatabaseRWOperation(); DataStructuring ds = new DataStructuring();
// ========== CLUSTER QUERYING ======================== 9. String query = userQuery; 10. 11. // ambil dari db 12. ModifiedLinkedList masterLinkedList = null; 13. try { 14. masterLinkedList = dbrw.readMasterTerm(); 15. } catch (SQLException ex) {
48
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
16. Logger.getLogger(MainRetrieval.class.getName()).log(Level.SEVERE, null, ex); 17. } 18. 19. prep.preprocessQuery(query); 20. String[] queryArray = prep.getContent(); 21. String[] wordArray = queryArray[0].split("\\s+"); 22. 23. String[] matchQuery = util.sentenceTermContainInList(masterLinkedList, wordArray); 24. System.out.println("matchQuery length: " + matchQuery.length); 25. 26. if (util.emptyStringArray(matchQuery)) { 27. System.out.println("tidak ditemukan dokumen dengan kata kunci tersebut"); 28. return null; 29. } else { 30. System.out.println("exist"); 31. } 32. 33. // UBAH QUERY KE BENTUK RECORD 34. Record recQuery = ds.tokenizeQuery(matchQuery); 35. 36. // MERGE AGAR MEMILIKI DIMENSI COLUMN YANG SAMA DENGAN RECORD YANG LAIN 37. recQuery = ds.mergeQuery(recQuery, masterLinkedList); 38. 39. // ambil dari db 40. HashMap<String, Integer> mapPointDf = null; 41. try { 42. mapPointDf = dbrw.mapPoint(); 43. } catch (SQLException ex) { 44. Logger.getLogger(MainRetrieval.class.getName()).log(Level.SEVERE, null, ex); 45. } 46. 47. // ambil dari db 48. int documentCount = 0; 49. try { 50. documentCount = dbrw.allDocumentCount(); 51. } catch (SQLException ex) { 52. Logger.getLogger(MainRetrieval.class.getName()).log(Level.SEVERE, null, ex);
49
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64.
}
// HITUNG BOBOT (TF-IDF) QUERY ModifiedLinkedList pointList = recQuery.getPointList(); Iterator iterator = pointList.iterator(); while (iterator.hasNext()) { Point next = iterator.next(); String term = next.getTerm(); boolean containsKey = mapPointDf.containsKey(term); if (containsKey) { next.setDf(mapPointDf.get(term)); double w = next.getTf() * Math.log10(documentCount / next.getDf()); 65. next.setWNorm(w); 66. } 67. } Listing 4.6. Preprocessing terhadap query pencarian
4.4.2. Implementasi Pencarian Berbasis Cluster dan Konvensional Perbedaan mendasar terletak pada line nomor 3, 5 dan 11. Apabila pencarian menggunakan cluster (line 3), maka mula-mula centroid dianggap sebagai dokumen dan diberikan skor terhadap query (line 5). Cluster yang centroidnya memiliki skor paling besar akan diretrieve. Dokumen didalamnya akan dibobot ulang terhadap query. Sementara apabila menggunakan pencarian konvensional, maka seluruh koleksi langsung diberikan skor terhadap query (line 11). 1. Cluster selectedCluster = null; 2. try { 3. if (isClusterBased) { 4. fastReadPool = clusterPool(); 5. matchIndex = matchIndex(fastReadPool, recQuery, 1); 6. if(matchIndex == -1) { 7. matchIndex = matchIndex(fastReadPool, recQuery, 2); 8. } 9. selectedCluster = dbrw.readSingleCluster(fastReadPool.getClusterAt(matchIndex)); 10. } else { 11. selectedCluster = dbrw.readMultipleCluster(); 12. } 13. 14. } catch (SQLException ex) {
50
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
15. Logger.getLogger(MainRetrieval.class.getName()).log(Level.SEVERE, null, ex); 16. } 17. 18. List documentWeighting = documentWeighting(selectedCluster, recQuery, 1); 19. if(documentWeighting.isEmpty()) { 20. documentWeighting = documentWeighting(selectedCluster, recQuery, 2); 21. } 22. 23. return documentWeighting; Listing 4.7. Implementasi pencarian dengan menggunakan cluster dan konvensional.
Source code sub sistem pencarian dokumen terlampir di bagian lampiran dokumen ini.
4.5. Implementasi Antarmuka Pengguna 4.5.1. Implementasi Antarmuka Pengelompokan Dokumen Capture screen antarmuka subsistem pengelompokan dokumen ketika pertama kali dijalankan disajikan dalam gambar berikut ini :
Gambar 4.3 Capture screen antarmuka subsistem pengelompokan dokumen (1)
51
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
Capture screen antarmuka subsistem pengelompokan dokumen ketika user telah memilih dokumen untuk dikelompokkan disajikan dalam gambar berikut ini :
Gambar 4.4. Capture screen antarmuka subsistem pengelompokan dokumen (2)
4.5.2. Implementasi Antarmuka Pencarian Dokumen Capture screen antarmuka subsistem pencarian dokumen ketika pertama kali dijalankan disajikan dalam gambar berikut ini :
Gambar 4.5. Capture screen antarmuka subsistem pencarian dokumen
52
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
Capture
screen
antarmuka
subsistem
pengelompokan
dokumen
ketika
memunculkan hasil pencarian disajikan dalam gambar berikut ini :
Gambar 4.6. Implementasi antarmuka pengguna subsistem pencarian dokumen berbasis cluster
Gambar 4.7. Implementasi antarmuka pengguna subsistem pencarian dokumen berbasis cluster
53
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
BAB V ANALISIS HASIL PENELITIAN
5.1. Analisis Hasil Sistem 5.1.1. Hasil Pengelompokan Dokumen Berikut ini disajikan hasil pengelompokan dokumen dalam bentuk tabel : NO 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
DOKUMEN IMPLEMENTASI SISTEM PAKAR BERBASIS WEB UNTUK DIAGNOSIS PENYAKIT PARU DAN SALURAN PERNAFASAN SISTEM PAKAR UNTUK MENGETAHUI PEMENUHAN GIZI DAN DETEKSI AWAL KESEHATAN IBU HAMIL BERBASIS WEB SISTEM PAKAR UNTUK MENDIAGNOSA PENYAKIT DIABETES MELLITUS BERBASIS MOBILE SISTEM PAKAR MENDIAGNOSA PENYAKIT PADA MANUSIA DENGAN PENALARAN BERBASIS ATURAN (RULE-BASED REASONING) SISTEM PAKAR UNTUK MENDIAGNOSA PENYAKIT TELINGA HIDUNG TENGGOROKAN PADA MANUSIA SISTEM PAKAR UNTUK DIAGNOSIS KERUSAKAN MESIN MOBIL PANTHER BERBASIS MOBILE PERANCANGAN SISTEM PAKAR PENYAKIT PARU-PARU MENGGUNAKAN METODE VCIRS SISTEM PAKAR PENGOBATAN REFLEKSOLOGI PENERAPAN METODE FORWARD CHAINING DAN TEOREMA BAYES PADA SISTEM PAKAR DIAGNOSA PENYAKIT TULANG SISTEM PAKAR UNTUK MENGIDENTIFIKASI PENYAKIT INFEKSI BAKTERI DAN VIRUS PEMODELAN SISTEM PAKAR DIAGNOSIS PENENTUAN LEVEL SAKIT ASMA DENGAN METODE FUZZY MAMDANI SISTEM PAKAR DIAGNOSA PENYAKIT TANAMAN PADI UNTUK MENINGKATKAN HASIL PANEN SISTEM PAKAR UNTUK DIAGNOSIS PENYAKIT AYAM YANG DISEBABKAN OLEH VIRUS APLIKASI SISTEM PAKAR DIAGNOSA PENYAKIT GINJAL DENGAN METODE DEMPSTER-SHAFER SISTEM PAKAR UNTUK DIAGNOSIS PENYAKIT THT BERBASIS WEB DENGAN "E2GLITE EXPERT SYSTEM SHELL" PERANCANGAN SISTEM PAKAR PENYAKIT PARU-PARU MENGGUNAKAN METODE VCIRS PERANCANGAN DAN PEMBUATAN APLIKASI SISTEM PAKAR UNTUK PERMASALAHAN TINDAK PIDANA TERHADAP HARTA KEKAYAAN IMPLEMENTASI SISTEM PAKAR UNTUK MENDIAGNOSIS PENYAKIT DENGAN GEJALA DEMAM MENGGUNAKAN METODE CERTAINTY FACTOR SISTEM PAKAR PENDIAGNOSA PENYAKIT ANAK MENGGUNAKAN CERTAINTY FACTOR (CF) SISTEM PENGAMBILAN KEPUTUSAN PEMBELIAN BARANG ELEKTRONIK
54
CLUSTER 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 3 3 4
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
40 41 42 43
MENGGUNAKAN METODE SINGLE MOVING AVERAGE PENGENALAN KARAKTER ANGKA DENGAN MENGGUNAKAN FUZZY CLUSTERING PENGKLASIFIKASIAN JENIS BATIK TULIS DENGAN MENGGUNAKAN METODE NEAREST CLUSTER CLASSIFIER (NCC) ANALISA PERBANDINGAN KLASIFIKASI DOKUMEN KARYA ILMIAH MENGGUNAKAN K-NEAREST NEIGHBOR DAN NAIVE BAYES CLUSTERING DATA TRANSAKSI PENJUALAN MENGGUNAKAN GENETIC KMEANS ALGORITHM (GKA) KEAMANAN DATA PADA JARINGAN WIMAX MENGGUNAKAN ALGORITMA ADVANCE ENCRYPTION STANDARD RIJNDAEL 256 BIT ANALISIS DAN PERANCANGAN MODEL DATA OPINION MINING MENGGUNAKAN ALGORITMA SUPPORT VECTOR MACHINE (STUDI KASUS: DATA TWITTER DENGAN KEYWORD MAKANAN) OPTIMASI PEMILIHAN SEEDS ALGORITMA K-MEANS PADA PENGELOMPOKAN DOKUMEN BERBAHASA INGGRIS SISTEM PENDUKUNG KEPUTUSAN UNTUK IDENTIFIKASI STATUS KELUARGA MISKIN MENGGUNAKAN METODE NAIVE BAYES CLASSIFIER PENERAPAN DATA MINING DENGAN METODE INTERPOLASI UNTUK MEMPREDIKSI MINAT KONSUMEN ASURANSI (STUDI KASUS ASURANSI METLIFE) PENERAPAN ALGORITMA K-NEAREST NEIGHBOR UNTUK PENENTUAN RESIKO KREDIT KEPEMILIKAN KENDARAAN BEMOTOR SISTEM INFORMASI GEOGRAFIS PEMERATAAN PENDIDIKAN UNTUK WAJIB BELAJAR 9 TAHUN DI GUNUNG KIDUL PERENCANAAN PEMBANGUNAN SISTEM INFORMASI TERINTEGRASI DENGAN ENTERPRISE ARCHITECTURE PLANNING (EAP) (STUDI KASUS : STIKOM DINAMIKA BANGSA JAMBI) SISTEM INFORMASI DATA BUKU BESAR PENERIMAAN DARI DINAS PENGELOLA PENDAPATAN DAERAH (STUDI KASUS : KANTOR GUBSU) ANALISA DATA DENGAN TEKNIK ASSOCIATION RULE DALAM DATA MINING SISTEM PENDUKUNG KEPUTUSAN PENENTUAN PROGRAM STUDI BAGI SISWA SMA PENERAPAN DATA MINING UNTUK MEMBANGUN E-MONEV MENGGUNAKAN ALGORITMA C4.5 (STUDI KASUS PENERIMAAN MAHASISWA BARU UIN MALIKI MALANG) SISTEM INFORMASI MANAJEMEN DEMOGRAFI KABUPATEN TRENGGALEK PENGEMBANGAN APLIKASI SISTEM INFORMASI SEKOLAH SEBAGAI SISTEM INFORMASI EKSEKUTIF PERANCANGAN SISTEM PENDUKUNG PENGAMBILAN KEPUTUSAN UNTUK PENERIMAAN BEASISWA DENGAN METODE SAW (SIMPLE ADDITIVE WEIGHTING) PENERAPAN DATA MINING DENGAN METODE KLASIFIKASI NAIVE BAYES UNTUK MEMPREDIKSI KELULUSAN MAHASISWA DALAM MENGIKUTI ENGLISH PROFICIENCY TEST DATA MINING PENGKLASIFIKASIAN PELANGGAN PEMBELI MOBIL DENGAN METODE DECISION TREE RANCANG BANGUN SISTEM INFORMASI MANAJEMEN JASA KONSTRUKSI BERBASIS WEB STUDI KASUS : PT. BINTANG MAS PRATAMA DESAIN SISTEM INFORMASI LAYANAN PELANGGAN DI PDAM TOMOHON BERBASIS WEB
55
5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6
6 6 6 6
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
SISTEM PENDUKUNG KEPUTUSAN MENENTUKAN JENIS USAHA DI BIDANG FOOD AND BEVERAGE IMPLEMENTASI METODE APRIORI UNTUK MENDUKUNG REKOMENDASI PRODUK PADA PETRA GAMING STORE PENERAPAN DATA MINING UNTUK EVALUASI KINERJA AKADEMIK MAHASISWA MENGGUNAKAN ALGORITMA NAIVE BAYES CLASSIFIER PENERAPAN DATA MINING UNTUK MEMPREDIKSI KRITERIA NASABAH KREDIT PENERAPAN ALGORITMA KLASIFIKASI DATA MINING ID3 UNTUK MENENTUKAN PENJURUSAN SISWA SMAN 6 SEMARANG SISTEM INFORMASI GEOGRAFIS (GIS) PADA JALAN KOTA MEDAN BERBASIS MOBILE PERANCANGAN SISTEM INFORMASI GEOGRAFIS PERIKANAN DI INDONESIA PENERAPAN DATA MINING MENGGUNAKAN ALGORITMA ASSOCIATION RULES UNTUK MEMPREDIKSI PILIHAN PROGRAM STUDI DI SEKOLAH TINGGI XYZ PENERAPAN DATA MINING DALAM EMAIL FILTERING MENGGUNAKAN METODE NAIVE BAYESIAN IMPLEMENTASI DATA MINING PADA PENJUALAN TIKET PESAWAT MENGGUNAKAN ALGORITMA APRIORI (Studi Kasus: Jumbo Travel Medan) KLASIFIKASI CITRA USG MENGGUNAKAN METODE EUCLIDEAN DISTANCE UNTUK ESTIMASI UKURAN KISTA OVARIUM PERBANDINGAN PARTITION AROUND MEDOIDS (PAM) DAN K-MEANS CLUSTERING UNTUK TWEETS SISTEM PENDUKUNG KEPUTUSAN UNTUK PEMILIHAN PROGRAM STUDI DENGAN METODE AHP SISTEM INFORMASI PENJUALAN BARANG PADA CV. INDOGLASS PENGENALAN POLA IMAGE KARAKTER DENGAN METODE NGUYEN WIDROW SISTEM INFORMASI PEMANTAUAN CUACA BERBASIS JARINGAN TELEPON SELULER SISTEM INFORMASI GEOGRAFIS PENCARIAN RUTE OPTIMUM OBYEK WISATA KOTA YOGYAKARTA DENGAN ALGORITMA FLOYD-WARSHALL SISTEM PENDUKUNG KEPUTUSAN PEMILIHAN MAHASISWA BERPRESTASI JURUSAN TEKNIK INFORMATIKA MENGGUNAKAN MODEL USE CASE ANALISIS DAN PERANCANGAN SISTEM PENDUKUNG KEPUTUSAN UNTUK PENENTUAN JALUR KELOMPOK KEAHLIAN MENGGUNAKAN MODEL SIMPLE ADDITIVE WEIGHTING (SAW) PEMBANGUNAN SPAM E-MAIL FILTERING SYSTEM DENGAN METODE NAIVE BAYESIAN PENENTUAN MAHASISWA KEPERAWATAN PRAKTEK TERBAIK DENGAN METODE DECI“ION TREE DAN MPE (“TUDI KA“U“: RUMAH “AKIT ‘X’ PEKANBARU) ANALISA PERBANDINGAN METODE ROUTING DISTANCE VECTOR DAN LINK STATE PADA JARINGAN PACKET SISTEM PENDUKUNG KEPUTUSAN PENENTUAN KELAYAKAN CALON RINTISAN SEKOLAH BERTARAF INTERNASIONAL DENGAN METODE FUZZY ASSOCIATIVE MEMORY SISTEM PENDUKUNG KEPUTUSAN DALAM PEMILIHAN ALTERNATIF ALAT KONTRASEPSI MENGGUNAKAN SIMPLE ADDITIVE WEIGHTING SISTEM PENDUKUNG KEPUTUSAN KELAYAKAN TKI KE LUAR NEGERI MENGGUNAKAN FMADM SISTEM PENUNJANG KEPUTUSAN PEMILIHAN PERANGKAT PEMROSESAN
56
6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
70 71 72 73 74 75 76 77 78 79
80 81 82 83 84 85 86 87 88 89 90 91 92
DATA MENGGUNAKAN METODE ANALYTICAL HIERARCHY PROCESS (AHP) DAN MULTI-CRITERIA DECISION MAKING (MCDM) SISTEM PENDUKUNG KEPUTUSAN PENILAIAN KINERJA DOSEN MENGGUNAKAN METODE FUZZY SAW (STUDI KASUS UNIVERSITAS POTENSI UTAMA) SISTEM PENDUKUNG KEPUTUSAN PEMILIHAN ANGGOTA SENAT MAHASISWA UNIVERSITAS KLABAT MENGGUNAKAN METODE AHP SURVEI PENERAPAN ALGORITMA GOSSIP JARINGAN AD HOC BERGERAK MARITIM SISTEM PENUNJANG KEPUTUSAN PENILAIAN HASIL KERJA UNTUK PENEMPATAN SDM BERKUALITAS PEMILIHAN SEPEDA MOTOR SECOND DENGAN METODE Analytical Hierarchy Process (AHP) ( STUDI KASUS : PT. XYZ ) SISTEM INFORMASI GEOGRAFIS PENILAIAN LOKASI ALTERNATIF UNTUK PENENTUAN LOKASI WARALABA SISTEM PENDUKUNG KEPUTUSAN PEMILIHAN KAMERA DIGITAL SINGLE-LENS REFLEX (DSLR) SISTEM PENDUKUNG KEPUTUSAN PENENTUAN LOKASI GUDANG DI PERUSAHAAN DENGAN METODE WEIGHTED PRODUCT SISTEM PENDUKUNG KEPUTUSAN PENENTUAN LOKASI BTS MENGGUNAKAN METODE PROMETHEE ANALISIS DAN PERBANDINGAN KINERJA DARI QOS MANAJEMEN PADA IP MULTIMEDIA SUBSYSTEM (IMS): MENGGUNAKAN INTSERV DAN DIFFSERV MODEL PERBAIKAN PROTOKOL ROUTING AD-HOC ON DEMAND MULTIPATH DISTANCE VECTOR (AOMDV) UNTUK MENDAPATKAN RUTE YANG STABIL MENGGUNAKAN LINK EXPIRATION TIME IMPLEMENTASI PROTOKOL ROUTING JARINGAN AD HOC MULTIUSER PADA GATEWAY UNTUK SISTEM KOMUNIKASI KAPAL LAUT ANALISIS KELAYAKAN PENGGUNAAN PROTOKOL WIRELESS UNTUK TRANSIMISI DATA PADA WIRELESS BODY AREA NETWORK (WBAN) PERANCANGAN PROTOTYPE JARINGAN IPv6 MENGGUNAKAN MIKROTIK ROUTER OS PADA PTS XYZ ANALISA QOS JARINGAN WIRELESS MODE AD HOC YANG MENGIMPLEMENTASIKAN PROTOKOL ZRP ANALISIS PERBANDINGAN PERFORMANSI REACTIVE ROUTING PROTOKOL AODV DAN DSR PADA JARINGAN AD HOC PENGEMBANGAN JARINGAN KOMPUTER UNIVERSITAS SURAKARTA BERDASARKAN PERBANDINGAN PROTOKOL ROUTING INFORMATION PROTOKOL (RIP) DAN PROTOKOL OPEN SHORTEST PATH FIRST (OSPF) OPTIMASI ROUTING PADA JARINGAN MANET MENGGUNAKAN MEDSR DAN LET PERBANDINGAN PERFORMANCE JARINGAN IPV6 NATIVE DENGAN TUNNELING TEREDO (6 to 4) ONE-WAY DELAY VOIP PADA JARINGAN WIRELESS INTRANET IMPLEMENTASI ROUTING PROTOCOL OPEN SHORTEST PATH FIRST(OSPF) PADA MODEL TOPOLOGY RING SISTEM INFORMASI GEOGRAFIS UNTUK PERJALANAN WISATA DI KOTA SEMARANG PREDIKSI EROSI LAHAN DAS BENGKULU DENGAN SISTEM INFORMASI GEOGRAFIS (SIG)
57
7 7 7 7 7 7 7 7 7 8
9 9 10 10 10 10 10 10 10 10 11 12 13
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
93 94 95 96 97 98 99 100
APLIKASI SISTEM INFORMASI GEOGRAFI UNTUK MENENTUKAN DAERAH PRIORITAS REHABILITASI DI CEKUNGAN BANDUNG IMPLEMENTASI SISTEM INFORMASI GEOGRAFIS MENGGUNAKAN GOOGLE MAPS API DALAM PEMETAAN ASAL MAHASISWA SISTEM INFORMASI GEOGRAFIS PEMETAAN PEMUKIMAN DI KAWASAN TAMAN NASIONAL KOMODO PEMBANGUNAN SISTEM INFORMASI GEOGRAFIS USAHA MIKRO KECIL DAN MENENGAH DI KABUPATEN KUDUS BERBASIS WEB SISTEM INFORMASI GEOGRAFIS JARINGAN PIPA STUDI KASUS: PDAM KOTA BANDUNG SISTEM INFORMASI GEOGRAFIS SLTP DI KOTAMADYA JAKARTA SELATAN ANALISA DAN PERANCANGAN INTRUSION DETECTION SYSTEM (IDS) PADA JARINGAN NIRKABEL STIKOM DINAMIKA BANGSA SISTEM INFORMASI GEOGRAFIS PENYEBARAN PENDUDUK BERDASARKAN TINGKAT USIA DI KABUPATEN SLEMAN BERBASIS WEB Tabel 5.1. Hasil pengelompokan dokumen yang dilakukan oleh sistem
14 14 14 14 14 14 14 15
5.1.1.1. Purity Kemiripan di dalam cluster dihitung oleh responden sebagai dasar penentuan purity dari hasil pengelompokan. Hasil penghitungan purity sebagai berikut ini : CLUSTER MATCH 1 16 2 1 3 2 4 1 5 8 6 11 7 15 8 1 9 2 10 8 11 1 12 1 13 1 14 6 15 1 TOTAL 75 Tabel 5.2. Hasil penghitungan dokumen-dokumen yang sesuai dengan cluster yang ditempati
Dengan total data sebanyak 100 dokumen, dapat dihitung nilai akurasi dari pemodelan cluster tersebut yaitu :
58
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
5.1.2. Hasil Pengujian Pencarian Dokumen berdasar Kueri Pengguna Pengujian pencarian dokumen menggunakan query sebagai berikut : 5.1.2.1. Pencarian dengan query “data mining” Kueri
: data mining
Jumlah dokumen relevan dalam koleksi
: 14
Jumlah seluruh dokumen dalam koleksi
: 100
5.1.2.1.1. Hasil Pencarian dengan Sistem Pemerolehan Informasi berbasis Cluster Jumlah dokumen yang diperoleh
: 11
Jumlah dokumen relevan yang diperoleh
: 11
Waktu eksekusi
: 13,3721 detik
Hasil penentuan relevansi dari dokumen yang diperoleh adalah sebagai berikut : NO 1 2 3 4 5 6 7 8
DOKUMEN PENERAPAN DATA MINING MENGGUNAKAN ALGORITMA ASSOCIATION RULES UNTUK MEMPREDIKSI PILIHAN PROGRAM STUDI DI SEKOLAH TINGGI XYZ ANALISA DATA DENGAN TEKNIK ASSOCIATION RULE DALAM DATA MINING PENERAPAN DATA MINING UNTUK MEMPREDIKSI KRITERIA NASABAH KREDIT PENERAPAN DATA MINING UNTUK MEMBANGUN E-MONEV MENGGUNAKAN ALGORITMA C4.5 (STUDI KASUS PENERIMAAN MAHASISWA BARU UIN MALIKI MALANG) PENERAPAN ALGORITMA KLASIFIKASI DATA MINING ID3 UNTUK MENENTUKAN PENJURUSAN SISWA SMAN 6 SEMARANG PENERAPAN DATA MINING UNTUK EVALUASI KINERJA AKADEMIK MAHASISWA MENGGUNAKAN ALGORITMA NAIVE BAYES CLASSIFIER IMPLEMENTASI DATA MINING PADA PENJUALAN TIKET PESAWAT MENGGUNAKAN ALGORITMA APRIORI (Studi Kasus: Jumbo Travel Medan) PENERAPAN DATA MINING DENGAN METODE KLASIFIKASI NAIVE BAYES UNTUK MEMPREDIKSI KELULUSAN MAHASISWA DALAM MENGIKUTI ENGLISH PROFICIENCY TEST
59
REL 1 1 1 1 1 1 1 1
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
IMPLEMENTASI METODE APRIORI UNTUK MENDUKUNG 1 REKOMENDASI PRODUK PADA PETRA GAMING STORE DATA MINING PENGKLASIFIKASIAN PELANGGAN PEMBELI MOBIL 10 1 DENGAN METODE DECISION TREE PENERAPAN DATA MINING DALAM EMAIL FILTERING MENGGUNAKAN 11 1 METODE NAIVE BAYESIAN Tabel 5.3. Hasil pencarian dengan query “data mining” pada Sistem Pemerolehan Informasi berbasis Cluster
9
Dari hasil penentuan relevansi tersebut, nilai recall dan precision dari sistem pemerolehan informasi berbasis cluster ditentukan sebagai berikut : RECALL PRECISION 0% 7% 14% 21% 29% 36% 43% 50% 57% 64% 71% 79%
100% 100% 100% 100% 100% 100% 100% 100% 100% 100% 100% 100%
Tabel 5.4. Penghitungan recall - precision terhadap query “data mining” pada Sistem Pemerolehan Informasi berbasis Cluster
Interpolasi 11 titik recall precision dari penghitungan recall – precision pada Tabel 5.1 ditampilkan pada tabel berikut ini : RECALL PRECISION 0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
100% 100% 100% 100% 100% 100% 100% 100% 0% 0% 0%
60
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
Tabel 5.5. Interpolasi 11 titik recall precision terhadap query “data mining” pada Sistem Pemerolehan Informasi berbasis Cluster
Visualisasi interpolasi 11 titik recall precision pada Tabel 5.5 ditampilkan dalam bentuk grafik sebagai berikut : 120% 100% 80% 60% 40%
20% 0% 0%
20%
40%
60%
80%
100%
120%
Berbasis Cluster
Gambar 5.1. Grafik interpolasi 11 titik recall precision terhadap query “data mining” pada Sistem Pemerolehan Informasi berbasis Cluster
5.1.2.1.2. Hasil Pencarian dengan Sistem Pemerolehan Informasi Konvensional Jumlah dokumen yang diperoleh
: 14
Jumlah dokumen relevan yang diperoleh
: 19
Waktu eksekusi
: 18,5425 detik
Hasil penentuan relevansi dari dokumen yang diperoleh adalah sebagai berikut : NO 1 2 3 4
DOKUMEN PENERAPAN DATA MINING MENGGUNAKAN ALGORITMA ASSOCIATION RULES UNTUK MEMPREDIKSI PILIHAN PROGRAM STUDI DI SEKOLAH TINGGI XYZ ANALISA DATA DENGAN TEKNIK ASSOCIATION RULE DALAM DATA MINING PENERAPAN DATA MINING UNTUK MEMPREDIKSI KRITERIA NASABAH KREDIT PENERAPAN DATA MINING UNTUK MEMBANGUN E-MONEV MENGGUNAKAN ALGORITMA C4.5 (STUDI KASUS PENERIMAAN MAHASISWA BARU UIN MALIKI MALANG)
61
REL 1 1 1 1
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
PENERAPAN ALGORITMA KLASIFIKASI DATA MINING ID3 UNTUK MENENTUKAN 1 PENJURUSAN SISWA SMAN 6 SEMARANG PENERAPAN DATA MINING UNTUK EVALUASI KINERJA AKADEMIK MAHASISWA 6 1 MENGGUNAKAN ALGORITMA NAIVE BAYES CLASSIFIER PENERAPAN DATA MINING DENGAN METODE INTERPOLASI UNTUK MEMPREDIKSI MINAT KONSUMEN ASURANSI (STUDI KASUS ASURANSI 7 1 METLIFE) IMPLEMENTASI DATA MINING PADA PENJUALAN TIKET PESAWAT 8 1 MENGGUNAKAN ALGORITMA APRIORI (Studi Kasus: Jumbo Travel Medan) ANALISIS DAN PERANCANGAN MODEL DATA OPINION MINING MENGGUNAKAN ALGORITMA SUPPORT VECTOR MACHINE (STUDI KASUS: 9 0 DATA TWITTER DENGAN KEYWORD MAKANAN) PENERAPAN DATA MINING DENGAN METODE KLASIFIKASI NAIVE BAYES 10 UNTUK MEMPREDIKSI KELULUSAN MAHASISWA DALAM MENGIKUTI ENGLISH 1 PROFICIENCY TEST IMPLEMENTASI METODE APRIORI UNTUK MENDUKUNG REKOMENDASI 11 1 PRODUK PADA PETRA GAMING STORE DATA MINING PENGKLASIFIKASIAN PELANGGAN PEMBELI MOBIL DENGAN 12 1 METODE DECISION TREE PENERAPAN ALGORITMA K-NEAREST NEIGHBOR UNTUK PENENTUAN RESIKO 13 1 KREDIT KEPEMILIKAN KENDARAAN BEMOTOR PENERAPAN DATA MINING DALAM EMAIL FILTERING MENGGUNAKAN 14 1 METODE NAIVE BAYESIAN OPTIMASI PEMILIHAN SEEDS ALGORITMA K-MEANS PADA PENGELOMPOKAN 15 0 DOKUMEN BERBAHASA INGGRIS PERBANDINGAN PARTITION AROUND MEDOIDS (PAM) DAN K-MEANS 16 0 CLUSTERING UNTUK TWEETS ANALISA PERBANDINGAN KLASIFIKASI DOKUMEN KARYA ILMIAH 17 0 MENGGUNAKAN K-NEAREST NEIGHBOR DAN NAIVE BAYES SISTEM PENDUKUNG KEPUTUSAN UNTUK IDENTIFIKASI STATUS KELUARGA 18 0 MISKIN MENGGUNAKAN METODE NAIVE BAYES CLASSIFIER PEMBANGUNAN SPAM E-MAIL FILTERING SYSTEM DENGAN METODE NAIVE 19 0 BAYESIAN Tabel 5.6. Hasil pencarian dengan query “data mining” pada Sistem Pemerolehan Informasi Konvensional
5
Dari hasil penentuan relevansi tersebut, nilai recall dan precision dari sistem pemerolehan informasi konvensional ditentukan sebagai berikut : RECALL PRECISION 0% 7% 14% 21% 29% 36% 43% 50%
100% 100% 100% 100% 100% 100% 100% 100%
62
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
57% 64% 71% 79% 86% 93%
100% 90% 91% 92% 92% 93%
Tabel 5.7. Penghitungan recall - precision terhadap query “data mining” pada Sistem Pemerolehan Informasi Konvensional
Interpolasi 11 titik recall precision dari penghitungan recall – precision pada Tabel 5.7. ditampilkan pada tabel berikut ini :
RECALL PRECISION 0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
100% 100% 100% 100% 100% 100% 93% 93% 93% 93% 0%
Tabel 5.8. Interpolasi 11 titik recall precision terhadap query “data mining” pada Sistem Pemerolehan Informasi berbasis Cluster
Visualisasi interpolasi 11 titik recall precision pada Tabel 5.8. ditampilkan dalam bentuk grafik sebagai berikut :
63
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
120% 100% 80% 60% 40% 20% 0% 0%
20%
40%
60%
80%
100%
120%
Konvensional
Gambar 5.2. Grafik interpolasi 11 titik recall precision terhadap query “data mining” pada Sistem Pemerolehan Informasi Konvensional
5.1.2.2. Pencarian dengan query “naïve bayes” Kueri
: naïve bayes
Jumlah dokumen relevan dalam koleksi
:5
Jumlah seluruh dokumen dalam koleksi
: 100
5.1.2.2.1. Hasil Pencarian dengan Sistem Pemerolehan Informasi berbasis Cluster Jumlah dokumen yang diperoleh
:1
Jumlah dokumen relevan yang diperoleh
:1
Waktu eksekusi
: 13,3514 detik
Hasil penentuan relevansi dari dokumen yang diperoleh adalah sebagai berikut : NO 1
DOKUMEN
REL
SISTEM PENDUKUNG KEPUTUSAN UNTUK IDENTIFIKASI STATUS KELUARGA 1 MISKIN MENGGUNAKAN METODE NAIVE BAYES CLASSIFIER Tabel 5.9. Hasil pencarian dengan query “naïve bayes” pada Sistem Pemerolehan Informasi berbasis Cluster
64
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
Dari hasil penentuan relevansi tersebut, nilai recall dan precision dari sistem pemerolehan informasi berbasis cluster ditentukan sebagai berikut : RECALL PRECISION 0% 20%
100% 100%
Tabel 5.10. Penghitungan recall - precision terhadap query “naïve bayes” pada Sistem Pemerolehan Informasi berbasis Cluster
Interpolasi 11 titik recall precision dari penghitungan recall – precision pada Tabel 5.10. ditampilkan pada tabel berikut ini :
RECALL PRECISION 0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
100% 100% 100% 0% 0% 0% 0% 0% 0% 0% 0%
Tabel 5.11. Interpolasi 11 titik recall precision terhadap query “naïve bayes” pada Sistem Pemerolehan Informasi berbasis Cluster
Visualisasi interpolasi 11 titik recall precision pada Tabel 5.11. ditampilkan dalam bentuk grafik sebagai berikut :
65
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
120% 100% 80% 60% 40% 20% 0% 0%
20%
40%
60%
80%
100%
120%
Berbasis Cluster
Gambar 5.3. Grafik interpolasi 11 titik recall precision terhadap query “naïve bayes” pada Sistem Pemerolehan Informasi berbasis Cluster
5.1.2.2.2. Hasil Pencarian dengan Sistem Pemerolehan Informasi Konvensional Jumlah dokumen yang diperoleh
:6
Jumlah dokumen relevan yang diperoleh
:5
Waktu eksekusi
: 16,0667 detik
Hasil penentuan relevansi dari dokumen yang diperoleh adalah sebagai berikut : NO
DOKUMEN
REL
PENERAPAN DATA MINING DENGAN METODE KLASIFIKASI NAIVE BAYES UNTUK MEMPREDIKSI KELULUSAN MAHASISWA DALAM MENGIKUTI ENGLISH 1 PROFICIENCY TEST SISTEM PENDUKUNG KEPUTUSAN UNTUK IDENTIFIKASI STATUS KELUARGA 2 1 MISKIN MENGGUNAKAN METODE NAIVE BAYES CLASSIFIER PENERAPAN DATA MINING UNTUK EVALUASI KINERJA AKADEMIK MAHASISWA 3 1 MENGGUNAKAN ALGORITMA NAIVE BAYES CLASSIFIER PEMBANGUNAN SPAM E-MAIL FILTERING SYSTEM DENGAN METODE NAIVE 4 1 BAYESIAN PENERAPAN METODE FORWARD CHAINING DAN TEOREMA BAYES PADA 5 1 SISTEM PAKAR DIAGNOSA PENYAKIT TULANG PEMODELAN SISTEM PAKAR DIAGNOSIS PENENTUAN LEVEL SAKIT ASMA 6 0 DENGAN METODE FUZZY MAMDANI Tabel 5.12. Hasil pencarian dengan query “naïve bayes” pada Sistem Pemerolehan Informasi Konvensional
1
66
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
Dari hasil penentuan relevansi tersebut, nilai recall dan precision dari sistem pemerolehan informasi konvensional ditentukan sebagai berikut : RECALL PRECISION 0% 20% 40% 60% 80% 100%
100% 100% 100% 100% 100% 100%
Tabel 5.13. Penghitungan recall - precision terhadap query “naïve bayes” pada Sistem Pemerolehan Informasi Konvensional
Interpolasi 11 titik recall precision dari penghitungan recall – precision pada Tabel 5.13. ditampilkan pada tabel berikut ini : RECALL PRECISION 0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
100% 100% 100% 100% 100% 100% 100% 100% 100% 100% 100%
Tabel 5.14. Interpolasi 11 titik recall precision terhadap query “naïve bayes” pada Sistem Pemerolehan Informasi Konvensional
Visualisasi interpolasi 11 titik recall precision pada Tabel 5.14. ditampilkan dalam bentuk grafik sebagai berikut :
67
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
120% 100% 80% 60% 40% 20% 0% 0%
20%
40%
60%
80%
100%
120%
Konvensional
Gambar 5.4. Grafik interpolasi 11 titik recall precision terhadap query “naïve bayes” pada Sistem Pemerolehan Informasi Konvensional
5.1.2.3. Pencarian dengan query “klasifikasi” Kueri
: klasifikasi
Jumlah dokumen relevan dalam koleksi
: 15
Jumlah seluruh dokumen dalam koleksi
: 100
5.1.2.3.1. Hasil Pencarian dengan Sistem Pemerolehan Informasi berbasis Cluster Jumlah dokumen yang diperoleh
:6
Jumlah dokumen relevan yang diperoleh
:6
Waktu eksekusi
: 14,0447 detik
Hasil penentuan relevansi dari dokumen yang diperoleh adalah sebagai berikut : NO 1 2 3
DOKUMEN PENGKLASIFIKASIAN JENIS BATIK TULIS DENGAN MENGGUNAKAN METODE NEAREST CLUSTER CLASSIFIER (NCC) PENERAPAN ALGORITMA K-NEAREST NEIGHBOR UNTUK PENENTUAN RESIKO KREDIT KEPEMILIKAN KENDARAAN BEMOTOR ANALISA PERBANDINGAN KLASIFIKASI DOKUMEN KARYA ILMIAH MENGGUNAKAN K-NEAREST NEIGHBOR DAN NAIVE BAYES
68
REL 1 1 1
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
ANALISIS DAN PERANCANGAN MODEL DATA OPINION MINING MENGGUNAKAN ALGORITMA SUPPORT VECTOR MACHINE (STUDI KASUS: 1 DATA TWITTER DENGAN KEYWORD MAKANAN) SISTEM PENDUKUNG KEPUTUSAN UNTUK IDENTIFIKASI STATUS KELUARGA 5 1 MISKIN MENGGUNAKAN METODE NAIVE BAYES CLASSIFIER CLUSTERING DATA TRANSAKSI PENJUALAN MENGGUNAKAN GENETIC K6 1 MEANS ALGORITHM (GKA) Tabel 5.15. Hasil pencarian dengan query “klasifikasi” pada Sistem Pemerolehan Informasi berbasis Cluster
4
Dari hasil penentuan relevansi tersebut, nilai recall dan precision dari sistem pemerolehan informasi berbasis cluster ditentukan sebagai berikut : RECALL PRECISION 0% 7% 13% 20% 27% 33% 40%
100% 100% 100% 100% 100% 100% 100%
Tabel 5.16. Penghitungan recall - precision terhadap query “klasifikasi” pada Sistem Pemerolehan Informasi berbasis Cluster
Interpolasi 11 titik recall precision dari penghitungan recall – precision pada Tabel 5.16. ditampilkan pada tabel berikut ini :
RECALL PRECISION 0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
100% 100% 100% 100% 100% 0% 0% 0% 0% 0% 0%
Tabel 5.17. Interpolasi 11 titik recall precision terhadap query “klasifikasi” pada Sistem Pemerolehan Informasi berbasis Cluster
69
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
Visualisasi interpolasi 11 titik recall precision pada Tabel 5.17. ditampilkan dalam bentuk grafik sebagai berikut : 120% 100% 80% 60% 40% 20% 0%
0%
20%
40%
60%
80%
100%
120%
Berbasis Cluster
Gambar 5.5. Grafik interpolasi 11 titik recall precision terhadap query “klasifikasi” pada Sistem Pemerolehan Informasi berbasis Cluster
5.1.2.3.2. Hasil Pencarian dengan Sistem Pemerolehan Informasi Konvensional Jumlah dokumen yang diperoleh
: 19
Jumlah dokumen relevan yang diperoleh
: 10
Waktu eksekusi
: 14,5661 detik
Hasil penentuan relevansi dari dokumen yang diperoleh adalah sebagai berikut : NO 1 2 3 4 5 6
DOKUMEN PENGKLASIFIKASIAN JENIS BATIK TULIS DENGAN MENGGUNAKAN METODE NEAREST CLUSTER CLASSIFIER (NCC) PENERAPAN DATA MINING UNTUK EVALUASI KINERJA AKADEMIK MAHASISWA MENGGUNAKAN ALGORITMA NAIVE BAYES CLASSIFIER DATA MINING PENGKLASIFIKASIAN PELANGGAN PEMBELI MOBIL DENGAN METODE DECISION TREE PENERAPAN ALGORITMA K-NEAREST NEIGHBOR UNTUK PENENTUAN RESIKO KREDIT KEPEMILIKAN KENDARAAN BEMOTOR ANALISA PERBANDINGAN KLASIFIKASI DOKUMEN KARYA ILMIAH MENGGUNAKAN K-NEAREST NEIGHBOR DAN NAIVE BAYES ANALISIS DAN PERANCANGAN MODEL DATA OPINION MINING
70
REL 1 1 1 1 1 0
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
MENGGUNAKAN ALGORITMA SUPPORT VECTOR MACHINE (STUDI KASUS: DATA TWITTER DENGAN KEYWORD MAKANAN) PENERAPAN DATA MINING DENGAN METODE KLASIFIKASI NAIVE BAYES UNTUK MEMPREDIKSI KELULUSAN MAHASISWA DALAM MENGIKUTI ENGLISH 7 1 PROFICIENCY TEST PENERAPAN DATA MINING UNTUK MEMBANGUN E-MONEV MENGGUNAKAN ALGORITMA C4.5 (STUDI KASUS PENERIMAAN MAHASISWA BARU UIN MALIKI 8 0 MALANG) SISTEM PENDUKUNG KEPUTUSAN UNTUK IDENTIFIKASI STATUS KELUARGA 9 0 MISKIN MENGGUNAKAN METODE NAIVE BAYES CLASSIFIER PENERAPAN ALGORITMA KLASIFIKASI DATA MINING ID3 UNTUK MENENTUKAN 10 1 PENJURUSAN SISWA SMAN 6 SEMARANG PENERAPAN DATA MINING DALAM EMAIL FILTERING MENGGUNAKAN 11 1 METODE NAIVE BAYESIAN 12 PENERAPAN DATA MINING UNTUK MEMPREDIKSI KRITERIA NASABAH KREDIT 1 PREDIKSI EROSI LAHAN DAS BENGKULU DENGAN SISTEM INFORMASI 13 0 GEOGRAFIS (SIG) SISTEM INFORMASI GEOGRAFIS PENILAIAN LOKASI ALTERNATIF UNTUK 14 0 PENENTUAN LOKASI WARALABA PEMBANGUNAN SPAM E-MAIL FILTERING SYSTEM DENGAN METODE NAIVE 15 1 BAYESIAN CLUSTERING DATA TRANSAKSI PENJUALAN MENGGUNAKAN GENETIC K16 0 MEANS ALGORITHM (GKA) SISTEM INFORMASI GEOGRAFIS PEMETAAN PEMUKIMAN DI KAWASAN 17 0 TAMAN NASIONAL KOMODO ANALISA DAN PERANCANGAN INTRUSION DETECTION SYSTEM (IDS) PADA 18 0 JARINGAN NIRKABEL STIKOM DINAMIKA BANGSA SISTEM PAKAR UNTUK DIAGNOSIS PENYAKIT THT BERBASIS WEB DENGAN 19 0 "E2GLITE EXPERT SYSTEM SHELL" Tabel 5.18. Hasil pencarian dengan query “klasifikasi” pada Sistem Pemerolehan Informasi Konvensional
Dari hasil penentuan relevansi tersebut, nilai recall dan precision dari sistem pemerolehan informasi konvensional ditentukan sebagai berikut : RECALL PRECISION 0% 7% 13% 20% 27% 33% 40% 47% 53% 60% 67%
100% 100% 100% 100% 100% 100% 86% 70% 73% 75% 67%
71
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
Tabel 5.19. Penghitungan recall - precision terhadap query “klasifikasi” pada Sistem Pemerolehan Informasi Konvensional
Interpolasi 11 titik recall precision dari penghitungan recall – precision pada Tabel 5.19. ditampilkan pada tabel berikut ini : RECALL PRECISION 0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
100% 100% 100% 100% 86% 75% 75% 0% 0% 0% 0%
Tabel 5.20. Interpolasi 11 titik recall precision terhadap query “klasifikasi” pada Sistem Pemerolehan Informasi Konvensional
Visualisasi interpolasi 11 titik recall precision pada Tabel 5.20. ditampilkan dalam bentuk grafik sebagai berikut : 120% 100% 80% 60% 40% 20%
0% 0%
20%
40%
60%
80%
100%
120%
Konvensional
Gambar 5.6. Grafik interpolasi 11 titik recall precision terhadap query “klasifikasi” pada Sistem Pemerolehan Informasi Konvensional
72
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
5.1.2.4. Pencarian dengan query “sistem pendukung keputusan” Kueri
: sistem pendukung keputusan
Jumlah dokumen relevan dalam koleksi
: 19
Jumlah seluruh dokumen dalam koleksi
: 100
5.1.2.4.1. Hasil Pencarian dengan Sistem Pemerolehan Informasi berbasis Cluster Jumlah dokumen yang diperoleh
: 14
Jumlah dokumen relevan yang diperoleh
: 14
Waktu eksekusi
: 12,4743 detik
Hasil penentuan relevansi dari dokumen yang diperoleh adalah sebagai berikut : NO 1 2 3 4 5 6 7 8 9 10 11 12
DOKUMEN SISTEM PENDUKUNG KEPUTUSAN PENENTUAN LOKASI GUDANG DI PERUSAHAAN DENGAN METODE WEIGHTED PRODUCT SISTEM PENDUKUNG KEPUTUSAN DALAM PEMILIHAN ALTERNATIF ALAT KONTRASEPSI MENGGUNAKAN SIMPLE ADDITIVE WEIGHTING SISTEM PENDUKUNG KEPUTUSAN PENENTUAN LOKASI BTS MENGGUNAKAN METODE PROMETHEE SISTEM PENDUKUNG KEPUTUSAN PENILAIAN KINERJA DOSEN MENGGUNAKAN METODE FUZZY SAW (STUDI KASUS UNIVERSITAS POTENSI UTAMA) SISTEM PENDUKUNG KEPUTUSAN KELAYAKAN TKI KE LUAR NEGERI MENGGUNAKAN FMADM SISTEM PENDUKUNG KEPUTUSAN PEMILIHAN MAHASISWA BERPRESTASI JURUSAN TEKNIK INFORMATIKA MENGGUNAKAN MODEL USE CASE SISTEM PENDUKUNG KEPUTUSAN PEMILIHAN KAMERA DIGITAL SINGLE-LENS REFLEX (DSLR) SISTEM PENDUKUNG KEPUTUSAN PENENTUAN KELAYAKAN CALON RINTISAN SEKOLAH BERTARAF INTERNASIONAL DENGAN METODE FUZZY ASSOCIATIVE MEMORY SISTEM PENDUKUNG KEPUTUSAN PEMILIHAN ANGGOTA SENAT MAHASISWA UNIVERSITAS KLABAT MENGGUNAKAN METODE AHP SISTEM PENDUKUNG KEPUTUSAN UNTUK PEMILIHAN PROGRAM STUDI DENGAN METODE AHP ANALISIS DAN PERANCANGAN SISTEM PENDUKUNG KEPUTUSAN UNTUK PENENTUAN JALUR KELOMPOK KEAHLIAN MENGGUNAKAN MODEL SIMPLE ADDITIVE WEIGHTING (SAW) PEMILIHAN SEPEDA MOTOR SECOND DENGAN METODE Analytical Hierarchy Process (AHP) ( STUDI KASUS : PT. XYZ )
73
REL 1 1 1 1 1 1 1 1 1 1 1 1
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
SISTEM PENUNJANG KEPUTUSAN PEMILIHAN PERANGKAT PEMROSESAN DATA MENGGUNAKAN METODE ANALYTICAL HIERARCHY PROCESS (AHP) DAN 1 MULTI-CRITERIA DECISION MAKING (MCDM) SISTEM PENUNJANG KEPUTUSAN PENILAIAN HASIL KERJA UNTUK 14 1 PENEMPATAN SDM BERKUALITAS Tabel 5.21. Hasil pencarian dengan query “sistem pendukung keputusan” pada Sistem Pemerolehan Informasi berbasis Cluster
13
Dari hasil penentuan relevansi tersebut, nilai recall dan precision dari sistem pemerolehan informasi berbasis cluster ditentukan sebagai berikut : RECALL PRECISION 0% 5% 11% 16% 21% 26% 32% 37% 42% 47% 53% 58% 63% 68% 74%
100% 100% 100% 100% 100% 100% 100% 100% 100% 100% 100% 100% 100% 100% 100%
Tabel 5.22. Penghitungan recall - precision terhadap query “sistem pendukung keputusan” pada Sistem Pemerolehan Informasi berbasis Cluster
Interpolasi 11 titik recall precision dari penghitungan recall – precision pada Tabel 5.22. ditampilkan pada tabel berikut ini : RECALL PRECISION 0% 10% 20% 30% 40% 50% 60% 70% 80%
100% 100% 100% 100% 100% 100% 100% 100% 0%
74
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
90% 100%
0% 0%
Tabel 5.23. Interpolasi 11 titik recall precision terhadap query “sistem pendukung keputusan” pada Sistem Pemerolehan Informasi berbasis Cluster
Visualisasi interpolasi 11 titik recall precision pada Tabel 5.23. ditampilkan dalam bentuk grafik sebagai berikut : 120% 100% 80% 60% 40% 20% 0% 0%
20%
40%
60%
80%
100%
120%
Berbasis Cluster
Gambar 5.7. Grafik interpolasi 11 titik recall precision terhadap query “sistem pendukung keputusan” pada Sistem Pemerolehan Informasi berbasis Cluster
5.1.2.4.2. Hasil Pencarian dengan Sistem Pemerolehan Informasi Konvensional Jumlah dokumen yang diperoleh
: 26
Jumlah dokumen relevan yang diperoleh
: 18
Waktu eksekusi
: 15,4405 detik
Hasil penentuan relevansi dari dokumen yang diperoleh adalah sebagai berikut : NO 1 2
DOKUMEN SISTEM PENDUKUNG KEPUTUSAN PENENTUAN LOKASI GUDANG DI PERUSAHAAN DENGAN METODE WEIGHTED PRODUCT PERANCANGAN SISTEM PENDUKUNG PENGAMBILAN KEPUTUSAN UNTUK PENERIMAAN BEASISWA DENGAN METODE SAW (SIMPLE ADDITIVE
75
REL 1 1
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
WEIGHTING) SISTEM PENDUKUNG KEPUTUSAN DALAM PEMILIHAN ALTERNATIF ALAT KONTRASEPSI MENGGUNAKAN SIMPLE ADDITIVE WEIGHTING SISTEM PENDUKUNG KEPUTUSAN MENENTUKAN JENIS USAHA DI BIDANG FOOD AND BEVERAGE SISTEM PENDUKUNG KEPUTUSAN PENENTUAN LOKASI BTS MENGGUNAKAN METODE PROMETHEE SISTEM PENDUKUNG KEPUTUSAN PENILAIAN KINERJA DOSEN MENGGUNAKAN METODE FUZZY SAW (STUDI KASUS UNIVERSITAS POTENSI UTAMA) SISTEM PENDUKUNG KEPUTUSAN KELAYAKAN TKI KE LUAR NEGERI MENGGUNAKAN FMADM SISTEM PENDUKUNG KEPUTUSAN PEMILIHAN MAHASISWA BERPRESTASI JURUSAN TEKNIK INFORMATIKA MENGGUNAKAN MODEL USE CASE SISTEM PENDUKUNG KEPUTUSAN PEMILIHAN KAMERA DIGITAL SINGLE-LENS REFLEX (DSLR) SISTEM PENDUKUNG KEPUTUSAN PENENTUAN KELAYAKAN CALON RINTISAN SEKOLAH BERTARAF INTERNASIONAL DENGAN METODE FUZZY ASSOCIATIVE MEMORY SISTEM PENDUKUNG KEPUTUSAN UNTUK IDENTIFIKASI STATUS KELUARGA MISKIN MENGGUNAKAN METODE NAIVE BAYES CLASSIFIER SISTEM PENDUKUNG KEPUTUSAN PEMILIHAN ANGGOTA SENAT MAHASISWA UNIVERSITAS KLABAT MENGGUNAKAN METODE AHP SISTEM PENDUKUNG KEPUTUSAN UNTUK PEMILIHAN PROGRAM STUDI DENGAN METODE AHP ANALISIS DAN PERANCANGAN SISTEM PENDUKUNG KEPUTUSAN UNTUK PENENTUAN JALUR KELOMPOK KEAHLIAN MENGGUNAKAN MODEL SIMPLE ADDITIVE WEIGHTING (SAW) PEMILIHAN SEPEDA MOTOR SECOND DENGAN METODE Analytical Hierarchy Process (AHP) ( STUDI KASUS : PT. XYZ ) SISTEM PENUNJANG KEPUTUSAN PEMILIHAN PERANGKAT PEMROSESAN DATA MENGGUNAKAN METODE ANALYTICAL HIERARCHY PROCESS (AHP) DAN MULTI-CRITERIA DECISION MAKING (MCDM) SISTEM PENUNJANG KEPUTUSAN PENILAIAN HASIL KERJA UNTUK PENEMPATAN SDM BERKUALITAS SISTEM PENDUKUNG KEPUTUSAN PENENTUAN PROGRAM STUDI BAGI SISWA SMA SISTEM INFORMASI GEOGRAFIS PEMERATAAN PENDIDIKAN UNTUK WAJIB BELAJAR 9 TAHUN DI GUNUNG KIDUL PENERAPAN DATA MINING DENGAN METODE INTERPOLASI UNTUK MEMPREDIKSI MINAT KONSUMEN ASURANSI (STUDI KASUS ASURANSI METLIFE) SISTEM INFORMASI GEOGRAFIS PENYEBARAN PENDUDUK BERDASARKAN TINGKAT USIA DI KABUPATEN SLEMAN BERBASIS WEB PENERAPAN DATA MINING MENGGUNAKAN ALGORITMA ASSOCIATION RULES UNTUK MEMPREDIKSI PILIHAN PROGRAM STUDI DI SEKOLAH TINGGI XYZ SISTEM PAKAR UNTUK MENDIAGNOSA PENYAKIT DIABETES MELLITUS BERBASIS MOBILE IMPLEMENTASI DATA MINING PADA PENJUALAN TIKET PESAWAT MENGGUNAKAN ALGORITMA APRIORI (Studi Kasus: Jumbo Travel Medan) PENGEMBANGAN APLIKASI SISTEM INFORMASI SEKOLAH SEBAGAI SISTEM INFORMASI EKSEKUTIF
76
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
26
PEMODELAN SISTEM PAKAR DIAGNOSIS PENENTUAN LEVEL SAKIT ASMA 0 DENGAN METODE FUZZY MAMDANI Tabel 5.24. Hasil pencarian dengan query “sistem pendukung keputusan” pada Sistem Pemerolehan Informasi Konvensional
Dari hasil penentuan relevansi tersebut, nilai recall dan precision dari sistem pemerolehan informasi konvensional ditentukan sebagai berikut : RECALL PRECISION 0% 5% 11% 16% 21% 26% 32% 37% 42% 47% 53% 58% 63% 68% 74% 79% 84% 89% 95%
100% 100% 100% 100% 100% 100% 100% 100% 100% 100% 100% 100% 100% 100% 100% 100% 100% 100% 100%
Tabel 5.25. Penghitungan recall - precision terhadap query “sistem pendukung keputusan” pada Sistem Pemerolehan Informasi Konvensional
Interpolasi 11 titik recall precision dari penghitungan recall – precision pada Tabel 5.13. ditampilkan pada tabel berikut ini : RECALL PRECISION 0% 10% 20% 30% 40% 50% 60% 70%
100% 100% 100% 100% 100% 100% 100% 100%
77
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
80% 90% 100%
100% 100% 0%
Tabel 5.26. Interpolasi 11 titik recall precision terhadap query “sistem pendukung keputusan” pada Sistem Pemerolehan Informasi Konvensional
Visualisasi interpolasi 11 titik recall precision pada Tabel 5.14. ditampilkan dalam bentuk grafik sebagai berikut : 120% 100% 80% 60% 40% 20% 0% 0%
20%
40%
60%
80%
100%
120%
Konvensional
Gambar 5.8. Grafik interpolasi 11 titik recall precision terhadap query “sistem pendukung keputusan” pada Sistem Pemerolehan Informasi Konvensional
5.1.2.5. Pencarian dengan query “jaringan komputer” Kueri
: jaringan komputer
Jumlah dokumen relevan
: 14
Jumlah seluruh dokumen dalam koleksi
: 100
5.1.2.5.1. Hasil Pencarian dengan Sistem Pemerolehan Informasi berbasis Cluster Jumlah dokumen yang diperoleh
:1
Jumlah dokumen relevan yang diperoleh
:1
78
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
Waktu eksekusi
: 12,2814 detik
Hasil penentuan relevansi dari dokumen yang diperoleh adalah sebagai berikut : NO 1
DOKUMEN
REL
IMPLEMENTASI ROUTING PROTOCOL OPEN SHORTEST PATH FIRST(OSPF) PADA 1 MODEL TOPOLOGY RING Tabel 5.27. Hasil pencarian dengan query “jaringan komputer” pada Sistem Pemerolehan Informasi berbasis Cluster
Dari hasil penentuan relevansi tersebut, nilai recall dan precision dari sistem pemerolehan informasi berbasis cluster ditentukan sebagai berikut : RECALL PRECISION 0% 7%
100% 100%
Tabel 5.28. Penghitungan recall - precision terhadap query “jaringan komputer” pada Sistem Pemerolehan Informasi berbasis Cluster
Interpolasi 11 titik recall precision dari penghitungan recall – precision pada Tabel 5.10. ditampilkan pada tabel berikut ini :
RECALL PRECISION 0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
100% 100% 100% 100% 100% 100% 0% 0% 0% 0% 0%
Tabel 5.29. Interpolasi 11 titik recall precision terhadap query “jaringan komputer” pada Sistem Pemerolehan Informasi berbasis Cluster
Visualisasi interpolasi 11 titik recall precision pada Tabel 5.11. ditampilkan dalam bentuk grafik sebagai berikut :
79
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
120% 100%
80% 60% 40% 20% 0% 0%
20%
40%
60%
80%
100%
120%
Berbasis Cluster
Gambar 5.9. Grafik interpolasi 11 titik recall precision terhadap query “jaringan komputer” pada Sistem Pemerolehan Informasi berbasis Cluster
5.1.2.5.2. Hasil Pencarian dengan Sistem Pemerolehan Informasi Konvensional Jumlah dokumen yang diperoleh
: 15
Jumlah dokumen relevan yang diperoleh
:8
Waktu eksekusi
: 14,9437 detik
Hasil penentuan relevansi dari dokumen yang diperoleh adalah sebagai berikut : NO 1 2 3 4 5 6 7
DOKUMEN PENGEMBANGAN JARINGAN KOMPUTER UNIVERSITAS SURAKARTA BERDASARKAN PERBANDINGAN PROTOKOL ROUTING INFORMATION PROTOKOL (RIP) DAN PROTOKOL OPEN SHORTEST PATH FIRST (OSPF) ANALISA DAN PERANCANGAN INTRUSION DETECTION SYSTEM (IDS) PADA JARINGAN NIRKABEL STIKOM DINAMIKA BANGSA PERBANDINGAN PERFORMANCE JARINGAN IPV6 NATIVE DENGAN TUNNELING TEREDO (6 to 4) IMPLEMENTASI ROUTING PROTOCOL OPEN SHORTEST PATH FIRST(OSPF) PADA MODEL TOPOLOGY RING ANALISA QOS JARINGAN WIRELESS MODE AD HOC YANG MENGIMPLEMENTASIKAN PROTOKOL ZRP ONE-WAY DELAY VOIP PADA JARINGAN WIRELESS INTRANET PERANCANGAN PROTOTYPE JARINGAN IPv6 MENGGUNAKAN MIKROTIK ROUTER OS PADA PTS XYZ
80
REL 1 1 1 1 1 1 1
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
SISTEM INFORMASI GEOGRAFIS JARINGAN PIPA STUDI KASUS: PDAM KOTA 0 BANDUNG KEAMANAN DATA PADA JARINGAN WIMAX MENGGUNAKAN ALGORITMA 9 1 ADVANCE ENCRYPTION STANDARD RIJNDAEL 256 BIT SISTEM INFORMASI PEMANTAUAN CUACA BERBASIS JARINGAN TELEPON 10 0 SELULER SISTEM PAKAR UNTUK MENGIDENTIFIKASI PENYAKIT INFEKSI BAKTERI DAN 11 0 VIRUS SISTEM PENDUKUNG KEPUTUSAN PENENTUAN LOKASI BTS MENGGUNAKAN 12 0 METODE PROMETHEE SISTEM PAKAR MENDIAGNOSA PENYAKIT PADA MANUSIA DENGAN 13 0 PENALARAN BERBASIS ATURAN (RULE-BASED REASONING) PERANCANGAN SISTEM PENDUKUNG PENGAMBILAN KEPUTUSAN UNTUK 14 PENERIMAAN BEASISWA DENGAN METODE SAW (SIMPLE ADDITIVE 0 WEIGHTING) 15 SISTEM INFORMASI MANAJEMEN DEMOGRAFI KABUPATEN TRENGGALEK 0 Tabel 5.30. Hasil pencarian dengan query “jaringan komputer” pada Sistem Pemerolehan Informasi berbasis Cluster
8
Dari hasil penentuan relevansi tersebut, nilai recall dan precision dari sistem pemerolehan informasi konvensional ditentukan sebagai berikut : RECALL PRECISION 0% 7% 14% 21% 29% 36% 43% 50% 57%
100% 100% 100% 100% 100% 100% 100% 100% 89%
Tabel 5.31. Penghitungan recall - precision terhadap query “jaringan komputer” pada Sistem Pemerolehan Informasi Konvensional
Interpolasi 11 titik recall precision dari penghitungan recall – precision pada Tabel 5.13. ditampilkan pada tabel berikut ini : RECALL PRECISION 0% 10% 20% 30% 40%
100% 100% 100% 100% 100%
81
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
50% 60% 70% 80% 90% 100%
100% 0% 0% 0% 0% 0%
Tabel 5.32. Interpolasi 11 titik recall precision terhadap query “jaringan komputer” pada Sistem Pemerolehan Informasi Konvensional
Visualisasi interpolasi 11 titik recall precision pada Tabel 5.14. ditampilkan dalam bentuk grafik sebagai berikut : 120% 100% 80% 60% 40% 20% 0% 0%
20%
40%
60%
Berbasis Cluster
80%
100%
120%
Konvensional
Gambar 5.10. Grafik interpolasi 11 titik recall precision terhadap query “jaringan komputer” pada Sistem Pemerolehan Informasi Konvensional
5.1.2.6. Pencarian dengan query “data mining menggunakan k-means” Kueri
: data mining menggunakan
k-means Jumlah dokumen relevan dalam koleksi
:3
Jumlah seluruh dokumen dalam koleksi
: 100
5.1.2.6.1. Hasil Pencarian dengan Sistem Pemerolehan Informasi berbasis Cluster Jumlah dokumen yang diperoleh
:1
82
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
Jumlah dokumen relevan yang diperoleh
:1
Waktu eksekusi
: 13,5197 detik
Hasil penentuan relevansi dari dokumen yang diperoleh adalah sebagai berikut : NO
DOKUMEN
REL
OPTIMASI PEMILIHAN SEEDS ALGORITMA K-MEANS PADA PENGELOMPOKAN 1 DOKUMEN BERBAHASA INGGRIS Tabel 5.33. Hasil pencarian dengan query “data mining menggunakan k-means” pada Sistem Pemerolehan Informasi berbasis Cluster
1
Dari hasil penentuan relevansi tersebut, nilai recall dan precision dari sistem pemerolehan informasi berbasis cluster ditentukan sebagai berikut : RECALL PRECISION 0% 33%
100% 100%
Tabel 5.34. Penghitungan recall - precision terhadap query “data mining menggunakan k-means” pada Sistem Pemerolehan Informasi berbasis Cluster
Interpolasi 11 titik recall precision dari penghitungan recall – precision pada Tabel 5.10. ditampilkan pada tabel berikut ini :
RECALL PRECISION 0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
100% 100% 100% 100% 0% 0% 0% 0% 0% 0% 0%
Tabel 5.35. Interpolasi 11 titik recall precision terhadap query “data mining menggunakan kmeans” pada Sistem Pemerolehan Informasi berbasis Cluster
Visualisasi interpolasi 11 titik recall precision pada Tabel 5.11. ditampilkan dalam bentuk grafik sebagai berikut :
83
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
120%
100% 80% 60% 40% 20% 0% 0%
20%
40%
60%
80%
100%
120%
Berbasis Cluster
Gambar 5.11. Grafik interpolasi 11 titik recall precision terhadap query “naïve bayes” pada Sistem Pemerolehan Informasi berbasis Cluster
5.1.2.6.2. Hasil Pencarian dengan Sistem Pemerolehan Informasi Konvensional Jumlah dokumen yang diperoleh
:3
Jumlah dokumen relevan yang diperoleh
:2
Waktu eksekusi
: 14,7423 detik
Hasil penentuan relevansi dari dokumen yang diperoleh adalah sebagai berikut : NO
DOKUMEN
REL
PERBANDINGAN PARTITION AROUND MEDOIDS (PAM) DAN K-MEANS 1 CLUSTERING UNTUK TWEETS OPTIMASI PEMILIHAN SEEDS ALGORITMA K-MEANS PADA PENGELOMPOKAN 2 1 DOKUMEN BERBAHASA INGGRIS PENERAPAN DATA MINING UNTUK EVALUASI KINERJA AKADEMIK MAHASISWA 3 0 MENGGUNAKAN ALGORITMA NAIVE BAYES CLASSIFIER Tabel 5.36. Hasil pencarian dengan query “data mining menggunakan k-means” pada Sistem Pemerolehan Informasi Konvensional
1
Dari hasil penentuan relevansi tersebut, nilai recall dan precision dari sistem pemerolehan informasi konvensional ditentukan sebagai berikut :
84
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
RECALL PRECISION 0% 33% 67%
100% 100% 100%
Tabel 5.37. Penghitungan recall - precision terhadap query “data mining menggunakan k-means” pada Sistem Pemerolehan Informasi Konvensional
Interpolasi 11 titik recall precision dari penghitungan recall – precision pada Tabel 5.13. ditampilkan pada tabel berikut ini : RECALL PRECISION 0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
100% 100% 100% 100% 100% 100% 100% 0% 0% 0% 0%
Tabel 5.38. Interpolasi 11 titik recall precision terhadap query “data mining menggunakan kmeans” pada Sistem Pemerolehan Informasi Konvensional
Visualisasi interpolasi 11 titik recall precision pada Tabel 5.14. ditampilkan dalam bentuk grafik sebagai berikut :
85
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
120% 100% 80% 60% 40% 20% 0% 0%
20%
40%
60%
80%
100%
120%
Konvensional
Gambar 5.12. Grafik interpolasi 11 titik recall precision terhadap query “data mining menggunakan k-means” pada Sistem Pemerolehan Informasi Konvensional
5.1.2.7. Pencarian dengan query “kesehatan manusia” Kueri
: kesehatan manusia
Jumlah dokumen relevan
: 14
Jumlah seluruh dokumen dalam koleksi
: 100
5.1.2.7.1. Hasil Pencarian dengan Sistem Pemerolehan Informasi berbasis Cluster Jumlah dokumen yang diperoleh
:5
Jumlah dokumen relevan yang diperoleh
:4
Waktu eksekusi
: 12,6810 detik
Hasil penentuan relevansi dari dokumen yang diperoleh adalah sebagai berikut : NO 1 2 3
DOKUMEN PENERAPAN METODE FORWARD CHAINING DAN TEOREMA BAYES PADA SISTEM PAKAR DIAGNOSA PENYAKIT TULANG SISTEM PAKAR MENDIAGNOSA PENYAKIT PADA MANUSIA DENGAN PENALARAN BERBASIS ATURAN (RULE-BASED REASONING) APLIKASI SISTEM PAKAR DIAGNOSA PENYAKIT GINJAL DENGAN METODE DEMPSTER-SHAFER
86
REL 1 1 1
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
SISTEM PAKAR UNTUK DIAGNOSIS PENYAKIT AYAM YANG DISEBABKAN OLEH 0 VIRUS 5 SISTEM PAKAR PENGOBATAN REFLEKSOLOGI 1 Tabel 5.39. Hasil pencarian dengan query “kesehatan manusia” pada Sistem Pemerolehan Informasi berbasis Cluster 4
Dari hasil penentuan relevansi tersebut, nilai recall dan precision dari sistem pemerolehan informasi berbasis cluster ditentukan sebagai berikut : RECALL PRECISION 0% 7% 14% 21% 29%
100% 100% 100% 100% 80%
Tabel 5.40. Penghitungan recall - precision terhadap query “kesehatan manusia” pada Sistem Pemerolehan Informasi berbasis Cluster
Interpolasi 11 titik recall precision dari penghitungan recall – precision pada Tabel 5.10. ditampilkan pada tabel berikut ini :
RECALL PRECISION 100% 100% 100% 0% 0% 0% 0% 0% 0% 0% 0%
100% 100% 100% 0% 0% 0% 0% 0% 0% 0% 0%
Tabel 5.41. Interpolasi 11 titik recall precision terhadap query “kesehatan manusia” pada Sistem Pemerolehan Informasi berbasis Cluster
Visualisasi interpolasi 11 titik recall precision pada Tabel 5.11. ditampilkan dalam bentuk grafik sebagai berikut :
87
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
120% 100%
80% 60% 40% 20% 0% 0%
20%
40%
60%
80%
100%
120%
Berbasis Cluster
Gambar 5.13. Grafik interpolasi 11 titik recall precision terhadap query “kesehatan manusia” pada Sistem Pemerolehan Informasi berbasis Cluster
5.1.2.7.2. Hasil Pencarian dengan Sistem Pemerolehan Informasi Konvensional Jumlah dokumen yang diperoleh
:5
Jumlah dokumen relevan yang diperoleh
:4
Waktu eksekusi
: 14,9348 detik
Hasil penentuan relevansi dari dokumen yang diperoleh adalah sebagai berikut : NO 1 2 3 4 5
DOKUMEN
REL
PENERAPAN METODE FORWARD CHAINING DAN TEOREMA BAYES PADA 1 SISTEM PAKAR DIAGNOSA PENYAKIT TULANG SISTEM PAKAR MENDIAGNOSA PENYAKIT PADA MANUSIA DENGAN 1 PENALARAN BERBASIS ATURAN (RULE-BASED REASONING) APLIKASI SISTEM PAKAR DIAGNOSA PENYAKIT GINJAL DENGAN METODE 1 DEMPSTER-SHAFER SISTEM PAKAR UNTUK DIAGNOSIS PENYAKIT AYAM YANG DISEBABKAN OLEH 0 VIRUS 1 SISTEM PAKAR PENGOBATAN REFLEKSOLOGI Tabel 5.42. Hasil pencarian dengan query “kesehatan manusia” pada Sistem Pemerolehan Informasi Konvensional
88
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
Dari hasil penentuan relevansi tersebut, nilai recall dan precision dari sistem pemerolehan informasi konvensional ditentukan sebagai berikut : RECALL PRECISION 0% 7% 14% 21% 29%
100% 100% 100% 100% 80%
Tabel 5.43. Penghitungan recall - precision terhadap query “kesehatan manusia” pada Sistem Pemerolehan Informasi Konvensional
Interpolasi 11 titik recall precision dari penghitungan recall – precision pada Tabel 5.13. ditampilkan pada tabel berikut ini : RECALL PRECISION 100% 100% 100% 0% 0% 0% 0% 0% 0% 0% 0%
100% 100% 100% 0% 0% 0% 0% 0% 0% 0% 0%
Tabel 5.44. Interpolasi 11 titik recall precision terhadap query “naïve bayes” pada Sistem Pemerolehan Informasi Konvensional
Visualisasi interpolasi 11 titik recall precision pada Tabel 5.14. ditampilkan dalam bentuk grafik sebagai berikut :
89
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
120% 100% 80% 60% 40% 20% 0% 0%
20%
40%
60%
Berbasis Cluster
80%
100%
120%
Konvensional
Gambar 5.14. Grafik interpolasi 11 titik recall precision terhadap query “naïve bayes” pada Sistem Pemerolehan Informasi Konvensional
5.1.2.8. Pencarian dengan query “diagnosa penyakit” Kueri
: diagnosa penyakit
Jumlah dokumen relevan
: 13
Jumlah seluruh dokumen dalam koleksi
: 100
5.1.2.8.1. Hasil Pencarian dengan Sistem Pemerolehan Informasi berbasis Cluster Jumlah dokumen yang diperoleh
:1
Jumlah dokumen relevan yang diperoleh
:1
Waktu eksekusi
: 12,2554 detik
Hasil penentuan relevansi dari dokumen yang diperoleh adalah sebagai berikut : NO 1
DOKUMEN
REL
SISTEM PAKAR PENDIAGNOSA PENYAKIT ANAK MENGGUNAKAN CERTAINTY 1 FACTOR (CF) Tabel 5.45. Hasil pencarian dengan query “diagnosa penyakit” pada Sistem Pemerolehan Informasi berbasis Cluster
90
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
Dari hasil penentuan relevansi tersebut, nilai recall dan precision dari sistem pemerolehan informasi berbasis cluster ditentukan sebagai berikut : RECALL PRECISION 0% 8%
100% 100%
Tabel 5.46. Penghitungan recall - precision terhadap query “diagnosa penyakit” pada Sistem Pemerolehan Informasi berbasis Cluster
Interpolasi 11 titik recall precision dari penghitungan recall – precision pada Tabel 5.10. ditampilkan pada tabel berikut ini :
RECALL PRECISION 0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
100% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0%
Tabel 5.47. Interpolasi 11 titik recall precision terhadap query “diagnosa penyakit” pada Sistem Pemerolehan Informasi berbasis Cluster
Visualisasi interpolasi 11 titik recall precision pada Tabel 5.11. ditampilkan dalam bentuk grafik sebagai berikut :
91
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
120% 100% 80% 60%
40% 20% 0% 0%
20%
40%
60%
80%
100%
120%
Berbasis Cluster
Gambar 5.15. Grafik interpolasi 11 titik recall precision terhadap query “diagnosa penyakit” pada Sistem Pemerolehan Informasi berbasis Cluster
5.1.2.8.2. Hasil Pencarian dengan Sistem Pemerolehan Informasi Konvensional Jumlah dokumen yang diperoleh
:8
Jumlah dokumen relevan yang diperoleh
:8
Waktu eksekusi
:15,1375 detik
Hasil penentuan relevansi dari dokumen yang diperoleh adalah sebagai berikut : NO 1 2 3 4 5 6 7 8
DOKUMEN APLIKASI SISTEM PAKAR DIAGNOSA PENYAKIT GINJAL DENGAN METODE DEMPSTER-SHAFER SISTEM PAKAR PENDIAGNOSA PENYAKIT ANAK MENGGUNAKAN CERTAINTY FACTOR (CF) SISTEM PAKAR UNTUK MENDIAGNOSA PENYAKIT DIABETES MELLITUS BERBASIS MOBILE PERANCANGAN SISTEM PAKAR PENYAKIT PARU-PARU MENGGUNAKAN METODE VCIRS SISTEM PAKAR DIAGNOSA PENYAKIT TANAMAN PADI UNTUK MENINGKATKAN HASIL PANEN SISTEM PAKAR MENDIAGNOSA PENYAKIT PADA MANUSIA DENGAN PENALARAN BERBASIS ATURAN (RULE-BASED REASONING) SISTEM PAKAR UNTUK MENDIAGNOSA PENYAKIT TELINGA HIDUNG TENGGOROKAN PADA MANUSIA PENERAPAN METODE FORWARD CHAINING DAN TEOREMA BAYES PADA
92
REL 1 1 1 1 1 1 1 1
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
SISTEM PAKAR DIAGNOSA PENYAKIT TULANG Tabel 5.48. Hasil pencarian dengan query “diagnosa penyakit” pada Sistem Pemerolehan Informasi Konvensional
Dari hasil penentuan relevansi tersebut, nilai recall dan precision dari sistem pemerolehan informasi konvensional ditentukan sebagai berikut : RECALL PRECISION 0% 8% 15% 23% 31% 38% 46% 54% 62%
100% 100% 100% 100% 100% 100% 100% 100% 100%
Tabel 5.49. Penghitungan recall - precision terhadap query “diagnosa penyakit” pada Sistem Pemerolehan Informasi Konvensional
Interpolasi 11 titik recall precision dari penghitungan recall – precision pada Tabel 5.13. ditampilkan pada tabel berikut ini : RECALL PRECISION 0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
100% 100% 100% 100% 100% 100% 100% 0% 0% 0% 0%
Tabel 5.50. Interpolasi 11 titik recall precision terhadap query “diagnosa penyakit” pada Sistem Pemerolehan Informasi Konvensional
Visualisasi interpolasi 11 titik recall precision pada Tabel 5.14. ditampilkan dalam bentuk grafik sebagai berikut :
93
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
120% 100% 80% 60% 40% 20% 0% 0%
20%
40%
60%
80%
100%
120%
Konvensional
Gambar 5.16. Grafik interpolasi 11 titik recall precision terhadap query “diagnosa penyakit” pada Sistem Pemerolehan Informasi Konvensional
5.1.2.9. Pencarian dengan query “tcp udp” Kueri
: tcp udp
Jumlah dokumen relevan
:2
Jumlah seluruh dokumen dalam koleksi
: 100
5.1.2.9.1. Hasil Pencarian dengan Sistem Pemerolehan Informasi berbasis Cluster Jumlah dokumen yang diperoleh
:4
Jumlah dokumen relevan yang diperoleh
:2
Waktu eksekusi
: 12,0591 detik
Hasil penentuan relevansi dari dokumen yang diperoleh adalah sebagai berikut : NO 1 2 3
DOKUMEN PENGEMBANGAN JARINGAN KOMPUTER UNIVERSITAS SURAKARTA BERDASARKAN PERBANDINGAN PROTOKOL ROUTING INFORMATION PROTOKOL (RIP) DAN PROTOKOL OPEN SHORTEST PATH FIRST (OSPF) PERBANDINGAN PERFORMANCE JARINGAN IPV6 NATIVE DENGAN TUNNELING TEREDO (6 to 4) PERANCANGAN PROTOTYPE JARINGAN IPv6 MENGGUNAKAN MIKROTIK
94
REL 0 1 1
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
ROUTER OS PADA PTS XYZ ANALISIS PERBANDINGAN PERFORMANSI REACTIVE ROUTING PROTOKOL 4 0 AODV DAN DSR PADA JARINGAN AD HOC Tabel 5.51. Hasil pencarian dengan query “tcp udp” pada Sistem Pemerolehan Informasi berbasis Cluster
Dari hasil penentuan relevansi tersebut, nilai recall dan precision dari sistem pemerolehan informasi berbasis cluster ditentukan sebagai berikut : RECALL PRECISION 0% 50% 100%
0% 50% 67%
Tabel 5.52. Penghitungan recall - precision terhadap query “tcp udp” pada Sistem Pemerolehan Informasi berbasis Cluster
Interpolasi 11 titik recall precision dari penghitungan recall – precision pada Tabel 5.10. ditampilkan pada tabel berikut ini :
RECALL PRECISION 0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
67% 67% 67% 67% 67% 67% 67% 67% 67% 67% 67%
Tabel 5.53. Interpolasi 11 titik recall precision terhadap query “tcp udp” pada Sistem Pemerolehan Informasi berbasis Cluster
Visualisasi interpolasi 11 titik recall precision pada Tabel 5.11. ditampilkan dalam bentuk grafik sebagai berikut :
95
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
80% 70% 60% 50% 40% 30% 20% 10% 0% 0%
20%
40%
60%
80%
100%
120%
Berbasis Cluster
Gambar 5.17. Grafik interpolasi 11 titik recall precision terhadap query “tcp udp” pada Sistem Pemerolehan Informasi berbasis Cluster
5.1.2.9.2. Hasil Pencarian dengan Sistem Pemerolehan Informasi Konvensional Jumlah dokumen yang diperoleh
:4
Jumlah dokumen relevan yang diperoleh
:2
Waktu eksekusi
: 14,7241 detik
Hasil penentuan relevansi dari dokumen yang diperoleh adalah sebagai berikut : NO
DOKUMEN
REL
PENGEMBANGAN JARINGAN KOMPUTER UNIVERSITAS SURAKARTA BERDASARKAN PERBANDINGAN PROTOKOL ROUTING INFORMATION 0 PROTOKOL (RIP) DAN PROTOKOL OPEN SHORTEST PATH FIRST (OSPF) PERBANDINGAN PERFORMANCE JARINGAN IPV6 NATIVE DENGAN TUNNELING 2 1 TEREDO (6 to 4) PERANCANGAN PROTOTYPE JARINGAN IPv6 MENGGUNAKAN MIKROTIK 3 1 ROUTER OS PADA PTS XYZ ANALISIS PERBANDINGAN PERFORMANSI REACTIVE ROUTING PROTOKOL 4 0 AODV DAN DSR PADA JARINGAN AD HOC Tabel 5.54. Hasil pencarian dengan query “tcp udp” pada Sistem Pemerolehan Informasi Konvensional
1
96
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
Dari hasil penentuan relevansi tersebut, nilai recall dan precision dari sistem pemerolehan informasi konvensional ditentukan sebagai berikut : RECALL PRECISION 0% 50% 100%
100% 50% 67%
Tabel 5.55. Penghitungan recall - precision terhadap query “tcp udp” pada Sistem Pemerolehan Informasi Konvensional
Interpolasi 11 titik recall precision dari penghitungan recall – precision pada Tabel 5.13. ditampilkan pada tabel berikut ini : RECALL PRECISION 0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
100% 100% 100% 100% 100% 100% 67% 67% 67% 67% 67%
Tabel 5.56. Interpolasi 11 titik recall precision terhadap query “tcp udp” pada Sistem Pemerolehan Informasi Konvensional
Visualisasi interpolasi 11 titik recall precision pada Tabel 5.14. ditampilkan dalam bentuk grafik sebagai berikut :
97
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
120% 100%
80% 60% 40% 20% 0% 0%
20%
40%
60%
80%
100%
120%
Konvensional
Gambar 5.18. Grafik interpolasi 11 titik recall precision terhadap query “tcp udp” pada Sistem Pemerolehan Informasi Konvensional
5.1.2.10. Pencarian dengan query “wireless” Kueri
: wireless
Jumlah dokumen relevan
:6
Jumlah seluruh dokumen dalam koleksi
: 100
5.1.2.10.1.
Hasil Pencarian dengan Sistem Pemerolehan Informasi
berbasis Cluster Jumlah dokumen yang diperoleh
:6
Jumlah dokumen relevan yang diperoleh
:4
Waktu eksekusi
: 12,7906 detik
Hasil penentuan relevansi dari dokumen yang diperoleh adalah sebagai berikut : NO 1 2 3 4
DOKUMEN ANALISIS KELAYAKAN PENGGUNAAN PROTOKOL WIRELESS UNTUK TRANSIMISI DATA PADA WIRELESS BODY AREA NETWORK (WBAN) ONE-WAY DELAY VOIP PADA JARINGAN WIRELESS INTRANET ANALISA QOS JARINGAN WIRELESS MODE AD HOC YANG MENGIMPLEMENTASIKAN PROTOKOL ZRP OPTIMASI ROUTING PADA JARINGAN MANET MENGGUNAKAN MEDSR DAN
98
REL 1 1 1 1
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
LET ANALISIS PERBANDINGAN PERFORMANSI REACTIVE ROUTING PROTOKOL 5 0 AODV DAN DSR PADA JARINGAN AD HOC PERANCANGAN PROTOTYPE JARINGAN IPv6 MENGGUNAKAN MIKROTIK 6 0 ROUTER OS PADA PTS XYZ Tabel 5.57. Hasil pencarian dengan query “wireless” pada Sistem Pemerolehan Informasi berbasis Cluster
Dari hasil penentuan relevansi tersebut, nilai recall dan precision dari sistem pemerolehan informasi berbasis cluster ditentukan sebagai berikut : RECALL PRECISION 0% 17% 33% 50% 67%
100% 100% 100% 100% 100%
Tabel 5.58. Penghitungan recall - precision terhadap query “wireless” pada Sistem Pemerolehan Informasi berbasis Cluster
Interpolasi 11 titik recall precision dari penghitungan recall – precision pada Tabel 5.10. ditampilkan pada tabel berikut ini :
RECALL PRECISION 0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
100% 100% 100% 100% 100% 100% 100% 0% 0% 0% 0%
Tabel 5.59. Interpolasi 11 titik recall precision terhadap query “wireless” pada Sistem Pemerolehan Informasi berbasis Cluster
Visualisasi interpolasi 11 titik recall precision pada Tabel 5.11. ditampilkan dalam bentuk grafik sebagai berikut :
99
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
120%
100% 80% 60% 40% 20% 0% 0%
20%
40%
60%
80%
100%
120%
Berbasis Cluster
Gambar 5.19. Grafik interpolasi 11 titik recall precision terhadap query “wireless” pada Sistem Pemerolehan Informasi berbasis Cluster
5.1.2.10.2.
Hasil Pencarian dengan Sistem Pemerolehan Informasi
Konvensional Jumlah dokumen yang diperoleh
:9
Jumlah dokumen relevan yang diperoleh
:5
Waktu eksekusi
: 14,4841 detik
Hasil penentuan relevansi dari dokumen yang diperoleh adalah sebagai berikut : NO 1 2 3 4 5 6 7 8
DOKUMEN ANALISIS KELAYAKAN PENGGUNAAN PROTOKOL WIRELESS UNTUK TRANSIMISI DATA PADA WIRELESS BODY AREA NETWORK (WBAN) ONE-WAY DELAY VOIP PADA JARINGAN WIRELESS INTRANET ANALISA QOS JARINGAN WIRELESS MODE AD HOC YANG MENGIMPLEMENTASIKAN PROTOKOL ZRP OPTIMASI ROUTING PADA JARINGAN MANET MENGGUNAKAN MEDSR DAN LET KEAMANAN DATA PADA JARINGAN WIMAX MENGGUNAKAN ALGORITMA ADVANCE ENCRYPTION STANDARD RIJNDAEL 256 BIT ANALISIS PERBANDINGAN PERFORMANSI REACTIVE ROUTING PROTOKOL AODV DAN DSR PADA JARINGAN AD HOC IMPLEMENTASI PROTOKOL ROUTING JARINGAN AD HOC MULTIUSER PADA GATEWAY UNTUK SISTEM KOMUNIKASI KAPAL LAUT ANALISIS DAN PERBANDINGAN KINERJA DARI QOS MANAJEMEN PADA IP
100
REL 1 1 1 1 1 0 0 0
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
MULTIMEDIA SUBSYSTEM (IMS): MENGGUNAKAN INTSERV DAN DIFFSERV MODEL PERANCANGAN PROTOTYPE JARINGAN IPv6 MENGGUNAKAN MIKROTIK 9 0 ROUTER OS PADA PTS XYZ Tabel 5.60. Hasil pencarian dengan query “wireless” pada Sistem Pemerolehan Informasi Konvensional
Dari hasil penentuan relevansi tersebut, nilai recall dan precision dari sistem pemerolehan informasi konvensional ditentukan sebagai berikut : RECALL PRECISION 0% 17% 33% 50% 67% 83%
100% 100% 100% 100% 100% 100%
Tabel 5.61. Penghitungan recall - precision terhadap query “wireless” pada Sistem Pemerolehan Informasi Konvensional
Interpolasi 11 titik recall precision dari penghitungan recall – precision pada Tabel 5.13. ditampilkan pada tabel berikut ini : RECALL PRECISION 0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
100% 100% 100% 100% 100% 100% 100% 100% 100% 0% 0%
Tabel 5.62. Interpolasi 11 titik recall precision terhadap query “wireless” pada Sistem Pemerolehan Informasi Konvensional
Visualisasi interpolasi 11 titik recall precision pada Tabel 5.14. ditampilkan dalam bentuk grafik sebagai berikut :
101
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
120% 100% 80% 60% 40% 20% 0% 0%
20%
40%
60%
80%
100%
120%
Konvensional
Gambar 5.20. Grafik interpolasi 11 titik recall precision terhadap query “wireless” pada Sistem Pemerolehan Informasi Konvensional
5.2. Pembahasan 5.2.1. Rerata Interpolasi 11 Titik Recall – Precision Hasil percobaan tersebut diatas dapat dirangkum dalam tabel berikut ini : 5.2.1.1. Sistem Pemerolehan Informasi berbasis Cluster Interpolasi 11 titik recall precision dari pengujian dengan 10 query pencarian dengan menggunakan Sistem Pemerolehan Informasi berbasis Cluster disajikan dalam tabel berikut ini : RECALL
0% 10% 20% 30% 40% 50% 60% 70% 80% 90%
QUERY 1
2
3
4
5
6
7
8
9
10
100% 100% 100% 100% 100% 100% 100% 100% 0% 0%
100% 100% 100% 0% 0% 0% 0% 0% 0% 0%
100% 100% 100% 100% 100% 0% 0% 0% 0% 0%
100% 100% 100% 100% 100% 100% 100% 100% 0% 0%
100% 100% 100% 100% 100% 100% 0% 0% 0% 0%
100% 100% 100% 100% 0% 0% 0% 0% 0% 0%
100% 100% 100% 0% 0% 0% 0% 0% 0% 0%
100% 0% 0% 0% 0% 0% 0% 0% 0% 0%
67% 67% 67% 67% 67% 67% 67% 67% 67% 67%
100% 100% 100% 100% 100% 100% 100% 0% 0% 0%
AVERAGE
Tabel 5.63. Interpolasi 11 titik recall precision dari pengujian dengan 10 query pencarian dengan menggunakan Sistem Pemerolehan Informasi berbasis Cluster
102
97% 87% 87% 67% 57% 47% 37% 27% 7% 7%
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
5.2.1.2. Sistem Pemerolehan Informasi Konvensional Interpolasi 11 titik recall precision dari pengujian dengan 10 query pencarian dengan menggunakan Sistem Pemerolehan Informasi Konvensional disajikan dalam tabel berikut ini: RECALL
0% 10% 20% 30% 40% 50% 60% 70% 80% 90%
QUERY 1
2
3
4
5
100% 100% 100% 100% 100% 100% 93% 93% 93% 93%
100% 100% 100% 100% 100% 100% 100% 100% 100% 100%
100% 100% 100% 100% 86% 75% 75% 0% 0% 0%
100% 100% 100% 100% 100% 100% 100% 100% 100% 100%
100% 100% 100% 100% 100% 100% 0% 0% 0% 0%
6
7
8
9
10
100% 100% 100% 100% 100% 100% 100% 100% 100% 100% 100% 100% 100% 100% 100% 100% 0% 100% 100% 100% 100% 0% 100% 100% 100% 100% 0% 100% 100% 100% 100% 0% 100% 67% 100% 0% 0% 0% 67% 100% 0% 0% 0% 67% 100% 0% 0% 0% 67% 0%
AVERAGE
100% 100% 100% 90% 89% 88% 74% 46% 46% 36%
Tabel 5.64. Interpolasi 11 titik recall precision dari pengujian dengan 10 query pencarian dengan menggunakan Sistem Pemerolehan Informasi Konvensional
Dari tabel tersebut, rata-rata interpolasi 11 titik recall - precision dari kedua sistem dapat ditemukan. Hasilnya disajikan dalam tabel berikut : RECALL BERBASIS CLUSTER KONVENSIONAL 0% 97% 100% 10% 87% 100% 20% 87% 100% 30% 67% 90% 40% 57% 89% 50% 47% 88% 60% 37% 74% 70% 27% 46% 80% 7% 46% 90% 7% 36% 100% 7% 17% AVE 48% 71% Tabel 5.65. Rata-rata interpolasi 11 titik recall precision dari pengujian dengan 10 query pencarian dari kedua sistem
Dari penghitungan average precision tersebut, diketahui bahwa Sistem Pemerolehan Informasi Konvensional memiliki precision yang lebih baik
103
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
dibandingkan
dengan
Sistem
Pemerolehan
Informasi
berbasis
Cluster.
Visualisasinya adalah sebagai berikut : 120% 100% 80% 60% 40% 20% 0% 0%
20%
40%
60%
Berbasis Cluster
80%
100%
120%
Konvensional
Gambar 5.21. Grafik rerata interpolasi 11 titik recall precision kedua jenis sistem
Dengan melihat luasan bidang dibawah grafik, dapat disimpulkan bahwa sistem pemerolehan informasi konvensional memiliki average precision yang lebih baik. Dalam penelitian ini, sistem pemerolehan informasi berbasis cluster memiliki precision yang lebih rendah dibandingkan dengan sistem pemerolehan informasi konvensional dikarenakan dua hal, yaitu :
Pemodelan cluster menggunakan jenis pemodelan hard clustering, dimana satu dokumen hanya bisa menempati satu cluster saja dan tidak bisa menjadi anggota cluster yang lain.
Retrieval dibatasi dengan pengambilan satu cluster saja yang paling mirip dengan query. Hal ini menyebabkan beberapa dokumen relevan yang terdapat pada cluster lain tidak diretrieve oleh sistem, sehingga menurunkan nilai precision.
104
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
5.2.2. Waktu Eksekusi Sementara itu, hasil penghitungan rerata waktu eksekusi dalam satuan detik dari kedua sistem ditampilkan sebagai berikut : QUERY BERBASIS CLUSTER (s) KONVENSIONAL (s) 1 13.3721 18.5425 2 13.3514 16.0667 3 14.0447 14.5661 4 12.4743 15.4405 5 12.2814 14.9437 6 13.5197 14.7423 7 12.681 14.9348 8 12.2554 15.1375 9 12.0591 14.7241 10 12.7906 14.4841 AVE 12.88297 15.35823 Tabel 5.66. Hasil penghitungan rerata waktu eksekusi dalam satuan detik dari kedua sistem
Visualisasi data waktu retrieval kedua sistem tersebut divisualisasikan dalam kedua grafik berikut ini :
105
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
Waktu Eksekusi 10 9 8
Query
7
6 5
Konvensional
4
Berbasis Cluster
3 2 1 -
5.0000 10.0000 15.0000 20.0000 Waktu (ms)
Gambar 5.22 Grafik rerata waktu retrieval kedua jenis sistem (1)
Waktu Eksekusi 20.0000 18.0000 16.0000
Waktu (ms)
14.0000 12.0000 10.0000 8.0000 6.0000 4.0000 2.0000 0
2
4
6
8
10
Query Berbasis Cluster
Konvensional
Gambar 5.23. Grafik rerata waktu retrieval kedua jenis sistem (2)
106
12
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
Dari grafik tersebut, terlihat sistem pemerolehan informasi berbasis cluster memiliki waktu eksekusi yang lebih baik dibandingkan dengan sistem pemerolehan informasi konvensional. Dalam penelitian ini, sistem pemerolehan informasi berbasis cluster memiliki waktu eksekusi yang lebih singkat dibandingkan dengan sistem pemerolehan informasi konvensional. Hal ini terjadi karena sistem tidak perlu membaca dan memberikan bobot kepada seluruh dokumen yang terdapat dalam koleksi, melainkan hanya pada dokumen anggota cluster yang paling mirip dengan query pencarian.
5.3. Kelebihan dan Kekurangan Sistem Dengan membandingkan presisi pencarian terhadap sistem pemerolehan informasi konvensional, didapatkan beberapa kekurangan dan kelebihan dari sistem pemerolehan informasi berbasis cluster, antara lain sebagai berikut : 5.3.1. Kelebihan Sistem Sistem pemerolehan informasi berbasis cluster memiliki kecepatan retrieval yang lebih cepat dibandingkan dengan sistem pemerolehan informasi konvensional. Hal ini dimungkinkan karena sistem tidak perlu menghitung skor seluruh dokumen koleksi terhadap query. Hanya dokumen anggota cluster yang memiliki skor terbesar terhadap query saja yang diperhitungkan. 5.3.2. Kekurangan Sistem Sebagai tradeoff terhadap kecepatan retrieval yang lebih baik, sistem pemerolehan informasi berbasis cluster memiliki precision yang lebih rendah dibandingkan dengan sistem pemerolehan informasi konvensional. Hal ini dikarenakan pemodelan cluster menggunakan jenis pemodelan hard clustering, dimana satu dokumen hanya bisa menempati satu cluster, dan retrieval pun hanya dibatasi dengan pengambilan satu cluster saja yang paling mirip dengan query.
107
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
BAB VI KESIMPULAN DAN SARAN
6.1. Kesimpulan 1.
Purity dari pengelompokan dokumen dalam sistem ini sebesar 0.75 atau 75%. Dengan melihat nilai purity tersebut, dapat disimpulkan bahwa hasil pengelompokan dokumen yang dilakukan oleh sistem menghasilkan kualitas cluster sedang.
2.
Dalam penelitian ini, diketahui bahwa sistem pemerolehan informasi berbasis cluster cenderung memiliki waktu retrieval yang lebih singkat dibandingkan dengan sistem pemerolehan informasi konvensional, yaitu 16.3% lebih singkat. Sebagai tradeoff, sistem pemerolehan informasi berbasis cluster memberikan hasil retrieval dengan nilai precision yang lebih rendah, yaitu 47%, dibandingkan sistem pemerolehan informasi konvensional, yaitu 71%.
6.2. Saran 1.
Penggunaan pemodelan cluster dengan jenis soft clustering dapat dicoba untuk kasus pengelompokan dokumen. Pengubahan yang dapat dilakukan antara lain mengganti algoritma dari G-Means ke Fuzzy c-Means Clustering (FCM).
2.
Reduksi dimensi dengan feature selection juga dimungkinkan dapat meningkatkan hasil dan kualitas cluster.
3.
Untuk inisialisasi centroid awal, dapat dicoba penggunaan algoritma inisialisasi centroid seperti k-Means++ agar menghasilkan cluster yang lebih baik.
108
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
DAFTAR PUSTAKA
Agusta, Ledy. 2009. Perbandingan Algoritma Porter dengan Algoritma Nazief & Adriani untuk Stemming Dokumen Teks Bahasa Indonesia. Bali: KNSI 2009.
Baeza-Yates, R., Ribeiro-Neto, B. 1999. Modern Information Retrieval the Concept and Technology Behind Search. England: ACM Press.
Booch, G., Rumbaugh, J., Jacobsen, I. 2005. The Unified Modeling Language User Guide, 2nd ed. Addison-Wesley.
Büttcher, Stefan., Clarke, L.A. Charles., Cormack, V. Gordon. 2010. Information Retrieval Implementing and Evaluating Search Engine. Massachusetts: MIT Press.
Chen, Berlin. 2010. Clustering Techniques for Information Retrieval. Taiwan: National Taiwan Normal University.
Chen, Gengxin., Jaradat, Saied A., Banerjee, Nila., Tanaka, Tetsuya T., Ko, Minoru S.H., Zhang, Michael Q. 2002. Evaluation and Comparison of Clustering Algorithms in Analyzing ES Cell Gene Expression Data. Baltimore: National Institute of Health
109
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
Connolly, Thomas., Begg, Carolyn E. 2005. Database Systems : A Practical Aproach to Design, Implementation, and Management 4th ed. New York: Addison-Wesley.
Croft, Bruce W., Meltzer, Donald., Strohman, Trevor. 2010. Search Engines Information Retrieval in Practice. Massachusetts: Amherst. Pearson Education USA.
Göker, Ayşe., Davies, John. 2009. Information Retrieval Searching in 21st Century. West Sussex: John Wiley & Sons.
Grossman, David A., Frieder, Ophir. 2004. Information Retrieval Algorithm and Heuristics 2nd ed. Dordrecht: Springer.
Hamerly, Greg., Elkan, Charles. 2004. Learning the k in k-means. Electronic Proceeding of Advances in Neural Information Processing Systems 16 (NIPS 2004)
KOMPAS.com. 2016. Kemenristekdikti Nyatakan Indonesia Lampaui Target Publikasi Internasional - Kompas.com. Diakses pada 7 Januari 2016, dari http://sains.kompas.com/read/2015/10/30/16544281/Kemenristekdikti.Ny atakan.Indonesia.Lampaui.Target.Publikasi.Internasional
Manning, Christoper D., Raghavan, Prabhakar., Schütze, Hinrich. 2008. Introduction to Information Retrieval. New York: Cambridge University Press.
110
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
Pressman, Roger S. 2010. Software Engineering : A Practitioner’s Approach, 7th ed. New York: McGraw-Hill.
Scimagojr.com,. 2016. SJR - International Science Ranking. Diakses pada 7 Januari 2016, dari http://scimagojr.com/countryrank.php
Yang, Yiming. Pedersen, Jan O. 1997. A Comparative Study on Feature Selection in Text Categorization. ACM Digital Library.
111
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
LAMPIRAN
1.1. Implementasi Basis Data 1.1.1. Tabel Cluster 1. CREATE TABLE `cluster` ( 2. `id_cluster` int(11) NOT NULL AUTO_INCREMENT, 3. `uuid` varchar(100) NOT NULL, 4. PRIMARY KEY (`id_cluster`), 5. UNIQUE KEY `uuid_UNIQUE` (`uuid`) 6. ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1; 1.1.2. Tabel Centroid 1. CREATE TABLE `centroid` ( 2. `id_centroid` int(11) NOT NULL AUTO_INCREMENT, 3. `id_cluster` int(11) NOT NULL, 4. `id_term` int(11) NOT NULL, 5. `value` double NOT NULL DEFAULT '0', 6. PRIMARY KEY (`id_centroid`), 7. KEY `fk_centroid_1_idx` (`id_cluster`), 8. KEY `fk_centroid_2_idx` (`id_term`) 9. ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1; 1.1.3. Tabel Document 1. CREATE TABLE `document` ( 2. `id_document` int(11) NOT NULL AUTO_INCREMENT, 3. `id_cluster` int(11) NOT NULL, 4. `record_id` varchar(1000) NOT NULL, 5. PRIMARY KEY (`id_document`), 6. KEY `fk_document_1_idx` (`id_cluster`) 7. ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1; 1.1.4. Tabel Term 1. CREATE TABLE `term` ( 2. `id_term` int(11) NOT NULL AUTO_INCREMENT, 3. `term` varchar(512) NOT NULL, 4. PRIMARY KEY (`id_term`), 5. UNIQUE KEY `term_UNIQUE` (`term`) 6. ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
1.1.5. Tabel Term_Document 1. CREATE TABLE `term_document` ( 2. `id_term_document` int(11) NOT NULL AUTO_INCREMENT, 3. `id_document` int(11) NOT NULL, 4. `id_term` int(11) NOT NULL, 5. `tf` int(11) NOT NULL DEFAULT '0', 6. `w` double NOT NULL DEFAULT '0', 7. PRIMARY KEY (`id_term_document`), 8. KEY `fk_term_document_1_idx` (`id_document`), 9. KEY `fk_term_document_2_idx` (`id_term`) 10. ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1; 1.1.6. Tabel Stopword 1. CREATE TABLE `stop_word` ( 2. `id_stop_word` int(11) NOT NULL AUTO_INCREMENT, 3. `stop_word` varchar(45) DEFAULT NULL, 4. PRIMARY KEY (`id_stop_word`) 5. ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1; 1.1.7. Tabel Rootword 1. CREATE TABLE `root_word` ( 2. `word` varchar(25) NOT NULL, 3. `wordtype` varchar(20) NOT NULL, 4. `definition` text NOT NULL 5. ) ENGINE=MyISAM DEFAULT CHARSET=latin1; 1.2. Implementasi Sistem Pemerolehan Informasi Berbasis Cluster 1.2.1. Source Code 1.2.1.1. Package database 1.2.1.1.1. Kelas Connection.java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package database; import com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource; import com.mysql.jdbc.jdbc2.optional.MysqlDataSource; import java.sql.SQLException; import java.util.logging.Level;
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43.
import java.util.logging.Logger; /** * * @author pacman */ public class Connection { private static final String DB_USERNAME = "skripsi"; private static final String DB_PASSWORD = "skripsi"; private static final String DB_DATABASE = "skripsi"; private static final String DB_HOST = "localhost"; public static java.sql.Connection getConnection() { java.sql.Connection connection = null; MysqlDataSource dataSource = new MysqlConnectionPoolDataSource(); dataSource.setURL("jdbc:mysql://" + DB_HOST + "/" + DB_DATABASE); dataSource.setUser(DB_USERNAME); dataSource.setPassword(DB_PASSWORD); try { connection = dataSource.getConnection(); System.err.println("Koneksi berhasil"); } catch (SQLException ex) { System.err.println("Koneksi gagal"); Logger.getLogger(Connection.class.getName()).log(Level.SEVERE, null, ex); }
// //
return connection; } }
1.2.1.1.2. Kelas DatabaseOperationController 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package database; import gmeans.ClusterPool; import gmeans.ModifiedLinkedList; import java.sql.SQLException; import java.util.logging.Level;
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31.
import java.util.logging.Logger; import main.Main; /** * * @author pacman */ public class DatabaseOperationController { public DatabaseOperationController() { }
public void performDBOperation(ClusterPool pool, ModifiedLinkedList masterLinkedList) { DatabaseRWOperation dbrw = new DatabaseRWOperation(); try { dbrw.truncateAllTables(); dbrw.write(pool, masterLinkedList); } catch (SQLException ex) { Logger.getLogger(DatabaseOperationController.class.getName()).log(Level.SEVERE, null, ex); 32. } 33. } 34. 35. 36. }
1.2.1.1.3. Kelas DatabaseRWOperation.java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package database; import gmeans.Cluster; import gmeans.ClusterPool; import gmeans.ModifiedLinkedList; import gmeans.Point; import gmeans.Record; import java.io.File; import java.io.IOException; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList;
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66.
import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.commons.io.FileUtils; /** * * @author pacman */ public class DatabaseRWOperation { public DatabaseRWOperation() { } public void truncateAllTables() throws SQLException { java.sql.Connection conn = Connection.getConnection(); String[] tableNames = new String[]{"cluster", "centroid", "document", "term", "term_document"}; for (int i = 0; i < tableNames.length; i++) { String sql = "TRUNCATE " + tableNames[i]; conn.setAutoCommit(false); PreparedStatement ps = conn.prepareStatement(sql); ps.execute(); conn.commit(); } conn.close(); } public ClusterPool fastRead() throws SQLException { return fastFetchCluster(); } public Cluster readSingleCluster(Cluster cluster) throws SQLException { return fetchCluster(cluster); } public Cluster readMultipleCluster() throws SQLException { return fetchMultipleCluster(); }
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87.
public HashMap<String, Integer> mapPoint() throws SQLException { return fetchMapPoint(); } private HashMap<String, Integer> fetchMapPoint() throws SQLException { HashMap<String, Integer> map = new HashMap<>(); ModifiedLinkedList fetchMasterTerm = fetchMasterTerm(); Iterator masterTermIterator = fetchMasterTerm.iterator(); while (masterTermIterator.hasNext()) { Point point = masterTermIterator.next(); String term = point.getTerm(); int df = fetchDocumentFrequency(term); map.put(term, df); } return map; } private int fetchDocumentFrequency(String term) throws SQLException { java.sql.Connection conn = Connection.getConnection();
String sql = "SELECT COUNT(id_document) FROM skripsi.term_document WHERE id_term = (SELECT id_term FROM term WHERE term = ?) AND tf > 0"; 88. conn.setAutoCommit(false); 89. 90. PreparedStatement ps = conn.prepareStatement(sql); 91. 92. ps.setString(1, term); 93. 94. ResultSet rs = ps.executeQuery(); 95. 96. conn.commit(); 97. int df = 0; 98. while (rs.next()) { 99. df = rs.getInt(1); 100. } 101. 102. conn.close(); 103. return df; 104. } 105. 106. public int allDocumentCount() throws SQLException { 107. return fetchAllDocumentCount(); 108. } 109. 110. private int fetchAllDocumentCount() throws SQLException { 111. java.sql.Connection conn = Connection.getConnection(); 112. 113. String sql = "SELECT count(id_document) FROM document";
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
114. conn.setAutoCommit(false); 115. 116. PreparedStatement ps = conn.prepareStatement(sql); 117. 118. ResultSet rs = ps.executeQuery(); 119. 120. conn.commit(); 121. 122. int documentCount = 0; 123. while (rs.next()) { 124. documentCount = rs.getInt(1); 125. } 126. 127. conn.close(); 128. return documentCount; 129. } 130. 131. public Record readSingleRecord(Record rec) throws SQLException { 132. return fetchSingleRecord(rec.getId_document()); 133. } 134. 135. public ModifiedLinkedList readMasterTerm() throws SQLException { 136. return fetchMasterTerm(); 137. } 138. 139. private ModifiedLinkedList fetchMasterTerm() throws SQLException { 140. ModifiedLinkedList masterLinkedList = new ModifiedLinkedList(ModifiedLinkedList.LIST_TYPE.MASTER); 141. java.sql.Connection conn = Connection.getConnection(); 142. 143. String sql = "SELECT * FROM term ORDER BY id_term"; 144. conn.setAutoCommit(false); 145. 146. PreparedStatement ps = conn.prepareStatement(sql); 147. 148. Point point = null; 149. ResultSet rs = ps.executeQuery(); 150. 151. conn.commit(); 152. 153. while (rs.next()) { 154. 155. String term = rs.getString(2); 156. point = new Point(term); 157. 158. masterLinkedList.add(point); 159. 160. }
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208.
conn.close(); return masterLinkedList; } public void write(ClusterPool pool, ModifiedLinkedList masterList) throws SQLException { writeTermMaster(masterList); LinkedList clusterList = pool.getClusterList(); Iterator iterCluster = clusterList.iterator(); while (iterCluster.hasNext()) { Cluster cluster = iterCluster.next(); insertCluster(cluster, masterList); } } private Cluster fetchCluster(Cluster cluster) throws SQLException { java.sql.Connection conn = Connection.getConnection(); String sql = "SELECT * FROM cluster WHERE id_cluster = ?"; conn.setAutoCommit(false); PreparedStatement ps = conn.prepareStatement(sql); ps.setInt(1, cluster.getId_cluster()); ResultSet rs = ps.executeQuery(); conn.commit(); Cluster cs = null; while (rs.next()) { int id_cluster = rs.getInt(1); String uuid = rs.getString(2); Record fetchCentroid = fetchCentroid(id_cluster); LinkedList recordList = fetchRecord(id_cluster); cs = new Cluster(); cs.setId_cluster(id_cluster); cs.setClusterID(uuid); cs.setCentroid(fetchCentroid); cs.setRecordList(recordList); } conn.close(); return cs;
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256.
} private Cluster fetchMultipleCluster() throws SQLException { java.sql.Connection conn = Connection.getConnection(); String sql = "SELECT * FROM cluster"; conn.setAutoCommit(false); PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery(); conn.commit(); Cluster cs = null; LinkedList recordList = new LinkedList<>(); while (rs.next()) { int id_cluster = rs.getInt(1); recordList.addAll(fetchRecord(id_cluster)); } cs = new Cluster(); cs.setRecordList(recordList); conn.close(); return cs; } private LinkedList fetchRecord(int idCluster) throws SQLException { java.sql.Connection conn = Connection.getConnection(); String sql = "SELECT * FROM document WHERE id_cluster = ?"; conn.setAutoCommit(false); PreparedStatement ps = conn.prepareStatement(sql); ps.setInt(1, idCluster); ResultSet rs = ps.executeQuery(); conn.commit(); Record rec = null; LinkedList recordList = new LinkedList<>(); while (rs.next()) {
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271. 272. 273. 274. 275. 276. 277. 278. 279. 280. 281. 282. 283. 284. 285. 286. 287. 288. 289. 290. 291. 292. 293. 294. 295. 296. 297. 298. 299. 300. 301. 302. 303. 304.
rec = new Record(); int idDocument = rs.getInt(1); String recordId = rs.getString(3); List dataList = fetchDataList(idDocument); rec.setId_document(idDocument); rec.setRecordID(recordId); rec.setDataList(dataList); recordList.add(rec); } conn.close(); return recordList; } private Record fetchSingleRecord(int idDoc) throws SQLException { java.sql.Connection conn = Connection.getConnection(); String sql = "SELECT * FROM document WHERE id_document = ?"; conn.setAutoCommit(false); PreparedStatement ps = conn.prepareStatement(sql); ps.setInt(1, idDoc); ResultSet rs = ps.executeQuery(); conn.commit(); Record rec = null; while (rs.next()) { rec = new Record(); int idDocument = rs.getInt(1); String recordId = rs.getString(3); String originContent = rs.getString(4); String topic = rs.getString(5); List dataList = fetchDataList(idDocument); rec.setId_document(idDocument); rec.setRecordID(recordId); rec.setDataList(dataList); rec.setContent(originContent); rec.setTopic(topic); } conn.close(); return rec; }
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
305. 306. private List fetchDataList(int idDocument) throws SQLException { 307. java.sql.Connection conn = Connection.getConnection(); 308. 309. String sql = "SELECT * FROM term_document WHERE id_document = ? ORDER BY id_term"; 310. conn.setAutoCommit(false); 311. 312. PreparedStatement ps = conn.prepareStatement(sql); 313. ps.setInt(1, idDocument); 314. 315. ResultSet rs = ps.executeQuery(); 316. 317. conn.commit(); 318. 319. List dataList = new ArrayList<>(); 320. 321. while (rs.next()) { 322. double w = rs.getDouble(5); 323. dataList.add(w); 324. } 325. 326. conn.close(); 327. return dataList; 328. 329. } 330. 331. /** 332. * Hanya membaca cluster dan centroid, tidak membaca record didalamnya. 333. * Digunakan untuk memilih kluster yg paling dekat dgn kueri pengguna 334. * 335. * @return 336. * @throws SQLException 337. */ 338. private ClusterPool fastFetchCluster() throws SQLException { 339. java.sql.Connection conn = Connection.getConnection(); 340. 341. String sql = "SELECT * FROM cluster"; 342. conn.setAutoCommit(false); 343. 344. PreparedStatement ps = conn.prepareStatement(sql); 345. 346. ResultSet rs = ps.executeQuery(); 347. 348. conn.commit(); 349. 350. LinkedList clusterList = new LinkedList<>(); 351.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
352. 353. 354. 355. 356. 357. 358. 359. 360. 361. 362. 363. 364. 365. 366. 367. 368. 369. 370. 371. 372. 373. 374. 375. 376. 377. 378. 379. 380. 381. 382. 383. 384. 385. 386. 387. 388. 389. 390. 391. 392. 393. 394. 395. 396. 397. 398. 399.
while (rs.next()) { int id_cluster = rs.getInt(1); String uuid = rs.getString(2); Record fetchCentroid = fetchCentroid(id_cluster); Cluster cs = new Cluster(); cs.setId_cluster(id_cluster); cs.setClusterID(uuid); cs.setCentroid(fetchCentroid); clusterList.add(cs); } ClusterPool clusterPool = new ClusterPool(clusterList); conn.close(); return clusterPool; } private Record fetchCentroid(int idCluster) throws SQLException { java.sql.Connection conn = Connection.getConnection(); String sql = "SELECT * FROM centroid WHERE id_cluster = ? ORDER BY id_term"; conn.setAutoCommit(false); PreparedStatement ps = conn.prepareStatement(sql); ps.setInt(1, idCluster); ResultSet rs = ps.executeQuery(); conn.commit(); Record rec = new Record(); List dataList = new ArrayList<>(); while (rs.next()) { // centroid hanya perlu dataList, tidak perlu term, dsb. Hal ini mempercepat fetch double value = rs.getDouble(4); dataList.add(value); } rec.setDataList(dataList); conn.close(); return rec; } private void writeTermMaster(ModifiedLinkedList masterList) throws SQLException { insertTermMaster(masterList); } private int insertCluster(Cluster cs, ModifiedLinkedList masterList) throws SQLException { java.sql.Connection conn = Connection.getConnection();
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
400. 401. String sql = "INSERT INTO cluster (uuid) VALUES (?)"; 402. conn.setAutoCommit(false); 403. 404. PreparedStatement ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); 405. ps.setString(1, cs.getClusterID()); 406. 407. ps.executeUpdate(); 408. conn.commit(); 409. ResultSet rsKey = ps.getGeneratedKeys(); 410. 411. int clusterKey = 0; 412. while (rsKey.next()) { 413. clusterKey = rsKey.getInt(1); 414. } 415. 416. conn.close(); 417. 418. LinkedList recordList = cs.getRecordList(); 419. Iterator iterRecord = recordList.iterator(); 420. while (iterRecord.hasNext()) { 421. Record record = iterRecord.next(); 422. insertDocument(clusterKey, record); 423. } 424. 425. Record centroid = cs.getCentroid(); 426. List dataList = centroid.getDataList(); 427. 428. for (int i = 0; i < dataList.size(); i++) { 429. Point point = new Point(masterList.get(i).getTerm()); 430. point.setWNorm(dataList.get(i)); 431. insertCentroid(clusterKey, point); 432. } 433. 434. return clusterKey; 435. } 436. 437. private void insertCentroid(int clusterKey, Point pointCentroid) throws SQLException { 438. java.sql.Connection conn = Connection.getConnection(); 439. 440. String sql = "INSERT INTO centroid (id_cluster, id_term, value) VALUES (?,(SELECT id_term FROM term WHERE term = ?),?)"; 441. conn.setAutoCommit(false); 442. 443. PreparedStatement ps = conn.prepareStatement(sql); 444. ps.setInt(1, clusterKey); 445. ps.setString(2, pointCentroid.getTerm());
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
446. ps.setDouble(3, pointCentroid.getWNorm()); 447. 448. ps.executeUpdate(); 449. conn.commit(); 450. 451. conn.close(); 452. } 453. 454. private void insertDocument(int clusterKey, Record rec) throws SQLException { 455. java.sql.Connection conn = Connection.getConnection(); 456. 457. String sql = "INSERT INTO document (id_cluster, record_id, content, topic) VALUES (?,?,?,?)"; 458. conn.setAutoCommit(false); 459. 460. PreparedStatement ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); 461. ps.setInt(1, clusterKey); 462. ps.setString(2, rec.getRecordID()); 463. ps.setString(3, rec.getContent()); 464. ps.setString(4, rec.getTopic()); 465. 466. ps.executeUpdate(); 467. conn.commit(); 468. ResultSet rsKey = ps.getGeneratedKeys(); 469. 470. int documentKey = 0; 471. while (rsKey.next()) { 472. documentKey = rsKey.getInt(1); 473. } 474. 475. conn.close(); 476. 477. ModifiedLinkedList pointList = rec.getPointList(); 478. Iterator iterPoint = pointList.iterator(); 479. while (iterPoint.hasNext()) { 480. Point point = iterPoint.next(); 481. insertTermDocument(documentKey, point); 482. } 483. } 484. 485. private void insertTermDocument(int generatedKey, Point point) throws SQLException { 486. java.sql.Connection conn = Connection.getConnection(); 487. 488. String sql = "INSERT INTO term_document (id_document, id_term, tf, w) VALUES (?,(SELECT id_term FROM term WHERE term = ?),?,?)"; 489. conn.setAutoCommit(false); 490.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
491. 492. 493. 494. 495. 496. 497. 498. 499. 500. 501. 502. 503. 504. 505. 506. 507. 508. 509. 510. 511. 512. 513. 514. 515. 516. 517. 518. 519. 520. 521. 522. 523. 524. 525. 526. 527. 528. 529. 530. 531. 532. 533. 534. 535. 536. 537. 538.
PreparedStatement ps = conn.prepareStatement(sql); ps.setInt(1, generatedKey); ps.setString(2, point.getTerm()); ps.setDouble(3, point.getTf()); ps.setDouble(4, point.getWNorm()); ps.executeUpdate(); conn.commit(); conn.close(); } private void insertTermMaster(ModifiedLinkedList masterList) throws SQLException { Iterator iterator = masterList.iterator(); a: while (iterator.hasNext()) { Point point = iterator.next(); java.sql.Connection conn = Connection.getConnection(); String sql = "INSERT INTO term (term) VALUES (?)"; conn.setAutoCommit(false); PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, point.getTerm()); try { ps.executeUpdate(); } catch (SQLException ex) { if (ex.getErrorCode() == 1062) { continue a; } } conn.commit(); conn.close(); } } public String coba() throws SQLException { java.sql.Connection conn = Connection.getConnection(); String sql = "SELECT id_document, id_cluster FROM document ORDER BY id_cluster"; conn.setAutoCommit(false); PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery(); conn.commit();
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
539. 540. 541. 542. 543. 544. 545. 546. 547. 548. 549. 550. 551. 552. 553. 554. 555. 556. 557. 558. 559. 560. 561. 562. 563. 564. 565. 566. 567. 568. 569. 570. 571. 572. 573. 574. 575. 576. 577. 578. 579. 580. 581. 582. 583. 584. 585. 586.
String wAll = ""; while (rs.next()) { String id_document = rs.getString(1); System.out.print(id_document); coba2(id_document); String id_cluster = rs.getString(2); System.out.println("," + id_cluster); } conn.close(); return wAll; } private String coba2(String id_document) throws SQLException { java.sql.Connection conn = Connection.getConnection(); String sql = "SELECT w FROM term_document WHERE id_document = ?"; conn.setAutoCommit(false); PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, id_document); ResultSet rs = ps.executeQuery(); conn.commit(); String wAll = ""; while (rs.next()) { double w = rs.getDouble(1); System.out.print("," + w); } conn.close(); return wAll; } private void insertStopwordClustering() throws IOException, SQLException { // List<String> readLines = FileUtils.readLines(new File("./result/term.csv")); List<String> readLines = FileUtils.readLines(new File("./result/feature_sel.csv")); Iterator<String> iterator = readLines.iterator(); while (iterator.hasNext()) { String string = iterator.next();
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
587. 588. 589. 590. 591. 592. 593. 594. 595. 596. 597. 598. 599. 600. 601. 602. 603. 604. 605. 606. 607. 608. 609. 610. 611. 612. 613. 614. 615. 616. 617. 618. 619. 620. 621. 622. 623. 624. 625. 626. 627. 628. 629. 630. 631. 632. 633. 634.
insertStopwordClustering(string); } } private void insertStopwordClustering(String string) throws SQLException { java.sql.Connection conn = Connection.getConnection(); String sql = "INSERT INTO stopword_clustering_ina(stopword) VALUES (?)"; conn.setAutoCommit(false); PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, string); ps.execute(); conn.commit(); conn.close(); } private void truncateStopwordClustering() throws SQLException { java.sql.Connection conn = Connection.getConnection(); String sql = "TRUNCATE stopword_clustering_ina"; conn.setAutoCommit(false); PreparedStatement ps = conn.prepareStatement(sql); ps.execute(); conn.commit(); conn.close(); } public static void main(String[] args) { DatabaseRWOperation db = new DatabaseRWOperation(); try { db.truncateStopwordClustering(); db.insertStopwordClustering(); } catch (IOException ex) { Logger.getLogger(DatabaseRWOperation.class.getName()).log(Level.SEVERE, null, ex); } catch (SQLException ex) { Logger.getLogger(DatabaseRWOperation.class.getName()).log(Level.SEVERE, null, ex); } }
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
635. 636.
}
1.2.1.2. Package gmeans 1.2.1.2.1. Kelas AutoGenerateID 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84.
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package gmeans; import java.util.UUID; /** * * @author root */ public class AutoGeneratedID { private static AutoGeneratedID INSTANCE; private static int id; /** * TODO: Kenapa harus singleton? * @return INSTANCE singleton */ private static AutoGeneratedID getInstance() { if(INSTANCE==null) { INSTANCE = new AutoGeneratedID(); id = 1; } return INSTANCE; } public static int generateAutoIncrementID() { getInstance(); int tempId = id; id++; return tempId; } /** * Menggenerate random string menggunakan kelas UUID bawaan Java * * usage: penamaan clusterID / labeling cluster sementara
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
85. 86. 87. 88. 89. 90. 91. }
* @return random string yang berhasil digenerate */ public static String generateRandomString() { getInstance(); return UUID.randomUUID().toString(); }
1.2.1.2.2. Kelas Calculation.java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37.
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package gmeans; import Jama.EigenvalueDecomposition; import Jama.Matrix; import Jama.SingularValueDecomposition; import java.io.IOException; import java.util.LinkedList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.commons.math3.distribution.NormalDistribution; import org.apache.commons.math3.stat.correlation.Covariance; import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics; /** * * @author pacman */ public class Calculation { public Calculation() { } public double dotProduct(double[] x, double[] y) { if (x.length != y.length) { throw new IllegalArgumentException(); } double sum = 0; for (int i = 0; i < x.length; i++) { sum += (x[i] * y[i]);
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85.
} return sum; } public double[] zScoreNormalization(double[] data) { DescriptiveStatistics ds = new DescriptiveStatistics(data); double mean = ds.getMean(); double stdev = ds.getStandardDeviation(); double[] result = new double[data.length]; for (int i = 0; i < data.length; i++) { result[i] = (data[i] - mean) / stdev; } return result; } public double mean(double[] data) { double mean = 0; for (int i = 0; i < data.length; i++) { mean = mean + data[i]; } mean = mean / data.length; return mean; } public double[] meanPerRow(double[][] data) { double[] mean = new double[data.length]; for (int i = 0; i < data.length; i++) { mean[i] = mean(data[i]); } return mean; } public double[] calculateVariance(double[][] initData) { Utility util = new Utility(); DescriptiveStatistics ds = null; double[] res = new double[initData[0].length]; for (int i = 0; i < res.length; i++) { double[] fetchColumnMatrix2D = util.fetchColumnMatrix2D(initData, i); ds = new DescriptiveStatistics(fetchColumnMatrix2D);
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133.
res[i] = ds.getVariance(); } return res; } public SingularValueDecomposition calculateSVD(double[][] data) { Matrix m = new Matrix(data); return m.svd(); } public void simulateCalcPCA(Cluster cs) { Utility util = new Utility(); double[][] data = util.convert2DListToMatrix(cs); double[][] originalData = util.convert2DOriginalListToMatrix(cs); LinkedList recordList = cs.getRecordList(); // REDUCED ARRAY for (int i = 0; i < data.length; i++) { List dataList = recordList.get(i).getDataList(); for (int j = 0; j < data[i].length; j++) { dataList.add(data[i][j]); } } // ORIGINAL ARRAY for (int i = 0; i < originalData.length; i++) { List originalDataList = recordList.get(i).getOriginalDataList(); for (int j = 0; j < originalData[i].length; j++) { originalDataList.add(originalData[i][j]); } } } public void calculatePCA(Cluster cs) { // see Rm. Kun paper on Data Preprocessing Utility util = new Utility(); double[][] data = util.convert2DListToMatrix(cs); Matrix original = new Matrix(data); Covariance cov = new Covariance(data); double[][] covariance = cov.getCovarianceMatrix().getData(); for (int i = 0; i < covariance.length; i++) { for (int j = 0; j < covariance[i].length; j++) { if(Double.isNaN(covariance[i][j]) || Double.isInfinite(covariance[i][j])) { covariance[i][j] = 0; }
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
134. } 135. } 136. 137. // RealMatrix covarianceMatrix = new Array2DRowRealMatrix(covariance); 138. 139. // debug 140. // try { 141. // util.writeToFile(covariance, "covar"); 142. // } catch (IOException ex) { 143. // Logger.getLogger(Calculation.class.getName()).log(Level.SEVERE, null, ex); 144. // } 145. 146. System.out.println("printed"); 147. System.out.println(""); 148. // org.la4j.Matrix mtr = new org.la4j.matrix.dense.Basic2DMatrix(covariance); 149. // org.la4j.decomposition.EigenDecompositor eg = new org.la4j.decomposition.EigenDecompositor(mtr); 150. // org.la4j.Matrix[] decompose = eg.decompose(); 151. // EigenDecomposition ed = new EigenDecomposition(covarianceMatrix); 152. 153. Matrix m = new Matrix(covariance); 154. EigenvalueDecomposition eig = m.eig(); // STUCK HERE 155. double[][] eigenVal = eig.getD().getArray(); 156. double[][] eigenVec = eig.getV().getArray(); 157. 158. double minimumSignificance = 0.01; 159. int satistfyIndex = 0; 160. a: for (int i = 0; i < eigenVal[0].length; i++) { 161. if(eigenVal[i][i] > minimumSignificance) { 162. satistfyIndex = i; 163. break a; 164. } 165. } 166. 167. System.out.println("satisf: " + satistfyIndex); 168. 169. int ambilanIndex = eigenVec[0].length - 24; 170. ambilanIndex = 0; 171. Matrix eigenVector = new Matrix(eigenVec); 172. Matrix newEig = eigenVector.getMatrix(0, eigenVec.length - 1, ambilanIndex, eigenVec[0].length - 1); 173. Matrix newEigTranspose = newEig.transpose(); 174. Matrix originalTranspose = original.transpose(); 175. Matrix feature = newEigTranspose.times(originalTranspose); 176. Matrix resultMatrix = feature.transpose(); 177. double[][] result = resultMatrix.getArray(); 178. 179. // debug
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
180. try { 181. System.out.println("satisf: " + satistfyIndex); 182. util.writeToFile(result, "pca"); 183. } catch (IOException ex) { 184. Logger.getLogger(Calculation.class.getName()).log(Level.SEVERE, null, ex); 185. } 186. 187. LinkedList recordList = cs.getRecordList(); 188. for (int i = 0; i < result.length; i++) { 189. List dataList = recordList.get(i).getDataList(); 190. for (int j = 0; j < result[i].length; j++) { 191. dataList.add(result[i][j]); 192. } 193. } 194. 195. try { 196. util.writePCAToFile(cs, "pca_cs"); 197. } catch (IOException ex) { 198. Logger.getLogger(Calculation.class.getName()).log(Level.SEVERE, null, ex); 199. } 200. } 201. 202. /** 203. * see Erk - http://stackoverflow.com/questions/442758/which-java-library-computes-thecumulative-standard-normal-distribution-function 204. * @param data 205. * @return 206. */ 207. public double calculateCDF(double data) { 208. 209. int neg = (data < 0d) ? 1 : 0; 210. if (neg == 1) { 211. data *= -1d; 212. } 213. 214. double k = (1d / (1d + 0.2316419 * data)); 215. double y = ((((1.330274429 * k - 1.821255978) * k + 1.781477937) 216. * k - 0.356563782) * k + 0.319381530) * k; 217. y = 1.0 - 0.398942280401 * Math.exp(-0.5 * data * data) * y; 218. 219. return (1d - neg) * y + neg * (1d - y); 220. 221. // NormalDistribution n = new NormalDistribution(); 222. // return n.cumulativeProbability(data); 223. } 224. 225. public double[] calculateCDF(double[] data) { 226. NormalDistribution n = new NormalDistribution();
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
227. double[] result = new double[data.length]; 228. 229. for (int i = 0; i < data.length; i++) { 230. result[i] = n.cumulativeProbability(data[i]); 231. } 232. 233. return result; 234. } 235. 236. public double[] calculateChildCentroidPositive(double[] clusterCenter, double[] eigenVector, double eigenValue) { 237. int lengthCluster = clusterCenter.length; 238. int lengthEigVec = eigenVector.length; 239. 240. double[] newEigenVector = null; 241. double[] child = null; 242. 243. if (lengthCluster == lengthEigVec) { 244. 245. newEigenVector = new double[lengthEigVec]; 246. for (int i = 0; i < lengthEigVec; i++) { 247. newEigenVector[i] = eigenVector[i] * Math.sqrt((2 * eigenValue) / Math.PI); 248. } 249. 250. child = new double[lengthEigVec]; 251. for (int i = 0; i < lengthCluster; i++) { 252. child[i] = clusterCenter[i] + newEigenVector[i]; 253. } 254. } else { 255. throw new IllegalArgumentException(); 256. } 257. 258. return child; 259. } 260. 261. public double[] calculateChildCentroidNegative(double[] clusterCenter, double[] eigenVector, double eigenValue) { 262. int lengthCluster = clusterCenter.length; 263. int lengthEigVec = eigenVector.length; 264. 265. if (lengthCluster != lengthEigVec) { 266. throw new IllegalArgumentException(); 267. } 268. 269. double[] newEigenVector = null; 270. double[] child = null; 271. 272. newEigenVector = new double[lengthEigVec];
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
273. for (int i = 0; i < lengthEigVec; i++) { 274. newEigenVector[i] = eigenVector[i] * Math.sqrt((2 * eigenValue) / Math.PI); 275. } 276. 277. child = new double[lengthEigVec]; 278. for (int i = 0; i < lengthCluster; i++) { 279. child[i] = clusterCenter[i] - newEigenVector[i]; 280. } 281. 282. return child; 283. } 284. 285. public double[] calculateChildCentroidPositiveB(double[] clusterCenter, double[] eigenVector, double eigenValue) { 286. int lengthCluster = clusterCenter.length; 287. int lengthEigVec = eigenVector.length; 288. 289. double[] newEigenVector = null; 290. double[] child = null; 291. 292. if (lengthCluster == lengthEigVec) { 293. // child = new double[lengthEigVec]; 294. // for (int i = 0; i < lengthCluster; i++) { 295. // child[i] = clusterCenter[i] + eigenVector[i]; 296. // } 297. 298. 299. newEigenVector = new double[lengthEigVec]; 300. for (int i = 0; i < lengthEigVec; i++) { 301. newEigenVector[i] = eigenVector[i] * Math.sqrt((2 * eigenValue) / Math.PI); 302. } 303. 304. child = new double[lengthEigVec]; 305. for (int i = 0; i < lengthCluster; i++) { 306. child[i] = clusterCenter[i] + newEigenVector[i]; 307. } 308. } else { 309. throw new IllegalArgumentException(); 310. } 311. 312. return child; 313. } 314. 315. public double[] calculateChildCentroidNegativeB(double[] clusterCenter, double[] eigenVector, double eigenValue) { 316. int lengthCluster = clusterCenter.length; 317. int lengthEigVec = eigenVector.length; 318.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
319. 320. 321. 322. 323. 324. 325. 326. 327. 328. 329. 330. 331. 332. 333. 334. 335. 336. 337. 338. 339. 340. 341. 342. 343. 344. 345. 346. 347. 348. 349. 350. 351. 352. 353. 354. 355. 356. 357. 358. 359. 360. 361. 362. 363. 364. 365. 366.
double[] newEigenVector = null; double[] child = null; if (lengthCluster == lengthEigVec) { child = new double[lengthEigVec]; for (int i = 0; i < lengthCluster; i++) { child[i] = clusterCenter[i] - eigenVector[i]; }
// // // //
newEigenVector = new double[lengthEigVec]; for (int i = 0; i < lengthEigVec; i++) { newEigenVector[i] = eigenVector[i] * Math.sqrt((2 * eigenValue) / Math.PI); } child = new double[lengthEigVec]; double tempData = 0; for (int i = 0; i < lengthCluster; i++) { child[i] = clusterCenter[i] - newEigenVector[i]; } } else { throw new IllegalArgumentException(); } return child; } public double euclideanDistance(double[] data, double[] centroid) { if (data.length != centroid.length) { throw new IllegalArgumentException(); } double sum = 0; for (int i = 0; i < data.length; i++) { sum += Math.pow(data[i] - centroid[i], 2); } return Math.sqrt(sum); } public double[] scalarProduct(double[] array1, double[] array2) { if (array1.length != array2.length) { throw new IllegalArgumentException(); }
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
367. 368. 369. 370. 371. 372. 373. 374. 375. 376. 377. 378. 379. 380. 381. 382. 383. 384. 385. 386. 387. 388. 389. 390. 391. 392. 393. 394. 395. 396. 397. 398. 399. 400.
double[] newArray = new double[array1.length]; for (int i = 0; i < array1.length; i++) { newArray[i] = array1[i] * array2[i]; } return newArray; } /** * * @param query * @param centroid * @param booleanOperator 1 = AND, 2 = OR * @return */ public double calculateWQD(double[] query, double[] centroid, int booleanOperator) { if(query.length != centroid.length && (booleanOperator != 1 || booleanOperator != 2)) { throw new IllegalArgumentException(); } double result = 0; for (int i = 0; i < query.length; i++) { if(booleanOperator == 1) { if (query[i] != 0.0 && centroid[i] == 0.0) { return 0; } } result = result + query[i] * centroid[i]; } return result; } }
1.2.1.2.3. Kelas Cluster.java 637. 638. 639. 640. 641. 642. 643. 644. 645. 646.
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package gmeans; import java.util.LinkedList; /**
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
647. 648. 649. 650. 651. 652. 653. 654. 655. 656. 657. 658. 659. 660. 661. 662. 663. 664. 665. 666. 667. 668. 669. 670. 671. 672. 673. 674. 675. 676. 677. 678. 679. 680. 681. 682. 683. 684. 685. 686. 687. 688. 689. 690. 691. 692. 693. 694.
* * @author root */ public class Cluster { private int id_cluster; private String clusterID; private LinkedList recordList; private Record centroid; private boolean isStable; public Cluster() { recordList = new LinkedList<>(); } @Override public String toString() { String title = "---- Cluster " + clusterID + " ----\n"; String subtitle = "---- centroid : "; for (int i = 0; i < centroid.getDataList().size(); i++) { subtitle += String.valueOf(centroid.getDataList().get(i)) + ","; } subtitle += "\n"; String content = ""; for (int i = 0; i < recordList.size(); i++) { content += recordList.get(i).toString() + "\n"; } return title + subtitle + content; } // @Override // public String toString() { // String title = "---- Cluster " + clusterID + " ----\n"; // String subtitle = "---- centroid : "; // for (int i = 0; i < centroid.getPointList().size(); i++) { // subtitle += centroid.getPointList().get(i).toString() + ", "; // } // subtitle += "\n"; // String content = ""; // for (int i = 0; i < recordList.size(); i++) { // content += recordList.get(i).toString() + "\n"; // } // return title + subtitle + content; // } public int getId_cluster() { return id_cluster; }
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
695. 696. 697. 698. 699. 700. 701. 702. 703. 704. 705. 706. 707. 708. 709. 710. 711. 712. 713. 714. 715. 716. 717. 718. 719. 720. 721. 722. 723. 724. 725. 726. 727. 728. 729. 730.
public void setId_cluster(int id_cluster) { this.id_cluster = id_cluster; } public String getClusterID() { return clusterID; } public void setClusterID(String clusterID) { this.clusterID = clusterID; } public LinkedList getRecordList() { return recordList; } public void setRecordList(LinkedList recordList) { this.recordList = recordList; } public Record getCentroid() { return centroid; } public void setCentroid(Record centroid) { this.centroid = centroid; } public boolean isStable() { return isStable; } public void setIsStable(boolean isStable) { this.isStable = isStable; } }
1.2.1.2.4. Kelas ClusterPool.java 1. /* 2. * To change this license header, choose License Headers in Project Properties. 3. * To change this template file, choose Tools | Templates 4. * and open the template in the editor. 5. */ 6. package gmeans; 7. 8. import java.util.LinkedList;
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56.
/** * * @author root */ public class ClusterPool { private LinkedList clusterList; public ClusterPool() { this.clusterList = new LinkedList<>(); } public ClusterPool(LinkedList clusterList) { this.clusterList = clusterList; } public void addFirst(Cluster e) { this.clusterList.addFirst(e); } public Cluster getClusterAt(int index) throws IndexOutOfBoundsException { return this.clusterList.get(index); } /** * Mereplace satu slot dalam linkedlist (yang berisi Cluster) dengan dua * slot (masing-masing berisi Cluster) kemudian menggeser slot lama ke kanan * Misal diketahui suatu linkedlist -> a, d, g Apabila diinsert * replaceOneClusterWithTwoAt(2, b, c) maka list akan menjadi -> a, b, c, g * * @param index index linkedlist yang akan diinsert * @param cluster1 instance Cluster yang pertama * @param cluster2 instance Cluster yang kedua * @return index slot lama yang tergeser, apabila return -1 berarti tadi * terjadi replace di ujung list */ public int replaceOneClusterWithTwoAt(int index, Cluster cluster1, Cluster cluster2) { int nextIndex = -1; try { if (clusterList.get(index + 1) != null) { nextIndex = index + 2; } } catch (IndexOutOfBoundsException ex) { nextIndex = -1; }
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. }
replaceAt(index, cluster1); insert(index + 1, cluster2); return nextIndex; } private void insert(int index, Cluster e) { clusterList.add(index, e); } private void replaceAt(int index, Cluster e) { clusterList.set(index, e); } public LinkedList getClusterList() { return clusterList; } public void setClusterList(LinkedList clusterList) { this.clusterList = clusterList; }
1.2.1.2.5. Kelas FeatureSelection.java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package gmeans; import database.Connection; import database.DatabaseRWOperation; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; /** * * @author pacman */
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
22. public class FeatureSelection { 23. 24. private List<String> importantWord; 25. 26. public FeatureSelection() { 27. importantWord = new ArrayList<>(); 28. } 29. 30. public boolean isInImportantList(String term) { 31. term = term.trim(); 32. return importantWord.contains(term); 33. } 34. 35. public Cluster featureSelection(Cluster cs) throws SQLException { 36. 37. DatabaseRWOperation dbrw = new DatabaseRWOperation(); 38. ModifiedLinkedList newPointList = null; 39. loadImportantList(); 40. LinkedList recordList = cs.getRecordList(); 41. for (int i = 0; i < recordList.size(); i++) { 42. Record rec = recordList.get(i); 43. newPointList = new ModifiedLinkedList(); 44. ModifiedLinkedList pointList = rec.getPointList(); 45. for (int j = 0; j < pointList.size(); j++) { 46. Point point = pointList.get(j); 47. String term = point.getTerm(); 48. boolean inImportantList = isInImportantList(term); 49. if(inImportantList) { 50. newPointList.add(point); 51. } 52. } 53. rec.setReducedPointList(newPointList); 54. } 55. 56. return cs; 57. 58. } 59. 60. public boolean loadImportantList() throws SQLException { 61. 62. java.sql.Connection conn = Connection.getConnection(); 63. 64. // String sql = "SELECT stopword FROM stopword_ina WHERE stopword = ?"; 65. String sql = "SELECT stopword FROM stopword_clustering_ina"; 66. conn.setAutoCommit(false); 67. 68. PreparedStatement ps = conn.prepareStatement(sql); 69.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. } 84. }
ResultSet rs = ps.executeQuery(); conn.commit(); boolean check = false; while (rs.next()) { this.importantWord.add(rs.getString(1)); } conn.close(); return check;
1.2.1.2.6. Kelas GMeans.java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package gmeans; import kmeans.InitCentroid; /** * * @author pacman */ public class GMeans { public GMeans() { } public ClusterPool performGMeans(Cluster cs) { GMeansAlgorithm r = new GMeansAlgorithm(); InitCentroid ic = new InitCentroid(); ClusterPool pool = new ClusterPool(); pool.getClusterList().add(cs); Utility util = new Utility();
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
30. 31. Cluster cluster = pool.getClusterAt(0); 32. 33. double[] initCentroidFromData = ic.initCentroidWithKmeanPlusPlus(cs); 34. // double[] initCentroidFromData = ic.initCentroidFromData(util.convert2DPCAListToMatrix(cluster)); 35. // double[] initCentroidFromData = ic.initCentroidFromData(util.convert2DListToMatrix(cluster)); 36. 37. Record convert1DArrayToRecord = util.convert1DPCAArrayToRecord(initCentroidFromData); 38. // Record convert1DArrayToRecord = util.convert1DArrayToRecord(initCentroidFromData); 39. 40. cluster.setCentroid(convert1DArrayToRecord); 41. 42. int poolIndex = 0; 43. 44. a: 45. while (true) { 46. 47. b: 48. while (true) { 49. 50. try { 51. cluster = pool.getClusterAt(poolIndex); 52. } catch (IndexOutOfBoundsException e) { 53. break a; 54. } 55. 56. if (cluster.getRecordList().isEmpty()) { 57. poolIndex = poolIndex + 1; 58. continue b; 59. } 60. 61. if (cluster.isStable()) { 62. poolIndex = poolIndex + 1; 63. continue b; 64. } 65. 66. if (cluster.getRecordList().size() == 1) { 67. poolIndex = poolIndex + 1; 68. continue b; 69. } 70. 71. System.out.println(""); 72. 73. double alpha = r.step1(); 74.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
75. System.out.println("--- STEP 1 DONE ---"); 76. 77. double[][] initCentroidSet = r.step2Alternate2(cluster); 78. // double[][] initCentroidSet = r.step2Alternate(cluster); 79. // double[][] initCentroidSet = r.step2(cluster); 80. // double[][] initCentroidSet = r.step2B(cluster); 81. 82. System.out.println("--- STEP 2 DONE ---"); 83. 84. Cluster[] clusterSet = r.step3(cluster, initCentroidSet[0], initCentroidSet[1]); 85. // Cluster[] clusterSet = r.step3B(cluster, initCentroidSet[0], initCentroidSet[1]); 86. 87. System.out.println("--- STEP 3 DONE ---"); 88. 89. if(clusterSet[0].getRecordList().isEmpty()) { 90. cluster = clusterSet[0]; 91. poolIndex = poolIndex + 1; 92. continue b; 93. } else if (clusterSet[1].getRecordList().isEmpty()) { 94. cluster = clusterSet[0]; 95. poolIndex = poolIndex + 1; 96. continue b; 97. } 98. 99. 100. double[] centroidClusterSet0 = util.convert1DPCARecordToArray(clusterSet[0].getCentroid()); 101. // double[] centroidClusterSet0 = util.convert1DListToArray(clusterSet[0].getCentroid()); 102. 103. double[] centroidClusterSet1 = util.convert1DPCARecordToArray(clusterSet[1].getCentroid()); 104. // double[] centroidClusterSet1 = util.convert1DListToArray(clusterSet[1].getCentroid()); 105. // 106. double[] xiac = r.step4(centroidClusterSet0, centroidClusterSet1, cluster); 107. // double[] xiac = r.step4B(centroidClusterSet0, centroidClusterSet1, cluster); 108. 109. System.out.println("--- STEP 4 DONE ---"); 110. 111. System.out.println("---- xiac"); 112. for (double xic : xiac) { 113. System.out.print(xic + " "); 114. } 115. 116. System.out.println(""); 117. 118. boolean isStable = r.step5(xiac, alpha);
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
119. 120. System.out.println("--- STEP 5 DONE ---"); 121. 122. if (isStable) { 123. System.out.println("not need split"); 124. cluster.setIsStable(true); 125. poolIndex = poolIndex + 1; 126. } else { 127. System.out.println("need split"); 128. cluster.setIsStable(false); 129. clusterSet[0].setIsStable(false); 130. clusterSet[1].setIsStable(false); 131. poolIndex = pool.replaceOneClusterWithTwoAt(poolIndex, clusterSet[0], clusterSet[1]); 132. } 133. 134. for (int i = 0; i < clusterSet.length; i++) { 135. Cluster c = clusterSet[i]; 136. 137. String res = c.toString(); 138. 139. System.out.println(res); 140. } 141. 142. if (poolIndex == -1) { 143. break b; 144. } 145. 146. } 147. 148. System.out.println("break"); 149. 150. // cek cluster pool, apakah ada yg perlu displit lagi 151. boolean allStable = true; 152. c: 153. for (int i = 0; i < pool.getClusterList().size(); i++) { 154. Cluster get = pool.getClusterList().get(i); 155. if (get.isStable() == false) { 156. System.err.println("there is unstable cluster"); 157. allStable = false; 158. break c; 159. } 160. } 161. 162. // jika semua sudah stable (tdk perlu split, maka hentikan loop while) 163. if (allStable) { 164. System.err.println("all stable"); 165. break a;
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
166. 167. 168. 169. 170. 171. 172. 173. 174.
} else { poolIndex = 0; } } return pool; } }
1.2.1.2.7. Kelas GMeansAlgorithm.java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35.
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package gmeans; import Jama.EigenvalueDecomposition; import Jama.Matrix; import Jama.SingularValueDecomposition; import java.util.List; import jdistlib.disttest.NormalityTest; import kmeans.KMeansAdHoc; import org.apache.commons.math3.stat.correlation.Covariance; import pca.PCA; /** * * @author pacman */ public class GMeansAlgorithm { public GMeansAlgorithm() { } public double step1() { double alpha = 0.05; return alpha; } public double[][] step2Alternate(Cluster cs) { Calculation calc = new Calculation(); Utility util = new Utility(); double[] clusterCenter = util.convert1DPCARecordToArray(cs.getCentroid()); double[] initCentroid1 = new double[clusterCenter.length];
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
36. double[] initCentroid2 = new double[clusterCenter.length]; 37. 38. for (int i = 0; i < clusterCenter.length; i++) { 39. initCentroid1[i] = clusterCenter[i] + 0.0000001; 40. initCentroid2[i] = clusterCenter[i] - 0.0000001; 41. } 42. 43. double[][] child = new double[2][initCentroid1.length]; 44. 45. child[0] = initCentroid1; 46. child[1] = initCentroid2; 47. 48. return child; 49. 50. } 51. 52. public double[][] step2Alternate2(Cluster cs) { 53. Calculation calc = new Calculation(); 54. Utility util = new Utility(); 55. double[][] valueMatrix = util.convert2DPCAListToMatrix(cs); 56. double[] clusterCenter = util.convert1DPCARecordToArray(cs.getCentroid()); 57. 58. for (int i = 0; i < valueMatrix.length; i++) { 59. for (int j = 0; j < valueMatrix[i].length; j++) { 60. if (j == valueMatrix[i].length - 1) { 61. System.out.println(valueMatrix[i][j] + ""); 62. } else { 63. System.out.print(valueMatrix[i][j] + ","); 64. } 65. } 66. } 67. 68. Matrix dataMatrix = new Matrix(valueMatrix); 69. 70. PCA pca = new PCA(dataMatrix, true); 71. // PCA pca = new PCA(dataMatrix); 72. 73. Matrix eigenvectorsMatrix = pca.getEigenvectorsMatrix(); 74. double eigenval = pca.getEigenvalue(0); 75. 76. Matrix princCompMtr = eigenvectorsMatrix.getMatrix(0, eigenvectorsMatrix.getRowDimension() - 1, 0, 0); 77. double[][] array = princCompMtr.getArray(); 78. 79. double[] princComp = new double[array.length]; 80. for (int i = 0; i < array.length; i++) { 81. princComp[i] = (array[i][0] * (Math.sqrt(2*eigenval/Math.PI))); 82. }
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130.
double[] initCentroid1 = new double[clusterCenter.length]; double[] initCentroid2 = new double[clusterCenter.length]; for (int i = 0; i < clusterCenter.length; i++) { if(Double.isNaN(princComp[i]) || Double.isInfinite(princComp[i])) { princComp[i] = 0.0; } initCentroid1[i] = clusterCenter[i] + princComp[i]; initCentroid2[i] = clusterCenter[i] - princComp[i]; } double[][] child = new double[2][initCentroid1.length]; child[0] = initCentroid1; child[1] = initCentroid2; return child; } public double[][] step2(Cluster cluster) { Utility util = new Utility(); Calculation calc = new Calculation(); double[][] valueMatrix = util.convert2DPCAListToMatrix(cluster); // TODO periksa semua konversi PCA di kelas util double[] clusterCenter = util.convert1DPCARecordToArray(cluster.getCentroid()); Covariance cov = new Covariance(valueMatrix); double[][] covarianceArray = cov.getCovarianceMatrix().getData(); Matrix m = new Matrix(covarianceArray); EigenvalueDecomposition eig = m.eig(); Matrix eigenValues = eig.getD(); Matrix eigenVectors = eig.getV(); double[][] eigenValueArr = eigenValues.getArray(); double maxEig = 0; int maxEigColIndex = 0; for (int i = 0; i < eigenValueArr.length; i++) { if (eigenValueArr[i][i] > maxEig) { maxEig = eigenValueArr[i][i]; maxEigColIndex = i; } } //
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
131. double[][] eigenVectorArr = eigenVectors.getArray(); 132. double[] fetchColEigenVector = util.fetchColumnMatrix2D(eigenVectorArr, maxEigColIndex); 133. 134. double[] initCentroid1 = calc.calculateChildCentroidPositive(clusterCenter, fetchColEigenVector, maxEig); 135. double[] initCentroid2 = calc.calculateChildCentroidNegative(clusterCenter, fetchColEigenVector, maxEig); 136. 137. double[][] child = new double[2][initCentroid1.length]; 138. 139. child[0] = initCentroid1; 140. child[1] = initCentroid2; 141. 142. return child; 143. } 144. 145. // step 2 : initialize two center (children of c) 146. public double[][] step2B(Cluster cluster) { 147. Utility util = new Utility(); 148. Calculation calc = new Calculation(); 149. double[][] valueMatrix = util.convert2DListToMatrix(cluster); 150. // TODO periksa semua konversi PCA di kelas util 151. double[] clusterCenter = util.convert1DRecordToArray(cluster.getCentroid()); 152. SingularValueDecomposition svd = calc.calculateSVD(valueMatrix); 153. double[] singularValues = svd.getSingularValues(); 154. double singularVal = 0; 155. int singularValIndex = 0; 156. for (int i = 0; i < singularValues.length; i++) { 157. if (singularValues[i] > singularVal) { 158. singularVal = singularValues[i]; 159. singularValIndex = i; 160. } 161. } 162. double[][] vArray = svd.getV().transpose().getArray(); 163. double[] fetchRightSingularVector = util.fetchColumnMatrix2D(vArray, singularValIndex); 164. 165. double[] initCentroid1 = calc.calculateChildCentroidPositive(clusterCenter, fetchRightSingularVector, singularVal); 166. double[] initCentroid2 = calc.calculateChildCentroidNegative(clusterCenter, fetchRightSingularVector, singularVal); 167. double[][] child = new double[2][initCentroid1.length]; 168. 169. child[0] = initCentroid1; 170. child[1] = initCentroid2; 171. 172. return child;
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220.
} // step 3 : run k-means to get new centroid c1 and c2 public Cluster[] step3(Cluster cluster, double[] initCentroid1, double[] initCentroid2) { KMeansAdHoc kmean = new KMeansAdHoc(); Cluster[] runKMeans = kmean.runKMeans(cluster, initCentroid1, initCentroid2); return runKMeans; } public Cluster[] step3B(Cluster cluster, double[] initCentroid1, double[] initCentroid2) { KMeansAdHoc kmean = new KMeansAdHoc(); Cluster[] runKMeans = kmean.runKMeansB(cluster, initCentroid1, initCentroid2); return runKMeans; } // step 4 : let v = c1 - c2; xi' = (xi, v) / ||v||2 public double[] step4(double[] centroid1, double[] centroid2, Cluster cluster) { Utility util = new Utility(); Calculation calc = new Calculation(); if (centroid1.length != centroid2.length) { throw new IllegalArgumentException(); } // // // // // //
Matrix mtrC1 = new Matrix(centroid1, 1); Matrix mtrC2 = new Matrix(centroid2, 1); Matrix mtrV = mtrC1.minus(mtrC2); double[] v = mtrV.getArray()[0]; double[] v = new double[centroid1.length]; for (int i = 0; i < v.length; i++) { v[i] = centroid1[i] - centroid2[i]; } List recordList = cluster.getRecordList(); int recListSize = recordList.size(); double[][] xi = new double[recListSize][recordList.get(0).getDataList().size()]; for (int i = 0; i < recListSize; i++) { xi[i] = util.convert1DPCARecordToArray(recordList.get(i)); } double[] xiac = new double[recordList.size()];
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
221. 222. double dotProduct = 0; 223. double norm = 0; 224. for (int i = 0; i < xi.length; i++) { 225. dotProduct = calc.dotProduct(xi[i], v); 226. // norm = mtrV.norm2(); 227. norm = Math.sqrt(calc.dotProduct(v, v)); 228. // xiac[i] = dotProduct / Math.pow(norm, 2); // hati2 disini, kita tdk tahu di paper yg dimaksud dgn 2norm adl 2norm euclidean ataukah norm^2 (euc_norm^2), di code ini, asumsi yg dimaksud paper adalah norm^2 229. xiac[i] = dotProduct / norm; // hati2 disini, kita tdk tahu di paper yg dimaksud dgn 2norm adl 2norm euclidean ataukah norm^2 (euc_norm^2), di code ini, asumsi yg dimaksud paper adalah norm^2 230. } 231. 232. double[] transform = calc.zScoreNormalization(xiac); 233. 234. // mengurutkan xiac (ORDERED xi') 235. double[] sortTransf = util.sortArray(transform); 236. 237. // double[] zscore = calc.zScoreNormalization(xiac); 238. double[] z = new double[sortTransf.length]; 239. for (int i = 0; i < z.length; i++) { 240. z[i] = calc.calculateCDF(sortTransf[i]); 241. } 242. 243. return z; 244. } 245. 246. public double[] step4B(double[] centroid1, double[] centroid2, Cluster cluster) { 247. Utility util = new Utility(); 248. 249. Calculation calc = new Calculation(); 250. 251. Matrix mtrC1 = new Matrix(centroid1, 1); 252. Matrix mtrC2 = new Matrix(centroid2, 1); 253. 254. Matrix mtrV = mtrC1.minus(mtrC2); 255. 256. double[] v = mtrV.getArray()[0]; 257. 258. List recordList = cluster.getRecordList(); 259. int recListSize = recordList.size(); 260. 261. double[][] xi = new double[recListSize][recordList.get(0).getPointList().size()]; 262. 263. for (int i = 0; i < recListSize; i++) { 264. xi[i] = util.convert1DRecordToArray(recordList.get(i));
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
265. } 266. 267. double[] xiac = new double[recordList.size()]; 268. 269. double dotProduct = 0; 270. double norm = 0; 271. for (int i = 0; i < xi.length; i++) { 272. dotProduct = calc.dotProduct(xi[i], v); 273. norm = mtrV.norm2(); 274. xiac[i] = dotProduct / norm; // hati2 disini, kita tdk tahu di paper yg dimaksud dgn 2norm adl 2norm euclidean ataukah norm^2 (euc_norm^2), di code ini, asumsi yg dimaksud paper adalah norm^2 275. } 276. 277. double[] zscore = calc.zScoreNormalization(xiac); 278. 279. return zscore; 280. } 281. 282. // step 5 : compare critical value with significance level (alpha) 283. public boolean step5(double[] x, double alpha) { 284. boolean stat = false; 285. double ad = NormalityTest.anderson_darling_statistic(x); 286. 287. // adjustment for few datapoints -- fitur ini dicoba justru membuat jml cluster mjd tdk akurat (mjd lebih sedikit) 288. ad = ad * (1 + (4 / x.length) - (25 / (Math.pow(x.length, 2)))); 289. 290. double pValue = NormalityTest.anderson_darling_pvalue(ad, x.length); 291. 292. System.out.println("ad: " + ad); 293. System.out.println("alpha: " + alpha); 294. System.out.println("pval: " + pValue); 295. 296. if (pValue >= alpha) { 297. stat = true; 298. } else { 299. stat = false; 300. } 301. 302. return stat; 303. 304. } 305. 306. }
1.2.1.2.8. Kelas ModifiedLinkedList.java
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48.
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package gmeans; import java.io.Serializable; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.LinkedList; /** * * @author pacman */ public class ModifiedLinkedList extends LinkedList { public enum LIST_TYPE { MASTER, DOCUMENT, OTHER } private LIST_TYPE type; public ModifiedLinkedList() { this.type = ModifiedLinkedList.LIST_TYPE.DOCUMENT; } public ModifiedLinkedList(LIST_TYPE type) { this.type = type; } /** * Menambah node berisi Term didalam list. * * @param o * @return boolean status penambahan Term ke dalam list, false apabila sudah * ada dan tidak perlu ditambah, true jika sebaliknya */ public boolean addUnique(Point o) { Point e = o; if (this.type == ModifiedLinkedList.LIST_TYPE.OTHER) { return this.add(e);
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
49. 50. 51.
52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92.
} else { if (this.contains(e)) { // jika didalam list sudah ada term terkait, maka tidak perlu ditambahkan ke list if (this.type == ModifiedLinkedList.LIST_TYPE.DOCUMENT) { // apabila tipe list adalah DOCUMENT, maka tambahkan tf saja. Jika tipe list adalah MASTER, maka lewati (tipe master default tf nya 0. Jgn diubah2 utk MASTER. int index = this.indexOf(e); double tf = this.get(index).getTf() + 1; this.get(index).setTf(tf); } return false; } else { // jika belum ada didalam list if (this.type == ModifiedLinkedList.LIST_TYPE.DOCUMENT) { // apabila tipe list adalah DOCUMENT, maka tambahkan tf saja ke dalam objek Term yg akan dimasukkan. double tf = e.getTf() + 1; e.setTf(tf); return this.add(e); // masukkan ke dalam list } else { Point a = new Point(e.getTerm(), 0); return this.add(a); // masukkan ke dalam list } } } } /** * Menghapus duplikasi Term dalam list, berguna utk merge list antara MASTER * dan DOCUMENT * * @param c */ private void deleteDuplicateData(Collection c) { Iterator iter1 = this.iterator(); while (iter1.hasNext()) { Point term = iter1.next(); Iterator iter2 = c.iterator(); while (iter2.hasNext()) { Point testTerm = iter2.next(); if (term.compareTo(testTerm) == 0) { iter2.remove(); }
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
93. } 94. 95. } 96. } 97. 98. private void sortAscending() { 99. Collections.sort(this, Collections.reverseOrder()); 100. } 101. 102. /** 103. * Merge list antara list dokumen dengan list master term, sehingga semua 104. * list dokumen menjadi sinkron dengan list master term 105. * 106. * @param c Java Collection, antara lain tipe data list 107. */ 108. public void mergeList(Collection c) { 109. deleteDuplicateData(c); 110. addAll(c); 111. sortAscending(); 112. } 113. 114. }
1.2.1.2.9. Kelas Point.java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package gmeans; /** * * @author pacman */ public class Point implements Comparable { private String term; private double tf; private double df; private double wNorm; public Point() { }
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70.
public Point(String term) { this.term = term; } public Point(double w) { this.wNorm = w; } public Point(String term, double tf) { this.term = term; this.tf = tf; } public Point(String term, double tf, double df) { this.term = term; this.tf = tf; this.df = df; } public Point(String term, double tf, double df, double wNorm) { this.term = term; this.tf = tf; this.df = df; this.wNorm = wNorm; } @Override public int compareTo(Point o) { return o.term.compareTo(term); } /** * Digunakan di CustomLinkedList.contain(e) * @param obj Objek yang akan dicek * @return status kesamaan antar dua objek yang dibandingkan */ @Override public boolean equals(Object obj) { if (obj instanceof Point) { Point o = (Point) obj; if (o.term.equalsIgnoreCase(term)) { return true; } else { return false; } } else { return false; }
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
71. 72. } 73. 74. public String getTerm() { 75. return term; 76. } 77. 78. public void setTerm(String term) { 79. this.term = term; 80. } 81. 82. public double getTf() { 83. return tf; 84. } 85. 86. public void setTf(double tf) { 87. this.tf = tf; 88. } 89. 90. public double getDf() { 91. return df; 92. } 93. 94. public void setDf(double df) { 95. this.df = df; 96. } 97. 98. public double getWNorm() { 99. return wNorm; 100. } 101. 102. public void setWNorm(double wNorm) { 103. this.wNorm = wNorm; 104. } 105. 106. @Override 107. public String toString() { 108. String term = this.term; 109. String wNorm = String.valueOf(getWNorm()); 110. return term + " => " + wNorm; //To change body of generated methods, choose Tools | Templates. 111. } 112. }
1.2.1.2.10. 1. /*
Kelas Record.java
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49.
* To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package gmeans; import java.util.ArrayList; import java.util.List; import org.apache.commons.math3.ml.clustering.Clusterable; /** * * @author root */ public class Record implements Clusterable { private int id_document; private String recordID; private String content; private String topic; private ModifiedLinkedList pointList; // act as SingleData class private ModifiedLinkedList reducedPointList; private List dataList; // act as SingleData class private List originalDataList; private String classAssigned; public Record() { pointList = new ModifiedLinkedList(); reducedPointList = new ModifiedLinkedList(); dataList = new ArrayList<>(); originalDataList = new ArrayList<>(); } @Override public String toString() { // String title = "Record " + recordID + " : "; String title = this.recordID; String content = ""; return title + content; } public int getId_document() { return id_document; } public void setId_document(int id_document) { this.id_document = id_document; }
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97.
public String getRecordID() { return recordID; } public void setRecordID(String recordID) { this.recordID = recordID; } public ModifiedLinkedList getPointList() { return pointList; } public void setPointList(ModifiedLinkedList pointList) { this.pointList = pointList; } public ModifiedLinkedList getReducedPointList() { return reducedPointList; } public void setReducedPointList(ModifiedLinkedList reducedPointList) { this.reducedPointList = reducedPointList; } public List getDataList() { return dataList; } public void setDataList(List dataList) { this.dataList = dataList; } public List getOriginalDataList() { return originalDataList; } public void setOriginalDataList(List originalDataList) { this.originalDataList = originalDataList; } public String getClassAssigned() { return classAssigned; } public void setClassAssigned(String classAssigned) { this.classAssigned = classAssigned; }
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
98. 99. public String getContent() { 100. return content; 101. } 102. 103. public void setContent(String content) { 104. this.content = content; 105. } 106. 107. public String getTopic() { 108. return topic; 109. } 110. 111. public void setTopic(String topic) { 112. this.topic = topic; 113. } 114. 115. @Override 116. public double[] getPoint() { 117. Double[] toArray = this.dataList.toArray(new Double[this.dataList.size()]); 118. double[] arr = new double[toArray.length]; 119. for (int i = 0; i < toArray.length; i++) { 120. arr[i] = toArray[i]; 121. } 122. return arr; 123. } 124. }
1.2.1.2.11. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Kelas Utility.java
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package gmeans; import Jama.Matrix; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import org.apache.commons.io.FileUtils; import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65.
/** * * @author pacman */ public class Utility { public Utility() { } /** * Mengubah data dalam bentuk list ke tipe data array * * usages: Dikhususkan untuk list yang berada dalam kelas Cluster * (recordList), karena didalam recordList terdapat list lagi (doubleList) * * @param cluster Obyek kelas Cluster * @return Array 2d hasil konversi */ public double[][] convert2DListToMatrix(Cluster cluster) { List recordList = cluster.getRecordList(); int rowCount = recordList.size(); int colCount = recordList.get(0).getReducedPointList().size(); double[][] matrixData = new double[rowCount][colCount]; for (int i = 0; i < rowCount; i++) { for (int j = 0; j < recordList.get(i).getReducedPointList().size(); j++) { matrixData[i][j] = recordList.get(i).getReducedPointList().get(j).getWNorm(); } } // // // // //
for (int i = 0; i < rowCount; i++) { for (int j = 0; j < recordList.get(i).getPointList().size(); j++) { matrixData[i][j] = recordList.get(i).getPointList().get(j).getWNorm(); } } return matrixData; } public double[][] convert2DOriginalListToMatrix(Cluster cluster) { List recordList = cluster.getRecordList(); int rowCount = recordList.size(); int colCount = recordList.get(0).getPointList().size();
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
66. double[][] matrixData = new double[rowCount][colCount]; 67. 68. for (int i = 0; i < rowCount; i++) { 69. for (int j = 0; j < recordList.get(i).getPointList().size(); j++) { 70. matrixData[i][j] = recordList.get(i).getPointList().get(j).getWNorm(); 71. } 72. } 73. 74. return matrixData; 75. 76. } 77. 78. public double[][] convert2DPCAListToMatrix(Cluster cluster) { 79. List recordList = cluster.getRecordList(); 80. 81. int rowCount = recordList.size(); 82. int colCount = recordList.get(0).getDataList().size(); 83. 84. double[][] matrixData = new double[rowCount][colCount]; 85. 86. for (int i = 0; i < rowCount; i++) { 87. for (int j = 0; j < recordList.get(i).getDataList().size(); j++) { 88. matrixData[i][j] = recordList.get(i).getDataList().get(j); 89. } 90. } 91. 92. return matrixData; 93. 94. } 95. 96. public double[][] convert2DListToMatrixSquare(Cluster cluster) { 97. List recordList = cluster.getRecordList(); 98. 99. // int rowCount = recordList.size(); 100. // int colCount = recordList.get(0).getDataList().size(); 101. int rowCount = recordList.get(0).getPointList().size(); 102. int colCount = recordList.get(0).getPointList().size(); 103. 104. double[][] matrixData = new double[rowCount][colCount]; 105. 106. for (int i = 0; i < rowCount; i++) { 107. for (int j = 0; j < recordList.get(0).getPointList().size(); j++) { 108. try { 109. matrixData[i][j] = recordList.get(i).getPointList().get(j).getWNorm(); 110. } catch (IndexOutOfBoundsException ex) { 111. matrixData[i][j] = 0.0; 112. } 113. // if(recordList.get(i).getDataList() != null) {
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161.
// // // //
} else { } } } return matrixData; } public double[] convert1DRecordToArray(Record record) { List doubleList = record.getPointList(); double[] arrayData = new double[doubleList.size()]; for (int i = 0; i < doubleList.size(); i++) { arrayData[i] = doubleList.get(i).getWNorm(); } return arrayData; } public double[] convert1DPCARecordToArray(Record record) { List doubleList = record.getDataList(); double[] arrayData = new double[doubleList.size()]; for (int i = 0; i < doubleList.size(); i++) { arrayData[i] = doubleList.get(i); } return arrayData; } public List convert1DPCAArrayToList(double[] array) { List doubleList = new ArrayList<>(); for (double data : array) { doubleList.add(data); } return doubleList; } /** * Mengkonvert array 1d ke kelas Record * * usages: Mengisi centroid pada kelas Cluster (centroid disana * didefinisikan dlm bentuk objek Record, bukan list atau array) * * @param array
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. { 207. 208.
* @return */ public Record convert1DArrayToRecord(double[] array) { LinkedList doubleList = new LinkedList<>(); for (double data : array) { Point point = new Point(data); doubleList.add(point); } Record rec = new Record(); ModifiedLinkedList convert = convertLinkedListToModifiedLinkedList(doubleList); rec.setPointList(convert); return rec; } public Record convert1DPCAArrayToRecord(double[] array) { LinkedList doubleList = new LinkedList<>(); for (double data : array) { doubleList.add(data); } Record rec = new Record(); rec.setDataList(doubleList); return rec; } /** * Mengambil data dari dalam matrix berdasarkan kolom yang diminta * * usages: Mengambil kolom dari matrix eigenvectors * * @param sourceMatrix Matrix sumber yang akan difetch kolomnya * @param colIndex Index kolom yang diminta * @return Array 1 dimensi berisi data dalam kolom yang diminta */ public double[] fetchColumnMatrix2D(double[][] sourceMatrix, int colIndex) { int length = sourceMatrix.length; double[] fetch = new double[length]; for (int i = 0; i < length; i++) { fetch[i] = sourceMatrix[i][colIndex]; } return fetch; } public ModifiedLinkedList convertLinkedListToModifiedLinkedList(LinkedList data) Iterator iterator = data.iterator(); ModifiedLinkedList modifiedLinkedList = new
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
ModifiedLinkedList(ModifiedLinkedList.LIST_TYPE.OTHER); 209. while (iterator.hasNext()) { 210. Point next = iterator.next(); 211. modifiedLinkedList.addUnique(next); 212. } 213. return modifiedLinkedList; 214. } 215. 216. public Matrix replicateMatrix(double[] data, int colCount) { 217. double[][] newData = new double[data.length][colCount]; 218. 219. for (int i = 0; i < data.length; i++) { 220. for (int j = 0; j < newData[i].length; j++) { 221. newData[i][j] = data[i]; 222. } 223. } 224. 225. return new Matrix(newData); 226. } 227. 228. public Cluster normalizeCluster(Cluster c) { 229. Cluster cs = c; 230. double[][] convert = convert2DListToMatrix(cs); 231. double[] mean = new double[convert[0].length]; 232. double[] stdev = new double[convert[0].length]; 233. double[] square = new double[convert[0].length]; 234. 235. for (int i = 0; i < convert[0].length; i++) { 236. double[] fetch = fetchColumnMatrix2D(convert, i); 237. DescriptiveStatistics ds = new DescriptiveStatistics(fetch); 238. mean[i] = ds.getMean(); 239. stdev[i] = ds.getStandardDeviation(); 240. square[i] = ds.getSumsq(); 241. } 242. 243. Iterator iterator = cs.getRecordList().iterator(); 244. while (iterator.hasNext()) { 245. Record record = iterator.next(); 246. // ModifiedLinkedList pointList = record.getPointList(); 247. ModifiedLinkedList pointList = record.getReducedPointList(); 248. for (int i = 0; i < pointList.size(); i++) { 249. Point point = pointList.get(i); 250. double w = point.getWNorm(); 251. // double z = (w - mean[i]) / stdev[i]; 252. double z = w / Math.sqrt(square[i]); 253. Point newPoint = new Point(point.getTerm(), point.getTf(), point.getDf(), z); 254. pointList.set(i, newPoint); 255. }
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271. 272. 273. 274. 275. 276. 277. 278. 279. 280. 281. 282. 283. 284. 285. 286. 287. 288. 289. 290. 291. 292. 293. 294. 295. 296. 297. 298. 299. 300. 301. 302. 303.
} //
cs = normalizeZScore(cs); return cs; } public String[] sentenceTermContainInList(ModifiedLinkedList list, String[] sentence) { List<String> termPool = new ArrayList<>(); Iterator iterator = list.iterator(); // CEK APAKAH ADA DI LIST, KALAU ADA MASUKKAN KE TERMPOOL a: for (String term : sentence) { b: for (int i = 0; i < list.size(); i++) { Point next = list.get(i); if (next.getTerm().equalsIgnoreCase(term) == true) { termPool.add(term); continue a; } } } // UBAH LIST TERMPOOL KE BENTUK ARRAY String[] result = new String[termPool.size()]; for (int i = 0; i < termPool.size(); i++) { result[i] = termPool.get(i); } return result; } public boolean emptyStringArray(String[] array) { for (String a : array) { if (a != null || a != "") { return false; } } return true; } public Cluster normalizeZScore(Cluster c) { Cluster cs = c; double[][] convert = convert2DListToMatrix(cs); double[] mean = new double[convert[0].length]; double[] stdev = new double[convert[0].length];
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
304. 305. 306. 307. 308. 309. 310. 311. 312. 313. 314. 315. 316. 317. 318. 319. 320. 321. 322. 323. 324. 325. 326. 327. 328. 329. 330. 331. 332. 333. 334. 335. 336. 337. 338. 339. 340. 341. 342. 343. 344. 345. 346. 347. 348. 349. 350. 351.
for (int i = 0; i < convert[0].length; i++) { double[] fetch = fetchColumnMatrix2D(convert, i); DescriptiveStatistics ds = new DescriptiveStatistics(fetch); mean[i] = ds.getMean(); stdev[i] = ds.getStandardDeviation(); } Iterator iterator = cs.getRecordList().iterator(); while (iterator.hasNext()) { Record record = iterator.next(); ModifiedLinkedList pointList = record.getPointList(); for (int i = 0; i < pointList.size(); i++) { Point point = pointList.get(i); double w = point.getWNorm(); double z = (w - mean[i]) / stdev[i]; Point newPoint = new Point(point.getTerm(), point.getTf(), point.getDf(), z); pointList.set(i, newPoint); } } return cs; } public void writeToFile(Cluster cs, String filename) throws IOException { double[][] data = convert2DListToMatrix(cs); File fi = new File("./data/" + filename + ".csv"); String res = ""; for (int i = 0; i < data.length; i++) { for (int j = 0; j < data[i].length; j++) { if (j + 1 == data[i].length) { res = res + String.valueOf(data[i][j]) + "\n"; } else { res = res + String.valueOf(data[i][j]) + ","; } } } FileUtils.writeStringToFile(fi, res); } public void writeToFile(double[][] data, String filename) throws IOException { File fi = new File("./data/" + filename + ".csv"); String res = ""; System.out.println("data length: " + data.length + " data[0]length: " + data[0].length); for (int i = 0; i < data.length; i++) { for (int j = 0; j < data[i].length; j++) { if (j == data[i].length - 1) { // System.out.print(data[i][j]+"\n"); res = res + String.valueOf(data[i][j]) + "\n"; } else {
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
352. 353. 354. 355. 356. 357. 358. 359. 360. 361. 362. 363. 364. 365. 366. 367. 368. 369. 370. 371. 372. 373. 374. 375. 376. 377. 378. 379. 380. 381. 382. 383. 384. 385. 386. 387. 388. 389.
//
System.out.print(data[i][j]+","); res = res + String.valueOf(data[i][j]) + ","; } } } System.out.println(" PRINTING "); System.out.println(res); FileUtils.writeStringToFile(fi, res); System.out.println(" END OF PRINTING "); } public void writePCAToFile(Cluster cs, String filename) throws IOException { double[][] data = convert2DPCAListToMatrix(cs); File fi = new File("./data/" + filename + ".csv"); String res = ""; for (int i = 0; i < data.length; i++) { for (int j = 0; j < data[i].length; j++) { if (j + 1 == data[i].length) { res = res + String.valueOf(data[i][j]) + "\n"; } else { res = res + String.valueOf(data[i][j]) + ","; } } } FileUtils.writeStringToFile(fi, res); } public double[] sortArray(double[] data) { double[] arr = new double[data.length]; for (int i = 0; i < arr.length; i++) { arr[i] = data[i]; } Arrays.sort(arr); return arr; }
}
1.2.1.3. Package gui 1.2.1.3.1. Kelas ClusteringView.java 1. /* 2. * To change this license header, choose License Headers in Project Properties. 3. * To change this template file, choose Tools | Templates 4. * and open the template in the editor. 5. */
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40.
package gui; import java.io.PrintStream; import javax.swing.JFileChooser; import javax.swing.JProgressBar; import javax.swing.filechooser.FileNameExtensionFilter; import main.Main; /** * * @author pacman */ public class ClusteringView extends javax.swing.JFrame { /** * Creates new form ClusteringView */ public ClusteringView() { initComponents(); PrintStream ps = System.out; System.setOut(new PrintStream(new StreamCapturer("> }
", capturePane1, ps)));
public JProgressBar getProgressBar() { return progressBar; }
/** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GENBEGIN:initComponents 41. private void initComponents() { 42. 43. jDesktopPane1 = new javax.swing.JDesktopPane(); 44. jPanel1 = new javax.swing.JPanel(); 45. jPanel3 = new javax.swing.JPanel(); 46. jLabel1 = new javax.swing.JLabel(); 47. pathDocumentTxt = new javax.swing.JTextField(); 48. selectDocumentButton = new javax.swing.JButton(); 49. uploadButton = new javax.swing.JButton(); 50. simpanDBCB = new javax.swing.JCheckBox(); 51. jPanel2 = new javax.swing.JPanel(); 52. progressBar = new javax.swing.JProgressBar();
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98.
jPanel4 = new javax.swing.JPanel(); capturePane1 = new gui.CapturePane(); jMenuBar1 = new javax.swing.JMenuBar(); jMenu1 = new javax.swing.JMenu(); jMenu2 = new javax.swing.JMenu(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); jPanel3.setBorder(javax.swing.BorderFactory.createEtchedBorder()); jLabel1.setText("Path Dokumen"); jLabel1.setToolTipText(""); pathDocumentTxt.setEditable(false); selectDocumentButton.setText("jButton1"); selectDocumentButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { selectDocumentButtonActionPerformed(evt); } }); uploadButton.setText("Proses Dokumen"); uploadButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { uploadButtonActionPerformed(evt); } }); simpanDBCB.setText("Simpan di DB"); javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3); jPanel3.setLayout(jPanel3Layout); jPanel3Layout.setHorizontalGroup( jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel3Layout.createSequentialGroup() .addContainerGap() .addComponent(jLabel1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(pathDocumentTxt, javax.swing.GroupLayout.DEFAULT_SIZE, 190, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(selectDocumentButton, javax.swing.GroupLayout.PREFERRED_SIZE, 35, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(18, 18, 18) .addComponent(uploadButton) .addGap(18, 18, 18) .addComponent(simpanDBCB)
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
99. .addContainerGap()) 100. ); 101. jPanel3Layout.setVerticalGroup( 102. jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 103. .addGroup(jPanel3Layout.createSequentialGroup() 104. .addContainerGap() 105. .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 106. .addComponent(jLabel1) 107. .addComponent(pathDocumentTxt, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 108. .addComponent(selectDocumentButton) 109. .addComponent(uploadButton) 110. .addComponent(simpanDBCB)) 111. .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) 112. ); 113. 114. jPanel2.setBorder(javax.swing.BorderFactory.createEtchedBorder()); 115. 116. javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2); 117. jPanel2.setLayout(jPanel2Layout); 118. jPanel2Layout.setHorizontalGroup( 119. jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 120. .addGroup(jPanel2Layout.createSequentialGroup() 121. .addContainerGap() 122. .addComponent(progressBar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 123. .addContainerGap()) 124. ); 125. jPanel2Layout.setVerticalGroup( 126. jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 127. .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup() 128. .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 129. .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 130. .addContainerGap()) 131. ); 132. 133. jPanel4.setBorder(javax.swing.BorderFactory.createTitledBorder("Console")); 134. 135. javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4); 136. jPanel4.setLayout(jPanel4Layout); 137. jPanel4Layout.setHorizontalGroup( 138. jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 139. .addGroup(jPanel4Layout.createSequentialGroup() 140. .addContainerGap() 141. .addComponent(capturePane1, javax.swing.GroupLayout.DEFAULT_SIZE,
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 142. .addContainerGap()) 143. ); 144. jPanel4Layout.setVerticalGroup( 145. jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 146. .addGroup(jPanel4Layout.createSequentialGroup() 147. .addContainerGap() 148. .addComponent(capturePane1, javax.swing.GroupLayout.DEFAULT_SIZE, 341, Short.MAX_VALUE) 149. .addContainerGap()) 150. ); 151. 152. javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); 153. jPanel1.setLayout(jPanel1Layout); 154. jPanel1Layout.setHorizontalGroup( 155. jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 156. .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup() 157. .addContainerGap() 158. .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) 159. .addComponent(jPanel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 160. .addComponent(jPanel3, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 161. .addComponent(jPanel2, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) 162. .addContainerGap()) 163. ); 164. jPanel1Layout.setVerticalGroup( 165. jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 166. .addGroup(jPanel1Layout.createSequentialGroup() 167. .addContainerGap() 168. .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 169. .addGap(18, 18, 18) 170. .addComponent(jPanel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 171. .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) 172. .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 173. .addContainerGap()) 174. ); 175. 176. javax.swing.GroupLayout jDesktopPane1Layout = new javax.swing.GroupLayout(jDesktopPane1);
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
177. jDesktopPane1.setLayout(jDesktopPane1Layout); 178. jDesktopPane1Layout.setHorizontalGroup( 179. jDesktopPane1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 180. .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 181. ); 182. jDesktopPane1Layout.setVerticalGroup( 183. jDesktopPane1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 184. .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 185. ); 186. jDesktopPane1.setLayer(jPanel1, javax.swing.JLayeredPane.DEFAULT_LAYER); 187. 188. jMenu1.setText("File"); 189. jMenuBar1.add(jMenu1); 190. 191. jMenu2.setText("Edit"); 192. jMenuBar1.add(jMenu2); 193. 194. setJMenuBar(jMenuBar1); 195. 196. javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 197. getContentPane().setLayout(layout); 198. layout.setHorizontalGroup( 199. layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 200. .addComponent(jDesktopPane1) 201. ); 202. layout.setVerticalGroup( 203. layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 204. .addComponent(jDesktopPane1) 205. ); 206. 207. pack(); 208. }// //GEN-END:initComponents 209. 210. private void selectDocumentButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_selectDocumentButtonActionPerformed 211. // TODO add your handling code here: 212. JFileChooser fileChooser = new JFileChooser(); 213. 214. FileNameExtensionFilter extensionFilter = new FileNameExtensionFilter("TXT File", "txt"); 215. fileChooser.setFileFilter(extensionFilter); 216. int returnVal = fileChooser.showOpenDialog(this); 217. if(returnVal == JFileChooser.APPROVE_OPTION) { 218. String absolutePath = fileChooser.getSelectedFile().getAbsolutePath();
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
219. pathDocumentTxt.setText(absolutePath); 220. } 221. // coba-coba 222. // progressBar.setValue(10); // max 100 223. }//GEN-LAST:event_selectDocumentButtonActionPerformed 224. 225. private void uploadButtonActionPerformed(java.awt.event.ActionEvent evt) {//GENFIRST:event_uploadButtonActionPerformed 226. // TODO add your handling code here: 227. String path = pathDocumentTxt.getText(); 228. Main m = new Main(); 229. boolean saveDB = simpanDBCB.isSelected(); 230. m.performDocumentClustering(this, path, saveDB); 231. System.exit(0); 232. // JOptionPane.showMessageDialog(this, "Proses clustering selesai!"); 233. }//GEN-LAST:event_uploadButtonActionPerformed 234. 235. /** 236. * @param args the command line arguments 237. */ 238. public static void main(String args[]) { 239. /* Set the Nimbus look and feel */ 240. //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 241. /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. 242. * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 243. */ 244. try { 245. for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 246. if ("Nimbus".equals(info.getName())) { 247. javax.swing.UIManager.setLookAndFeel(info.getClassName()); 248. break; 249. } 250. } 251. } catch (ClassNotFoundException ex) { 252. java.util.logging.Logger.getLogger(ClusteringView.class.getName()).log(java.util.logging.Level.SEV ERE, null, ex); 253. } catch (InstantiationException ex) { 254. java.util.logging.Logger.getLogger(ClusteringView.class.getName()).log(java.util.logging.Level.SEV ERE, null, ex); 255. } catch (IllegalAccessException ex) { 256. java.util.logging.Logger.getLogger(ClusteringView.class.getName()).log(java.util.logging.Level.SEV ERE, null, ex); 257. } catch (javax.swing.UnsupportedLookAndFeelException ex) {
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
258. java.util.logging.Logger.getLogger(ClusteringView.class.getName()).log(java.util.logging.Level.SEV ERE, null, ex); 259. } 260. // 261. 262. /* Create and display the form */ 263. java.awt.EventQueue.invokeLater(new Runnable() { 264. public void run() { 265. new ClusteringView().setVisible(true); 266. } 267. }); 268. } 269. 270. // Variables declaration - do not modify//GEN-BEGIN:variables 271. private gui.CapturePane capturePane1; 272. private javax.swing.JDesktopPane jDesktopPane1; 273. private javax.swing.JLabel jLabel1; 274. private javax.swing.JMenu jMenu1; 275. private javax.swing.JMenu jMenu2; 276. private javax.swing.JMenuBar jMenuBar1; 277. private javax.swing.JPanel jPanel1; 278. private javax.swing.JPanel jPanel2; 279. private javax.swing.JPanel jPanel3; 280. private javax.swing.JPanel jPanel4; 281. private javax.swing.JTextField pathDocumentTxt; 282. private javax.swing.JProgressBar progressBar; 283. private javax.swing.JButton selectDocumentButton; 284. private javax.swing.JCheckBox simpanDBCB; 285. private javax.swing.JButton uploadButton; 286. // End of variables declaration//GEN-END:variables 287. }
1.2.1.3.2. Kelas RetrievalTableModel.java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package gui; import gmeans.Record; import java.util.ArrayList; import java.util.List; import javax.swing.table.AbstractTableModel;
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60.
/** * * @author pacman */ public class RetrievalTableModel extends AbstractTableModel { private List recordList = new ArrayList(); private final int COLUMN_COUNT = 2; public RetrievalTableModel() { } public RetrievalTableModel(List recordList) { this.recordList = recordList; } @Override public int getRowCount() { return recordList.size(); } @Override public int getColumnCount() { return COLUMN_COUNT; } @Override public Object getValueAt(int rowIndex, int columnIndex) { Record rec = recordList.get(rowIndex); switch (columnIndex) { case 0: return rowIndex + 1; case 1: return rec.getRecordID(); default: return ""; } } @Override public String getColumnName(int column) { switch (column) { case 0: return "NO"; case 1: return "DOKUMEN"; default: return "";
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
61. } 62. } 63. 64. public Record getModelClass(int rowIndex) { 65. return recordList.get(rowIndex); 66. } 67. 68. }
1.2.1.3.3. Kelas RetrievalView.java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36.
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package gui; import database.DatabaseRWOperation; import gmeans.Record; import helper.NotepadPrinter; import java.io.IOException; import java.io.PrintStream; import java.sql.SQLException; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JOptionPane; import main.MainRetrieval; /** * * @author pacman */ public class RetrievalView extends javax.swing.JFrame { private RetrievalTableModel retrivalTableModel; /** * Creates new form RetrievalView */ public RetrievalView() { initComponents(); PrintStream ps = System.out; System.setOut(new PrintStream(new StreamCapturer(">
", capturePane1, ps)));
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48.
this.retrivalTableModel = new RetrievalTableModel(); this.retrievalTable.setModel(this.retrivalTableModel); this.jInternalFrame1.hide(); }
/** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GENBEGIN:initComponents 49. private void initComponents() { 50. 51. irTypeButtonGroup = new javax.swing.ButtonGroup(); 52. jDesktopPane1 = new javax.swing.JDesktopPane(); 53. jInternalFrame1 = new javax.swing.JInternalFrame(); 54. jPanel5 = new javax.swing.JPanel(); 55. docTitleLabel = new javax.swing.JLabel(); 56. jScrollPane3 = new javax.swing.JScrollPane(); 57. contentTxt = new javax.swing.JTextArea(); 58. jPanel1 = new javax.swing.JPanel(); 59. jPanel2 = new javax.swing.JPanel(); 60. jLabel1 = new javax.swing.JLabel(); 61. cariButton = new javax.swing.JButton(); 62. queryTxt = new javax.swing.JTextField(); 63. konvensionalRB = new javax.swing.JRadioButton(); 64. clusterBasedRB = new javax.swing.JRadioButton(); 65. jPanel3 = new javax.swing.JPanel(); 66. jScrollPane1 = new javax.swing.JScrollPane(); 67. retrievalTable = new javax.swing.JTable(); 68. jPanel4 = new javax.swing.JPanel(); 69. capturePane1 = new gui.CapturePane(); 70. jMenuBar1 = new javax.swing.JMenuBar(); 71. jMenu1 = new javax.swing.JMenu(); 72. jMenu2 = new javax.swing.JMenu(); 73. 74. setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 75. 76. jInternalFrame1.setClosable(true); 77. jInternalFrame1.setDefaultCloseOperation(javax.swing.WindowConstants.HIDE_ON_CLOSE); 78. jInternalFrame1.setVisible(true); 79. 80. jPanel5.setBorder(javax.swing.BorderFactory.createEtchedBorder()); 81. 82. docTitleLabel.setText("jLabel2");
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96.
contentTxt.setColumns(20); contentTxt.setLineWrap(true); contentTxt.setRows(5); contentTxt.setWrapStyleWord(true); jScrollPane3.setViewportView(contentTxt); javax.swing.GroupLayout jPanel5Layout = new javax.swing.GroupLayout(jPanel5); jPanel5.setLayout(jPanel5Layout); jPanel5Layout.setHorizontalGroup( jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel5Layout.createSequentialGroup() .addContainerGap()
.addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 97. .addComponent(jScrollPane3) 98. .addGroup(jPanel5Layout.createSequentialGroup() 99. .addComponent(docTitleLabel) 100. .addGap(0, 395, Short.MAX_VALUE))) 101. .addContainerGap()) 102. ); 103. jPanel5Layout.setVerticalGroup( 104. jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 105. .addGroup(jPanel5Layout.createSequentialGroup() 106. .addContainerGap() 107. .addComponent(docTitleLabel) 108. .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 109. .addComponent(jScrollPane3, javax.swing.GroupLayout.DEFAULT_SIZE, 270, Short.MAX_VALUE) 110. .addContainerGap()) 111. ); 112. 113. javax.swing.GroupLayout jInternalFrame1Layout = new javax.swing.GroupLayout(jInternalFrame1.getContentPane()); 114. jInternalFrame1.getContentPane().setLayout(jInternalFrame1Layout); 115. jInternalFrame1Layout.setHorizontalGroup( 116. jInternalFrame1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 117. .addGroup(jInternalFrame1Layout.createSequentialGroup() 118. .addContainerGap() 119. .addComponent(jPanel5, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 120. .addContainerGap()) 121. ); 122. jInternalFrame1Layout.setVerticalGroup( 123. jInternalFrame1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 124. .addGroup(jInternalFrame1Layout.createSequentialGroup()
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
125. .addContainerGap() 126. .addComponent(jPanel5, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 127. .addContainerGap()) 128. ); 129. 130. jPanel1.setBorder(javax.swing.BorderFactory.createEtchedBorder()); 131. 132. jPanel2.setBorder(javax.swing.BorderFactory.createEtchedBorder()); 133. 134. jLabel1.setText("Pencarian"); 135. 136. cariButton.setText("Cari"); 137. cariButton.addActionListener(new java.awt.event.ActionListener() { 138. public void actionPerformed(java.awt.event.ActionEvent evt) { 139. cariButtonActionPerformed(evt); 140. } 141. }); 142. 143. irTypeButtonGroup.add(konvensionalRB); 144. konvensionalRB.setText("Konvensional"); 145. 146. irTypeButtonGroup.add(clusterBasedRB); 147. clusterBasedRB.setSelected(true); 148. clusterBasedRB.setText("Cluster Based"); 149. 150. javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2); 151. jPanel2.setLayout(jPanel2Layout); 152. jPanel2Layout.setHorizontalGroup( 153. jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 154. .addGroup(jPanel2Layout.createSequentialGroup() 155. .addContainerGap() 156. .addComponent(jLabel1) 157. .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) 158. .addComponent(queryTxt, javax.swing.GroupLayout.DEFAULT_SIZE, 373, Short.MAX_VALUE) 159. .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) 160. .addComponent(cariButton) 161. .addGap(18, 18, 18) 162. .addComponent(clusterBasedRB) 163. .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) 164. .addComponent(konvensionalRB) 165. .addContainerGap()) 166. ); 167. jPanel2Layout.setVerticalGroup( 168. jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 169. .addGroup(jPanel2Layout.createSequentialGroup() 170. .addContainerGap()
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
171. .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 172. .addComponent(jLabel1) 173. .addComponent(queryTxt, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 174. .addComponent(cariButton) 175. .addComponent(konvensionalRB) 176. .addComponent(clusterBasedRB)) 177. .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) 178. ); 179. 180. jPanel3.setBorder(javax.swing.BorderFactory.createTitledBorder("Hasil Pencarian")); 181. 182. retrievalTable.setModel(new javax.swing.table.DefaultTableModel( 183. new Object [][] { 184. {null, null}, 185. {null, null}, 186. {null, null}, 187. {null, null} 188. }, 189. new String [] { 190. "NO", "DOKUMEN" 191. } 192. ){ 193. boolean[] canEdit = new boolean [] { 194. false, false 195. }; 196. 197. public boolean isCellEditable(int rowIndex, int columnIndex) { 198. return canEdit [columnIndex]; 199. } 200. }); 201. retrievalTable.getTableHeader().setReorderingAllowed(false); 202. retrievalTable.addMouseListener(new java.awt.event.MouseAdapter() { 203. public void mouseClicked(java.awt.event.MouseEvent evt) { 204. retrievalTableMouseClicked(evt); 205. } 206. }); 207. jScrollPane1.setViewportView(retrievalTable); 208. if (retrievalTable.getColumnModel().getColumnCount() > 0) { 209. retrievalTable.getColumnModel().getColumn(0).setResizable(false); 210. } 211. 212. javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3); 213. jPanel3.setLayout(jPanel3Layout); 214. jPanel3Layout.setHorizontalGroup( 215. jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 216. .addGroup(jPanel3Layout.createSequentialGroup()
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
217. .addContainerGap() 218. .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 638, Short.MAX_VALUE) 219. .addContainerGap()) 220. ); 221. jPanel3Layout.setVerticalGroup( 222. jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 223. .addGroup(jPanel3Layout.createSequentialGroup() 224. .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 257, Short.MAX_VALUE) 225. .addContainerGap()) 226. ); 227. 228. jPanel4.setBorder(javax.swing.BorderFactory.createTitledBorder("Progress Pencarian")); 229. 230. javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4); 231. jPanel4.setLayout(jPanel4Layout); 232. jPanel4Layout.setHorizontalGroup( 233. jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 234. .addGroup(jPanel4Layout.createSequentialGroup() 235. .addContainerGap() 236. .addComponent(capturePane1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 237. .addContainerGap()) 238. ); 239. jPanel4Layout.setVerticalGroup( 240. jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 241. .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel4Layout.createSequentialGroup() 242. .addContainerGap() 243. .addComponent(capturePane1, javax.swing.GroupLayout.DEFAULT_SIZE, 165, Short.MAX_VALUE) 244. .addContainerGap()) 245. ); 246. 247. javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); 248. jPanel1.setLayout(jPanel1Layout); 249. jPanel1Layout.setHorizontalGroup( 250. jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 251. .addGroup(jPanel1Layout.createSequentialGroup() 252. .addContainerGap() 253. .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 254. .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 255. .addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 256. .addComponent(jPanel4, javax.swing.GroupLayout.DEFAULT_SIZE,
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) 257. .addContainerGap()) 258. ); 259. jPanel1Layout.setVerticalGroup( 260. jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 261. .addGroup(jPanel1Layout.createSequentialGroup() 262. .addContainerGap() 263. .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 264. .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 265. .addComponent(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 266. .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) 267. .addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 268. .addContainerGap()) 269. ); 270. 271. javax.swing.GroupLayout jDesktopPane1Layout = new javax.swing.GroupLayout(jDesktopPane1); 272. jDesktopPane1.setLayout(jDesktopPane1Layout); 273. jDesktopPane1Layout.setHorizontalGroup( 274. jDesktopPane1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 275. .addGap(0, 854, Short.MAX_VALUE) 276. .addGroup(jDesktopPane1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEAD ING) 277. .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) 278. .addGroup(jDesktopPane1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEAD ING) 279. .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jDesktopPane1Layout.createSequentialGroup() 280. .addContainerGap(69, Short.MAX_VALUE) 281. .addComponent(jInternalFrame1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 282. .addContainerGap(123, Short.MAX_VALUE))) 283. ); 284. jDesktopPane1Layout.setVerticalGroup( 285. jDesktopPane1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 286. .addGap(0, 526, Short.MAX_VALUE) 287. .addGroup(jDesktopPane1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEAD ING) 288. .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE,
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) 289. .addGroup(jDesktopPane1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEAD ING) 290. .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jDesktopPane1Layout.createSequentialGroup() 291. .addContainerGap(93, Short.MAX_VALUE) 292. .addComponent(jInternalFrame1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 293. .addContainerGap(58, Short.MAX_VALUE))) 294. ); 295. jDesktopPane1.setLayer(jInternalFrame1, javax.swing.JLayeredPane.DEFAULT_LAYER); 296. jDesktopPane1.setLayer(jPanel1, javax.swing.JLayeredPane.DEFAULT_LAYER); 297. 298. jMenu1.setText("File"); 299. jMenuBar1.add(jMenu1); 300. 301. jMenu2.setText("Edit"); 302. jMenuBar1.add(jMenu2); 303. 304. setJMenuBar(jMenuBar1); 305. 306. javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 307. getContentPane().setLayout(layout); 308. layout.setHorizontalGroup( 309. layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 310. .addComponent(jDesktopPane1) 311. ); 312. layout.setVerticalGroup( 313. layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 314. .addComponent(jDesktopPane1) 315. ); 316. 317. pack(); 318. }// //GEN-END:initComponents 319. 320. private void cariButtonActionPerformed(java.awt.event.ActionEvent evt) {//GENFIRST:event_cariButtonActionPerformed 321. // TODO add your handling code here: 322. String query = queryTxt.getText(); 323. MainRetrieval mainRetrieval = new MainRetrieval(); 324. 325. boolean clusterBased = irTypeButtonGroup.isSelected(clusterBasedRB.getModel()); 326. 327. double start = System.nanoTime(); 328. List retrieve; 329. retrieve = mainRetrieval.retrieve(query, clusterBased); 330. double end = System.nanoTime();
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
331. double execTime = (end - start) / 1000000000; 332. if(retrieve == null) { 333. JOptionPane.showMessageDialog(this, "Tidak ditemukan dokumen dengan kata kunci tersebut"); 334. } else { 335. int size = retrieve.size(); 336. JOptionPane.showMessageDialog(this, "Ditemukan dokumen sejumlah " + size + " dengan kata kunci tersebut\nExec time : " + execTime); 337. this.retrivalTableModel = new RetrievalTableModel(retrieve); 338. this.retrievalTable.setModel(retrivalTableModel); 339. } 340. try { 341. NotepadPrinter.print(retrieve); 342. } catch (IOException ex) { 343. Logger.getLogger(RetrievalView.class.getName()).log(Level.SEVERE, null, ex); 344. } 345. }//GEN-LAST:event_cariButtonActionPerformed 346. 347. private void retrievalTableMouseClicked(java.awt.event.MouseEvent evt) {//GENFIRST:event_retrievalTableMouseClicked 348. // TODO add your handling code here: 349. jInternalFrame1.hide(); 350. int selectedRow = this.retrievalTable.getSelectedRow(); 351. Record modelClass = this.retrivalTableModel.getModelClass(selectedRow); 352. 353. DatabaseRWOperation dbrw = new DatabaseRWOperation(); 354. 355. Record readRec = null; 356. try { 357. readRec = dbrw.readSingleRecord(modelClass); 358. } catch (SQLException ex) { 359. Logger.getLogger(RetrievalView.class.getName()).log(Level.SEVERE, null, ex); 360. } 361. 362. docTitleLabel.setText(readRec.getRecordID()); 363. contentTxt.setText(readRec.getContent()); 364. jInternalFrame1.show(); 365. 366. }//GEN-LAST:event_retrievalTableMouseClicked 367. 368. /** 369. * @param args the command line arguments 370. */ 371. public static void main(String args[]) { 372. /* Set the Nimbus look and feel */ 373. //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 374. /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
375. * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 376. */ 377. try { 378. for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 379. if ("Nimbus".equals(info.getName())) { 380. javax.swing.UIManager.setLookAndFeel(info.getClassName()); 381. break; 382. } 383. } 384. } catch (ClassNotFoundException ex) { 385. java.util.logging.Logger.getLogger(RetrievalView.class.getName()).log(java.util.logging.Level.SEV ERE, null, ex); 386. } catch (InstantiationException ex) { 387. java.util.logging.Logger.getLogger(RetrievalView.class.getName()).log(java.util.logging.Level.SEV ERE, null, ex); 388. } catch (IllegalAccessException ex) { 389. java.util.logging.Logger.getLogger(RetrievalView.class.getName()).log(java.util.logging.Level.SEV ERE, null, ex); 390. } catch (javax.swing.UnsupportedLookAndFeelException ex) { 391. java.util.logging.Logger.getLogger(RetrievalView.class.getName()).log(java.util.logging.Level.SEV ERE, null, ex); 392. } 393. // 394. 395. /* Create and display the form */ 396. java.awt.EventQueue.invokeLater(new Runnable() { 397. public void run() { 398. new RetrievalView().setVisible(true); 399. } 400. }); 401. } 402. 403. // Variables declaration - do not modify//GEN-BEGIN:variables 404. private gui.CapturePane capturePane1; 405. private javax.swing.JButton cariButton; 406. private javax.swing.JRadioButton clusterBasedRB; 407. private javax.swing.JTextArea contentTxt; 408. private javax.swing.JLabel docTitleLabel; 409. private javax.swing.ButtonGroup irTypeButtonGroup; 410. private javax.swing.JDesktopPane jDesktopPane1; 411. private javax.swing.JInternalFrame jInternalFrame1; 412. private javax.swing.JLabel jLabel1;
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
413. 414. 415. 416. 417. 418. 419. 420. 421. 422. 423. 424. 425. 426. 427.
private javax.swing.JMenu jMenu1; private javax.swing.JMenu jMenu2; private javax.swing.JMenuBar jMenuBar1; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JPanel jPanel3; private javax.swing.JPanel jPanel4; private javax.swing.JPanel jPanel5; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane3; private javax.swing.JRadioButton konvensionalRB; private javax.swing.JTextField queryTxt; private javax.swing.JTable retrievalTable; // End of variables declaration//GEN-END:variables }
1.2.1.4. Package helper 1.2.1.4.1. Kelas NotepadPrinter.java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28.
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package helper; import database.DatabaseRWOperation; import gmeans.Record; import java.io.File; import java.io.IOException; import java.sql.SQLException; import java.util.Iterator; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.commons.io.FileUtils; /** * * @author root */ public class NotepadPrinter { public NotepadPrinter() { } public static void print(List recList) throws IOException {
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. }
String recordsTitle = ""; Iterator iterator = recList.iterator(); while (iterator.hasNext()) { Record next = iterator.next(); recordsTitle = recordsTitle + next.getRecordID() + "\n"; } File fi = new File("./result/recordsTitle.txt"); FileUtils.writeStringToFile(fi, recordsTitle); } public static void printCSV() throws SQLException, IOException { DatabaseRWOperation dbrw = new DatabaseRWOperation(); String coba = dbrw.coba(); File fi = new File("./result/clustersctr.csv"); FileUtils.writeStringToFile(fi, coba); } public static void main(String[] args) { try { printCSV(); } catch (SQLException ex) { Logger.getLogger(NotepadPrinter.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(NotepadPrinter.class.getName()).log(Level.SEVERE, null, ex); } }
1.2.1.4.2. Kelas QuickSort.java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
package helper; /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */
/** * Quicksort Algorithm for Sorting and Showing original index * * @see * http://stackoverflow.com/questions/951848/java-array-sort-quick-way-to-get-a-sorted-list-ofindices-of-an-array 14. * @author akarnokd 15. */
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
16. public class QuickSort { 17. 18. public static void main(String[] args) { 19. double[] main = new double[]{5, 2, 3, 1, 4}; 20. int[] index = new int[]{1, 2, 3, 4, 5}; 21. quicksort(main, index); 22. 23. System.out.println("Main Sorted"); 24. for (int i = 0; i < main.length; i++) { 25. System.out.print(main[i] + " "); 26. } 27. System.out.println(""); 28. System.out.println("Index Sorted"); 29. for (int i = 0; i < index.length; i++) { 30. System.out.print(index[i] + " "); 31. } 32. } 33. 34. public static void quicksort(double[] main, int[] index) { 35. quicksort(main, index, 0, index.length - 1); 36. } 37. 38. // quicksort a[left] to a[right] 39. public static void quicksort(double[] a, int[] index, int left, int right) { 40. if (right <= left) { 41. return; 42. } 43. int i = partition(a, index, left, right); 44. quicksort(a, index, left, i - 1); 45. quicksort(a, index, i + 1, right); 46. } 47. 48. // partition a[left] to a[right], assumes left < right 49. private static int partition(double[] a, int[] index, 50. int left, int right) { 51. int i = left - 1; 52. int j = right; 53. while (true) { 54. while (more(a[++i], a[right])) // find item on left to swap 55. ; // a[right] acts as sentinel 56. while (more(a[right], a[--j])) // find item on right to swap 57. { 58. if (j == left) { 59. break; // don't go out-of-bounds 60. } 61. } 62. if (i >= j) { 63. break; // check if pointers cross
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
64. } 65. exch(a, index, i, j); // swap two elements into place 66. } 67. exch(a, index, i, right); // swap with partition element 68. return i; 69. } 70. 71. // is x > y ? 72. // Untuk sort descending, gunakan more 73. private static boolean more(double x, double y) { 74. return (x > y); 75. } 76. 77. // is x < y ? 78. // Untuk sort ascending, gunakan less 79. private static boolean less(double x, double y) { 80. return (x < y); 81. } 82. 83. // exchange a[i] and a[j] 84. private static void exch(double[] a, int[] index, int i, int j) { 85. double swap = a[i]; 86. a[i] = a[j]; 87. a[j] = swap; 88. int b = index[i]; 89. index[i] = index[j]; 90. index[j] = b; 91. } 92. }
1.2.1.5. Package ir 1.2.1.5.1. Kelas DataStructuring.java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package ir; import gmeans.Cluster; import gmeans.ModifiedLinkedList; import gmeans.Point; import gmeans.Record; import java.util.Collections; import java.util.Iterator; import java.util.LinkedList;
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49.
import parser.Tokenizer; /** * * @author pacman */ public class DataStructuring { private Cluster cluster; private ModifiedLinkedList masterLinkedList; public DataStructuring() { } public void performDataStructuring(String[] parseTitle, String[] parseBody, String[] parseOriginalBody, String[] parseOriginalTopic) { ModifiedLinkedList masterLinkedList = new ModifiedLinkedList(ModifiedLinkedList.LIST_TYPE.MASTER); Cluster cs = new Cluster(); LinkedList listRec = tokenize(parseTitle, parseBody, parseOriginalBody, parseOriginalTopic, masterLinkedList); Collections.sort(masterLinkedList, Collections.reverseOrder()); this.masterLinkedList = masterLinkedList; listRec = mergeList(listRec, masterLinkedList); cs.setRecordList(listRec); this.cluster = cs; }
private LinkedList tokenize(String[] parseTitle, String[] parseBody, String[] parseOriginalBody, String[] parseOriginalTopic, ModifiedLinkedList masterLinkedList) { 50. Tokenizer tokenizer = new Tokenizer(); 51. ModifiedLinkedList documentLinkedList = null; 52. 53. Record rec = null; 54. Point point = null; 55. LinkedList listRec = new LinkedList<>(); 56. 57. for (int i = 0; i < parseTitle.length; i++) { 58. rec = new Record();
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
59. rec.setRecordID(parseTitle[i]); 60. // rec.setTopic(parseOriginalTopic[i]); 61. rec.setContent(parseOriginalBody[i]); 62. String[] tokenArray = tokenizer.tokenize(parseBody[i]); 63. 64. documentLinkedList = new ModifiedLinkedList(); 65. for (String token : tokenArray) { 66. point = new Point(token); 67. // point.setTerm(token); 68. masterLinkedList.addUnique(point); 69. documentLinkedList.addUnique(point); 70. } 71. 72. rec.setPointList(documentLinkedList); 73. listRec.add(rec); 74. 75. } 76. return listRec; 77. } 78. 79. public Record tokenizeQuery(String[] parseQuery) { 80. Tokenizer tokenizer = new Tokenizer(); 81. ModifiedLinkedList documentLinkedList = null; 82. 83. Record rec = null; 84. Point point = null; 85. LinkedList listRec = new LinkedList<>(); 86. 87. rec = new Record(); 88. String[] tokenArray = parseQuery; 89. 90. documentLinkedList = new ModifiedLinkedList(); 91. for (String token : tokenArray) { 92. point = new Point(token); 93. documentLinkedList.addUnique(point); 94. } 95. 96. rec.setPointList(documentLinkedList); 97. return rec; 98. } 99. 100. private LinkedList mergeList(LinkedList listRec, ModifiedLinkedList masterLinkedList) { 101. ModifiedLinkedList tempMasterLinkedList = null; 102. 103. Iterator iterator = listRec.iterator(); 104. while (iterator.hasNext()) { 105. Record next = iterator.next();
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
106. 107. // copy masterlist ke tempMaster untuk menghindari mutable (java works by reference) 108. tempMasterLinkedList = copyList(masterLinkedList); 109. 110. next.getPointList().mergeList(tempMasterLinkedList); 111. 112. } 113. 114. return listRec; 115. } 116. 117. public Record mergeQuery(Record rec, ModifiedLinkedList masterLinkedList) { 118. ModifiedLinkedList tempMasterLinkedList = null; 119. Record next = rec; 120. 121. // copy masterlist ke tempMaster untuk menghindari mutable (java works by reference) 122. tempMasterLinkedList = copyList(masterLinkedList); 123. 124. next.getPointList().mergeList(tempMasterLinkedList); 125. 126. return rec; 127. } 128. 129. public ModifiedLinkedList copyList(ModifiedLinkedList masterLinkedList) { 130. ModifiedLinkedList tempMasterLinkedList = new ModifiedLinkedList(ModifiedLinkedList.LIST_TYPE.MASTER); 131. Iterator iterator1 = masterLinkedList.iterator(); 132. while (iterator1.hasNext()) { 133. Point next1 = iterator1.next(); 134. tempMasterLinkedList.add(next1); 135. } 136. return tempMasterLinkedList; 137. } 138. 139. public Cluster getCluster() { 140. return cluster; 141. } 142. 143. public ModifiedLinkedList getMasterLinkedList() { 144. return masterLinkedList; 145. } 146. }
1.2.1.5.2. Kelas Preprocess.java 1. /*
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49.
* To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package ir; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; import parser.Parser; import stemmer.EnhancedStemmer; import stopwordremover.StopWordRemover; import wordnetstemmer.Stemmer; /** * * @author pacman */ public class Preprocess { private String[] identifier; private String[] content; private String[] originalContent; private String[] originalTopic; private final String[] titleTag = new String[]{"<TITLE>", ""}; private final String[] topicTag = new String[]{"", ""}; private final String[] bodyTag = new String[]{"", ""}; private final String queryTagOpen = ""; private final String queryTagClose = ""; private final String stopWordConfigFilePath = "./resources/stopword.txt"; private final String stemmerConfigFilePath = "./config/jwnl_properties.xml"; public Preprocess() { } public void performPreprocessing(String path) { String readFile = null; try { readFile = parseFile(path); } catch (IOException ex) { Logger.getLogger(Preprocess.class.getName()).log(Level.SEVERE, null, ex); } String[] parseTitle = parseElement(readFile, titleTag[0], titleTag[1]);
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
50. String[] parseTopic = parseElement(readFile, topicTag[0], topicTag[1]); 51. String[] parseBody = parseElement(readFile, bodyTag[0], bodyTag[1]); 52. String[] parseOriginalBody = parseElement(readFile, bodyTag[0], bodyTag[1]); 53. 54. // DEBUG 1-1 55. System.out.println(" --------------- SEBELUM STOPWORD ----------------"); 56. 57. for (int i = 0; i < parseTitle.length; i++) { 58. System.out.println(""); 59. System.out.println(parseTitle[i]); 60. System.out.println("---------------------"); 61. System.out.println(parseBody[i]); 62. } 63. System.out.println("\n --------****--------- \n"); 64. // END OF DEBUG 65. 66. parseBody = removeNonNumericCharacter(parseBody); 67. parseBody = removeStopword(parseBody); 68. parseBody = stem(parseBody); 69. // parseBody = removeStopword(parseBody); 70. 71. // DEBUG 72. System.out.println(" --------------- SETELAH STOPWORD & STEM ----------------"); 73. for (int i = 0; i < parseTitle.length; i++) { 74. System.out.println(""); 75. System.out.println(parseTitle[i]); 76. System.out.println("---------------------"); 77. System.out.println(parseBody[i]); 78. } 79. 80. System.out.println("\n --------****--------- \n"); 81. // END OF DEBUG 1-1 82. 83. this.identifier = parseTitle; 84. this.originalTopic = parseTopic; 85. this.content = parseBody; 86. this.originalContent = parseOriginalBody; 87. 88. } 89. 90. public void preprocessQuery(String query) { 91. StopWordRemover stopWordRemover = new StopWordRemover(); 92. String removeNonAlphaNumeric = stopWordRemover.removeNonAlphaNumeric(query); 93. String taggedQuery = queryTagOpen + removeNonAlphaNumeric + queryTagClose ; 94. String[] queryArray = parseElement(taggedQuery, queryTagOpen, queryTagClose); 95. queryArray = removeStopword(queryArray); 96. queryArray = stem(queryArray); 97. queryArray = removeStopword(queryArray);
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
98. this.content = queryArray; 99. } 100. 101. private String parseFile(String path) throws IOException { 102. Parser parser = new Parser(); 103. return parser.readFileToString(path); 104. } 105. 106. private String[] parseElement(String data, String tagOpen, String tagClose) { 107. Parser parser = new Parser(); 108. return parser.readBetweenTag(data, tagOpen, tagClose); 109. } 110. 111. private String[] removeNonNumericCharacter(String[] data) { 112. StopWordRemover stopWordRemover = new StopWordRemover(); 113. return stopWordRemover.removeNonAlphaNumeric(data); 114. } 115. 116. private String[] removeStopword(String[] data) { 117. StopWordRemover stopWordRemover = new StopWordRemover(stopWordConfigFilePath); 118. return stopWordRemover.removeStopWord(data); 119. } 120. 121. private String[] stem(String[] data) { 122. // Stemmer stemmer = new Stemmer(stemmerConfigFilePath); 123. EnhancedStemmer stemmer = new EnhancedStemmer(); 124. return stemmer.stem(data); 125. } 126. 127. public String[] getIdentifier() { 128. return identifier; 129. } 130. 131. public String[] getContent() { 132. return content; 133. } 134. 135. public String[] getOriginalContent() { 136. return originalContent; 137. } 138. 139. public String[] getOriginalTopic() { 140. return originalTopic; 141. } 142. }
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
1.2.1.5.3. Kelas TfIdf.java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46.
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package ir; import gmeans.Cluster; import gmeans.Point; import gmeans.Record; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; /** * * @author pacman */ public class TfIdf { private Cluster cluster; private HashMap<String, Integer> mapPointDf; private int documentCount; public TfIdf() { } public void performWeighting(Cluster cs) { LinkedList recordList = cs.getRecordList(); int documentCount = cs.getRecordList().size(); HashMap<String, Integer> mapPointDf = mappingDocFreq(recordList); Iterator iterRecord = recordList.iterator(); while (iterRecord.hasNext()) { Record next = iterRecord.next(); Iterator iterPoint = next.getPointList().iterator(); while (iterPoint.hasNext()) { Point next1 = iterPoint.next(); boolean containsKey = mapPointDf.containsKey(next1.getTerm()); if (containsKey) {
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94.
next1.setDf(mapPointDf.get(next1.getTerm())); double w = next1.getTf() * Math.log10(documentCount / next1.getDf()); next1.setWNorm(w); } } } this.cluster = cs; this.mapPointDf = mapPointDf; this.documentCount = documentCount; } private HashMap<String, Integer> mappingDocFreq(LinkedList recordList) { Iterator iterRecord = recordList.iterator(); HashMap<String, Integer> mapPointDf = new HashMap<>(); while (iterRecord.hasNext()) { Record next = iterRecord.next(); Iterator iterator2 = next.getPointList().iterator(); while (iterator2.hasNext()) { Point next1 = iterator2.next(); if (next1.getTf() > 0) { boolean containsKey = mapPointDf.containsKey(next1.getTerm()); if (containsKey) { Integer get = mapPointDf.get(next1.getTerm()); get = get + 1; mapPointDf.put(next1.getTerm(), get); } else { mapPointDf.put(next1.getTerm(), 1); } } } } return mapPointDf; } public Cluster getCluster() { return cluster; } public HashMap<String, Integer> getMapPointDf() { return mapPointDf; }
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
95. public int getDocumentCount() { 96. return documentCount; 97. } 98. 99. }
1.2.1.6. Package kmeans 1.2.1.6.1. Kelas InitCentroid.java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38.
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package kmeans; import gmeans.Calculation; import gmeans.Cluster; import gmeans.Record; import gmeans.Utility; import java.util.Arrays; import java.util.Iterator; import java.util.List; import org.apache.commons.math3.ml.clustering.CentroidCluster; import org.apache.commons.math3.ml.clustering.KMeansPlusPlusClusterer; /** * * @author pacman */ public class InitCentroid { public InitCentroid() { } /** * Mencari median dari data matrix 2d * @param data matrix 2d * @return matrix 1d berisi median tiap kolom */ public double[] median(double[][] data) { Utility util = new Utility(); double[] med = new double[data[0].length]; for (int i = 0; i < data[0].length; i++) { double[] sort = util.fetchColumnMatrix2D(data, i);
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. }
Arrays.sort(sort); int medPoint = sort.length / 2; if(sort.length%2 == 0) { med[i] = (sort[medPoint - 1] + sort[medPoint]) / 2; } else { med[i] = sort[medPoint]; } } return med; } public double[] initCentroidFromData(double[][] data) { Calculation calc = new Calculation(); double[] median = median(data); double minDist = Double.MAX_VALUE; double tempDist = 0; int minIndex = 0; for (int i = 0; i < data.length; i++) { tempDist = calc.euclideanDistance(data[i], median); if(tempDist < minDist) { minDist = tempDist; minIndex = i; } } return data[minIndex]; } public double[] initCentroidWithKmeanPlusPlus(Cluster cs) { Utility util = new Utility(); KMeansAdHoc kmean = new KMeansAdHoc(); Record find = kmean.findCentroidWithKMeansPlusPlus(cs); return util.convert1DPCARecordToArray(find); }
1.2.1.6.2. Kelas KMeansAdHoc.java 1. /* 2. * To change this license header, choose License Headers in Project Properties. 3. * To change this template file, choose Tools | Templates
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47.
* and open the template in the editor. */ package kmeans; import gmeans.AutoGeneratedID; import gmeans.Calculation; import gmeans.Cluster; import gmeans.Record; import gmeans.Utility; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; /** * * @author pacman */ public class KMeansAdHoc { public KMeansAdHoc() { } public Record findCentroidWithKMeansPlusPlus(Cluster cluster) { Utility util = new Utility(); Calculation calc = new Calculation(); InitCentroid ic = new InitCentroid(); int limit = 1000; int index = 0; Cluster activeCluster = cluster; int initSize = activeCluster.getRecordList().getFirst().getDataList().size(); double[] centroid1 = ic.initCentroidFromData(util.convert2DPCAListToMatrix(cluster)); Cluster cluster1 = new Cluster(); // isi centroid awal cluster1.setCentroid(util.convert1DPCAArrayToRecord(centroid1)); // assign ke variabel recordList (gak penting, hanya saja kadung tdk bisa refactor rename) LinkedList recordList = activeCluster.getRecordList();
// buat list penampungan record yang telah diassign ke centroid terdekat (sudah ditemukan clusternya) 48. LinkedList tempRecordListCluster1 = null; 49. 50. a : while (true) {
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63.
tempRecordListCluster1 = new LinkedList<>(); // assign ke centroid terdekat for (int j = 0; j < recordList.size(); j++) { Record rec = recordList.get(j); tempRecordListCluster1.add(rec); } // hitung centroid baru centroid1 = calculateNewCentroid(tempRecordListCluster1);
// cek centroid baru thd centroid lama, apabila centroidBaru = centroidLama, maka kmeans selesai (stop while loop) 64. boolean checkCluster1 = checkNewWithOldCentroid(centroid1, util.convert1DPCARecordToArray(cluster1.getCentroid())); 65. 66. // pindahkan isi tempRecordListCluster ke recordList di Cluster yang sesuai 67. cluster1.setRecordList(tempRecordListCluster1); 68. cluster1.setCentroid(util.convert1DPCAArrayToRecord(centroid1)); 69. 70. if(checkCluster1 || index >= limit) { 71. break a; 72. } 73. 74. index++; 75. } 76. 77. return cluster1.getCentroid(); 78. 79. } 80. 81. public Cluster[] runKMeans(Cluster cluster, double[] initCentroid1, double[] initCentroid2) { 82. 83. Utility util = new Utility(); 84. Calculation calc = new Calculation(); 85. 86. int limit = 1000; 87. int index = 0; 88. Cluster activeCluster = cluster; 89. 90. double[] centroid1 = initCentroid1; 91. double[] centroid2 = initCentroid2; 92. 93. Cluster cluster1 = new Cluster(); 94. Cluster cluster2 = new Cluster(); 95. 96. // isi centroid awal
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
97. cluster1.setCentroid(util.convert1DPCAArrayToRecord(centroid1)); 98. cluster2.setCentroid(util.convert1DPCAArrayToRecord(centroid2)); 99. 100. // beri nama cluster secara random 101. cluster1.setClusterID(AutoGeneratedID.generateRandomString()); 102. cluster2.setClusterID(AutoGeneratedID.generateRandomString()); 103. 104. // assign ke variabel recordList (gak penting, hanya saja kadung tdk bisa refactor rename) 105. LinkedList recordList = activeCluster.getRecordList(); 106. 107. // buat list penampungan record yang telah diassign ke centroid terdekat (sudah ditemukan clusternya) 108. LinkedList tempRecordListCluster1 = null; 109. LinkedList tempRecordListCluster2 = null; 110. 111. a : while (true) { 112. 113. tempRecordListCluster1 = new LinkedList<>(); 114. tempRecordListCluster2 = new LinkedList<>(); 115. 116. // assign ke centroid terdekat 117. for (int j = 0; j < recordList.size(); j++) { 118. Record rec = recordList.get(j); 119. double[] dataArray = util.convert1DPCARecordToArray(rec); 120. double distToCentroid1 = calc.euclideanDistance(dataArray, centroid1); 121. double distToCentroid2 = calc.euclideanDistance(dataArray, centroid2); 122. 123. if (distToCentroid1 > distToCentroid2) { 124. tempRecordListCluster2.add(rec); 125. } else { 126. tempRecordListCluster1.add(rec); 127. } 128. } 129. 130. // hitung centroid baru 131. // centroid1 = calculateNewCentroid(tempRecordListCluster1); 132. // centroid2 = calculateNewCentroid(tempRecordListCluster2); 133. if(tempRecordListCluster1.isEmpty() == false) { 134. centroid1 = calculateNewCentroid(tempRecordListCluster1); 135. } else { 136. System.out.println("empty cluster"); 137. cluster1.setRecordList(tempRecordListCluster1); 138. cluster1.setCentroid(util.convert1DPCAArrayToRecord(centroid1)); 139. cluster2.setRecordList(tempRecordListCluster2); 140. cluster2.setCentroid(util.convert1DPCAArrayToRecord(centroid2)); 141. break a; 142. }
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
143. 144. if(tempRecordListCluster2.isEmpty() == false) { 145. centroid2 = calculateNewCentroid(tempRecordListCluster2); 146. } else { 147. System.out.println("empty cluster"); 148. cluster1.setRecordList(tempRecordListCluster1); 149. cluster1.setCentroid(util.convert1DPCAArrayToRecord(centroid1)); 150. cluster2.setRecordList(tempRecordListCluster2); 151. cluster2.setCentroid(util.convert1DPCAArrayToRecord(centroid2)); 152. break a; 153. } 154. 155. // cek centroid baru thd centroid lama, apabila centroidBaru = centroidLama, maka kmeans selesai (stop while loop) 156. boolean checkCluster1 = checkNewWithOldCentroid(centroid1, util.convert1DPCARecordToArray(cluster1.getCentroid())); 157. boolean checkCluster2 = checkNewWithOldCentroid(centroid2, util.convert1DPCARecordToArray(cluster2.getCentroid())); 158. 159. // pindahkan isi tempRecordListCluster ke recordList di Cluster yang sesuai 160. cluster1.setRecordList(tempRecordListCluster1); 161. cluster1.setCentroid(util.convert1DPCAArrayToRecord(centroid1)); 162. cluster2.setRecordList(tempRecordListCluster2); 163. cluster2.setCentroid(util.convert1DPCAArrayToRecord(centroid2)); 164. 165. if(checkCluster1 && checkCluster2) { 166. break a; 167. } 168. 169. if(index >= limit) { 170. break a; 171. } 172. 173. index++; 174. } 175. 176. Cluster[] arrayCluster = new Cluster[2]; 177. arrayCluster[0] = cluster1; 178. arrayCluster[1] = cluster2; 179. 180. return arrayCluster; 181. 182. } 183. 184. public Cluster[] runKMeansB(Cluster cluster, double[] initCentroid1, double[] initCentroid2) { 185. 186. Utility util = new Utility();
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
187. Calculation calc = new Calculation(); 188. 189. int limit = 1000; 190. int index = 0; 191. Cluster activeCluster = cluster; 192. 193. double[] centroid1 = initCentroid1; 194. double[] centroid2 = initCentroid2; 195. 196. Cluster cluster1 = new Cluster(); 197. Cluster cluster2 = new Cluster(); 198. 199. // isi centroid awal 200. cluster1.setCentroid(util.convert1DArrayToRecord(centroid1)); 201. cluster2.setCentroid(util.convert1DArrayToRecord(centroid2)); 202. 203. // beri nama cluster secara random 204. cluster1.setClusterID(AutoGeneratedID.generateRandomString()); 205. cluster2.setClusterID(AutoGeneratedID.generateRandomString()); 206. 207. // assign ke variabel recordList (gak penting, hanya saja kadung tdk bisa refactor rename) 208. LinkedList recordList = activeCluster.getRecordList(); 209. 210. // buat list penampungan record yang telah diassign ke centroid terdekat (sudah ditemukan clusternya) 211. LinkedList tempRecordListCluster1 = null; 212. LinkedList tempRecordListCluster2 = null; 213. 214. a : while (true) { 215. 216. tempRecordListCluster1 = new LinkedList<>(); 217. tempRecordListCluster2 = new LinkedList<>(); 218. 219. // assign ke centroid terdekat 220. for (int j = 0; j < recordList.size(); j++) { 221. Record rec = recordList.get(j); 222. double[] dataArray = util.convert1DRecordToArray(rec); 223. double distToCentroid1 = calc.euclideanDistance(dataArray, centroid1); 224. double distToCentroid2 = calc.euclideanDistance(dataArray, centroid2); 225. 226. if (distToCentroid1 > distToCentroid2) { 227. tempRecordListCluster2.add(rec); 228. } else { 229. tempRecordListCluster1.add(rec); 230. } 231. } 232.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
233. // hitung centroid baru 234. // centroid1 = calculateNewCentroid(tempRecordListCluster1); 235. // centroid2 = calculateNewCentroid(tempRecordListCluster2); 236. if(tempRecordListCluster1.isEmpty() == false) { 237. centroid1 = calculateNewCentroidB(tempRecordListCluster1); 238. } 239. 240. if(tempRecordListCluster2.isEmpty() == false) { 241. centroid2 = calculateNewCentroidB(tempRecordListCluster2); 242. } 243. 244. // cek centroid baru thd centroid lama, apabila centroidBaru = centroidLama, maka kmeans selesai (stop while loop) 245. boolean checkCluster1 = checkNewWithOldCentroid(centroid1, util.convert1DRecordToArray(cluster1.getCentroid())); 246. boolean checkCluster2 = checkNewWithOldCentroid(centroid2, util.convert1DRecordToArray(cluster2.getCentroid())); 247. 248. // pindahkan isi tempRecordListCluster ke recordList di Cluster yang sesuai 249. cluster1.setRecordList(tempRecordListCluster1); 250. cluster1.setCentroid(util.convert1DArrayToRecord(centroid1)); 251. cluster2.setRecordList(tempRecordListCluster2); 252. cluster2.setCentroid(util.convert1DArrayToRecord(centroid2)); 253. 254. if(checkCluster1 && checkCluster2) { 255. break a; 256. } 257. 258. if(index >= limit) { 259. break a; 260. } 261. 262. index++; 263. } 264. 265. Cluster[] arrayCluster = new Cluster[2]; 266. arrayCluster[0] = cluster1; 267. arrayCluster[1] = cluster2; 268. 269. return arrayCluster; 270. 271. } 272. 273. // public Cluster[] runKMeans(Cluster cluster, double[] initCentroid1, double[] initCentroid2) { 274. // 275. // Utility util = new Utility(); 276. // Calculation calc = new Calculation();
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
277. // 278. // int limit = 1000; 279. // int index = 0; 280. // Cluster activeCluster = cluster; 281. // 282. // double[] centroid1 = initCentroid1; 283. // double[] centroid2 = initCentroid2; 284. // 285. // Cluster cluster1 = new Cluster(); 286. // Cluster cluster2 = new Cluster(); 287. // 288. // // isi centroid awal 289. // cluster1.setCentroid(util.convert1DPCAArrayToRecord(centroid1)); 290. // cluster2.setCentroid(util.convert1DPCAArrayToRecord(centroid2)); 291. // 292. // // beri nama cluster secara random 293. // cluster1.setClusterID(AutoGeneratedID.generateRandomString()); 294. // cluster2.setClusterID(AutoGeneratedID.generateRandomString()); 295. // 296. // // assign ke variabel recordList (gak penting, hanya saja kadung tdk bisa refactor rename) 297. // LinkedList recordList = activeCluster.getRecordList(); 298. // 299. // // buat list penampungan record yang telah diassign ke centroid terdekat (sudah ditemukan clusternya) 300. // LinkedList tempRecordListCluster1 = null; 301. // LinkedList tempRecordListCluster2 = null; 302. // 303. // a : while (true) { 304. // 305. // tempRecordListCluster1 = new LinkedList<>(); 306. // tempRecordListCluster2 = new LinkedList<>(); 307. // 308. // // assign ke centroid terdekat 309. // for (int j = 0; j < recordList.size(); j++) { 310. // Record rec = recordList.get(j); 311. // double[] dataArray = util.convert1DPCAListToArray(rec); 312. // double distToCentroid1 = calc.euclideanDistance(dataArray, centroid1); 313. // double distToCentroid2 = calc.euclideanDistance(dataArray, centroid2); 314. // 315. // if (distToCentroid1 > distToCentroid2) { 316. // tempRecordListCluster2.add(rec); 317. // } else { 318. // tempRecordListCluster1.add(rec); 319. // } 320. // } 321. // 322. // // hitung centroid baru
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
323. //// centroid1 = calculateNewCentroid(tempRecordListCluster1); 324. //// centroid2 = calculateNewCentroid(tempRecordListCluster2); 325. // if(tempRecordListCluster1.isEmpty() == false) { 326. // centroid1 = calculateNewCentroid(tempRecordListCluster1); 327. // } 328. // 329. // if(tempRecordListCluster2.isEmpty() == false) { 330. // centroid2 = calculateNewCentroid(tempRecordListCluster2); 331. // } 332. // 333. // // cek centroid baru thd centroid lama, apabila centroidBaru = centroidLama, maka kmeans selesai (stop while loop) 334. // boolean checkCluster1 = checkNewWithOldCentroid(centroid1, util.convert1DPCAListToArray(cluster1.getCentroid())); 335. // boolean checkCluster2 = checkNewWithOldCentroid(centroid2, util.convert1DPCAListToArray(cluster2.getCentroid())); 336. // 337. // // pindahkan isi tempRecordListCluster ke recordList di Cluster yang sesuai 338. // cluster1.setRecordList(tempRecordListCluster1); 339. // cluster1.setCentroid(util.convert1DPCAArrayToRecord(centroid1)); 340. // cluster2.setRecordList(tempRecordListCluster2); 341. // cluster2.setCentroid(util.convert1DPCAArrayToRecord(centroid2)); 342. // 343. // if(checkCluster1 && checkCluster2) { 344. // break a; 345. // } 346. // 347. // if(index >= limit) { 348. // break a; 349. // } 350. // 351. // index++; 352. // } 353. // 354. // Cluster[] arrayCluster = new Cluster[2]; 355. // arrayCluster[0] = cluster1; 356. // arrayCluster[1] = cluster2; 357. // 358. // return arrayCluster; 359. // 360. // } 361. 362. public boolean checkNewWithOldCentroid(double[] newCentroid, double[] oldCentroid) { 363. 364. if (oldCentroid.length != newCentroid.length) { 365. throw new IllegalArgumentException(); 366. } 367.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
368. 369. 370. 371. 372. 373. 374. 375. 376. 377. 378. 379. 380. 381. 382. 383. 384. 385. 386. 387. 388. 389. 390. 391. 392. 393. 394. 395. 396. 397. 398. 399. 400. 401. 402. 403. 404. 405. 406. 407. 408. 409. 410. 411. 412. 413. 414. 415.
Calculation calc = new Calculation(); boolean stat = false; double dist = calc.euclideanDistance(newCentroid, oldCentroid); if(dist == 0) { stat = true; } else { stat = false; } return stat; } // public double[] calculateNewCentroid(List recordList) { // int rowCount = recordList.size(); // double[] colSum = new double[recordList.get(0).getDataList().size()]; // for (int i = 0; i < recordList.size(); i++) { // for (int j = 0; j < recordList.get(i).getDataList().size(); j++) { // colSum[j] += recordList.get(i).getDataList().get(j); // } // } // // double[] newCentroid = new double[colSum.length]; // for (int i = 0; i < colSum.length; i++) { // newCentroid[i] = colSum[i] / rowCount; // } // // return newCentroid; // } public double[] calculateNewCentroid(List recordList) { int rowCount = recordList.size(); double[] colSum = new double[recordList.get(0).getDataList().size()]; for (int i = 0; i < recordList.size(); i++) { for (int j = 0; j < recordList.get(i).getDataList().size(); j++) { colSum[j] = colSum[j] + recordList.get(i).getDataList().get(j); } } double[] newCentroid = new double[colSum.length]; for (int i = 0; i < colSum.length; i++) { newCentroid[i] = colSum[i] / rowCount; } return newCentroid; }
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
416. 417. 418. 419. 420. 421. 422. 423. 424. 425. 426. 427. 428. 429. 430. 431. 432. 433.
public double[] calculateNewCentroidB(List recordList) { int rowCount = recordList.size(); double[] colSum = new double[recordList.get(0).getPointList().size()]; for (int i = 0; i < recordList.size(); i++) { for (int j = 0; j < recordList.get(i).getPointList().size(); j++) { colSum[j] += recordList.get(i).getPointList().get(j).getWNorm(); } } double[] newCentroid = new double[colSum.length]; for (int i = 0; i < colSum.length; i++) { newCentroid[i] = colSum[i] / rowCount; } return newCentroid; } }
1.2.1.7. Package entry 1.2.1.7.1. Kelas Entry.java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25.
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package main; import database.DatabaseOperationController; import gmeans.AutoGeneratedID; import gmeans.Calculation; import gmeans.Cluster; import gmeans.ClusterPool; import gmeans.FeatureSelection; import gmeans.GMeans; import gmeans.Point; import gmeans.Record; import gmeans.Utility; import gui.ClusteringView; import ir.DataStructuring; import ir.Preprocess; import ir.TfIdf; import java.io.File; import java.io.IOException; import java.sql.SQLException; import java.util.ArrayList;
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72.
import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.commons.io.FileUtils; /** * * @author root */ public class Main { public void performDocumentClustering(ClusteringView clusteringForm, String path, boolean saveDB) {
// // // //
// ====================== START PARSING =========================== String path = "./data/article/ARTICLES_ALL2.txt"; String path = "./data/kompas/KOMPAS_ALL.txt"; String path = "./data/news/BBC_ALL.txt"; String path = "./data/article/CUSTOM.txt"; Preprocess prep = new Preprocess(); prep.performPreprocessing(path); String[] identifier = prep.getIdentifier(); String[] content = prep.getContent(); String[] originalContent = prep.getOriginalContent(); String[] originalTopic = prep.getOriginalTopic(); clusteringForm.getProgressBar().setValue(10); clusteringForm.getProgressBar().update(clusteringForm.getProgressBar().getGraphics()); // ================ END OF PARSING ========================= // ================ START OF DATA STRUCTURING =============== DataStructuring ds = new DataStructuring(); ds.performDataStructuring(identifier, content, originalContent, originalTopic); Cluster cs = ds.getCluster(); clusteringForm.getProgressBar().setValue(20); clusteringForm.getProgressBar().update(clusteringForm.getProgressBar().getGraphics()); // ============== END OF DATA STRUCTURING ===================== // ============== START OF TF - IDF ===================== TfIdf tfIdf = new TfIdf(); tfIdf.performWeighting(cs);
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
73. cs = tfIdf.getCluster(); 74. 75. System.out.println(""); 76. HashMap<String, Integer> mapPointDf = tfIdf.getMapPointDf(); 77. Iterator<Map.Entry<String, Integer>> itr = mapPointDf.entrySet().iterator(); 78. while (itr.hasNext()) { 79. Map.Entry<String, Integer> entry = itr.next(); 80. System.out.println(entry.getKey() + ": " + entry.getValue()); 81. } 82. System.out.println(""); 83. 84. clusteringForm.getProgressBar().setValue(30); 85. clusteringForm.getProgressBar().update(clusteringForm.getProgressBar().getGraphics()); 86. 87. // ============== END OF TF - IDF ===================== 88. 89. // ============== FEATURE SELECTION =================== 90. 91. FeatureSelection fs = new FeatureSelection(); 92. try { 93. cs = fs.featureSelection(cs); 94. } catch (SQLException ex) { 95. Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 96. } 97. 98. int s = cs.getRecordList().get(0).getReducedPointList().size(); 99. System.out.println("Reduced: " + s); 100. 101. // ============== END OF FEATURE SELECTION ============ 102. 103. // ============== START OF NORMALIZATION ============== 104. Utility util = new Utility(); 105. cs = util.normalizeCluster(cs); 106. clusteringForm.getProgressBar().setValue(40); 107. clusteringForm.getProgressBar().update(clusteringForm.getProgressBar().getGraphics()); 108. // ============== END OF NORMALIZATION ================ 109. 110. // ============== START OF PCA ======================== 111. Calculation calc = new Calculation(); 112. System.out.println("calc pca"); 113. // calc.calculatePCA(cs); 114. // try { 115. // util.writePCAToFile(cs, "processpca.csv"); 116. // } catch (IOException ex) { 117. // Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 118. // } 119. // System.exit(0);
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167.
calc.simulateCalcPCA(cs); System.out.println("done calc pca"); clusteringForm.getProgressBar().setValue(50); // ============== START OF GMEANS ===================== // ============== GMEANS WITH PCA ===================== GMeans gMeans = new GMeans(); ClusterPool pool = gMeans.performGMeans(cs); clusteringForm.getProgressBar().setValue(80); // ============= END GMEANS WITH PCA ==================== // ============= START OF EMPTY CLUSTER REMOVAL ========= System.out.println("\n\n"); System.out.println(" -------- RESULT ----------- "); Iterator iterPool = pool.getClusterList().iterator(); while (iterPool.hasNext()) { Cluster cluster1 = iterPool.next(); if(cluster1.getClusterID() == null) { cluster1.setClusterID(AutoGeneratedID.generateRandomString()); } if (cluster1.getRecordList().isEmpty()) { iterPool.remove(); } } int poolSize = pool.getClusterList().size(); for (int i = 0; i < poolSize; i++) { System.out.println(pool.getClusterList().get(i).toString()); } System.out.println("--- END ---"); System.out.println("Num of cluster : " + pool.getClusterList().size()); if(saveDB) { clusteringForm.getProgressBar().setValue(90); } else { clusteringForm.getProgressBar().setValue(100); } Cluster get = pool.getClusterList().get(0);
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
168. Iterator iterator = get.getRecordList().get(0).getPointList().iterator(); 169. String datacsv = ""; 170. while (iterator.hasNext()) { 171. Point point = iterator.next(); 172. datacsv += point.getTerm() + "\n"; 173. } 174. 175. try { 176. FileUtils.writeStringToFile(new File("./result/terms.csv"), datacsv); 177. } catch (IOException ex) { 178. Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 179. } 180. 181. System.out.println("============================== LIST ====================="); 182. 183. LinkedList clusterList = pool.getClusterList(); 184. for (int i = 0; i < clusterList.size(); i++) { 185. LinkedList recordList = clusterList.get(i).getRecordList(); 186. for (int j = 0; j < recordList.size(); j++) { 187. List dataList = recordList.get(j).getDataList(); 188. for (int k = 0; k < dataList.size(); k++) { 189. Double data = dataList.get(k); 190. if(k == dataList.size() - 1) { 191. System.out.println(data + "," + i); 192. } else { 193. System.out.print(data + ","); 194. } 195. } 196. } 197. } 198. 199. // ========== END OF EMPTY CLUSTER REMOVAL =============== 200. for (int i = 0; i < clusterList.size(); i++) { 201. LinkedList recordList = clusterList.get(i).getRecordList(); 202. List poolOriginalDataList = new ArrayList<>(); 203. for (int j = 0; j < recordList.size(); j++) { 204. List originalDataList = recordList.get(j).getOriginalDataList(); 205. // BELUM SELESAI CARI CENTROID BARU (BY AVERAGE) 206. for (int k = 0; k < originalDataList.size(); k++) { 207. if (j == 0) { 208. poolOriginalDataList.add(originalDataList.get(k)); 209. } else { 210. double poolData = poolOriginalDataList.get(k) + originalDataList.get(k); 211. poolOriginalDataList.set(k, poolData); 212. } 213. } 214. }
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231.
for (int k = 0; k < poolOriginalDataList.size(); k++) { poolOriginalDataList.set(k, poolOriginalDataList.get(k) / recordList.size()); } Record r = new Record(); r.setDataList(poolOriginalDataList); clusterList.get(i).setCentroid(r); } // ========== START OF DATABASE OPERATION =============== if(saveDB) { DatabaseOperationController dbController = new DatabaseOperationController(); dbController.performDBOperation(pool, ds.getMasterLinkedList()); clusteringForm.getProgressBar().setValue(100); } // ========== END OF DATABASE OPERATION ================== } }
1.2.1.7.2. Kelas EntryRetrieval.java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package main; import database.DatabaseRWOperation; import gmeans.Calculation; import gmeans.Cluster; import gmeans.ClusterPool; import gmeans.ModifiedLinkedList; import gmeans.Point; import gmeans.Record; import gmeans.Utility; import helper.QuickSort; import ir.DataStructuring; import ir.Preprocess; import ir.TfIdf; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.logging.Level;
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75.
import java.util.logging.Logger; /** * * @author pacman */ public class MainRetrieval { public List retrieve(String userQuery, boolean isClusterBased) { Preprocess prep = new Preprocess(); Utility util = new Utility(); DatabaseRWOperation dbrw = new DatabaseRWOperation(); DataStructuring ds = new DataStructuring(); // ========== CLUSTER QUERYING ======================== String query = userQuery; // ambil dari db ModifiedLinkedList masterLinkedList = null; try { masterLinkedList = dbrw.readMasterTerm(); } catch (SQLException ex) { Logger.getLogger(MainRetrieval.class.getName()).log(Level.SEVERE, null, ex); } prep.preprocessQuery(query); String[] queryArray = prep.getContent(); String[] wordArray = queryArray[0].split("\\s+"); String[] matchQuery = util.sentenceTermContainInList(masterLinkedList, wordArray); System.out.println("matchQuery length: " + matchQuery.length); if (util.emptyStringArray(matchQuery)) { System.out.println("tidak ditemukan dokumen dengan kata kunci tersebut"); return null; } else { System.out.println("exist"); } // UBAH QUERY KE BENTUK RECORD Record recQuery = ds.tokenizeQuery(matchQuery); // MERGE AGAR MEMILIKI DIMENSI COLUMN YANG SAMA DENGAN RECORD YANG LAIN recQuery = ds.mergeQuery(recQuery, masterLinkedList); // ambil dari db
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123.
HashMap<String, Integer> mapPointDf = null; try { mapPointDf = dbrw.mapPoint(); } catch (SQLException ex) { Logger.getLogger(MainRetrieval.class.getName()).log(Level.SEVERE, null, ex); } // ambil dari db int documentCount = 0; try { documentCount = dbrw.allDocumentCount(); } catch (SQLException ex) { Logger.getLogger(MainRetrieval.class.getName()).log(Level.SEVERE, null, ex); } // HITUNG BOBOT (TF-IDF) QUERY ModifiedLinkedList pointList = recQuery.getPointList(); Iterator iterator = pointList.iterator(); while (iterator.hasNext()) { Point next = iterator.next(); String term = next.getTerm(); boolean containsKey = mapPointDf.containsKey(term); if (containsKey) { next.setDf(mapPointDf.get(term)); double w = next.getTf() * Math.log10(documentCount / next.getDf()); next.setWNorm(w); } }
// ================ END OF CLUSTER QUERYING ========================= // ============ START OF WEIGHTING DOC BASED ON QUERY ============== System.out.println("-----"); ClusterPool fastReadPool = null; int matchIndex; // ambil dari db Cluster selectedCluster = null; try { if (isClusterBased) { fastReadPool = clusterPool(); matchIndex = matchIndex(fastReadPool, recQuery, 1); if(matchIndex == -1) { matchIndex = matchIndex(fastReadPool, recQuery, 2); } selectedCluster = dbrw.readSingleCluster(fastReadPool.getClusterAt(matchIndex));
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
124. } else { 125. selectedCluster = dbrw.readMultipleCluster(); 126. } 127. 128. } catch (SQLException ex) { 129. Logger.getLogger(MainRetrieval.class.getName()).log(Level.SEVERE, null, ex); 130. } 131. 132. List documentWeighting = documentWeighting(selectedCluster, recQuery, 1); 133. if(documentWeighting.isEmpty()) { 134. documentWeighting = documentWeighting(selectedCluster, recQuery, 2); 135. } 136. 137. return documentWeighting; 138. 139. } 140. 141. public List documentWeighting(Cluster selectedCluster, Record recQuery, int booleanOperator) { 142. 143. Utility util = new Utility(); 144. Calculation calc = new Calculation(); 145. 146. TfIdf tfIdf = new TfIdf(); 147. tfIdf.performWeighting(selectedCluster); 148. selectedCluster = tfIdf.getCluster(); 149. 150. // IR konvensional mulai dari sini 151. LinkedList recordList = selectedCluster.getRecordList(); 152. 153. double[] docWeight = new double[recordList.size()]; 154. for (int i = 0; i < recordList.size(); i++) { 155. Record rec = recordList.get(i); 156. List dataList = rec.getDataList(); 157. double[] convDataList = new double[dataList.size()]; 158. for (int j = 0; j < dataList.size(); j++) { 159. convDataList[j] = dataList.get(j); 160. } 161. double[] convQuery = util.convert1DRecordToArray(recQuery); 162. 163. double calculateWQD = calc.calculateWQD(convQuery, convDataList, booleanOperator); 164. docWeight[i] = calculateWQD; 165. } 166. 167. for (int i = 0; i < docWeight.length; i++) { 168. System.out.println(docWeight[i] + " "); 169. }
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217.
// ============ END OF WEIGHTING DOC BASED ON QUERY ============== // ============ START OF SORTING DOC WEIGHT BASED ON QUERY ============== int[] index = new int[docWeight.length]; for (int i = 0; i < index.length; i++) { index[i] = i; } QuickSort.quicksort(docWeight, index); System.out.println("Result"); List sortedList = new ArrayList<>(); for (int i = 0; i < index.length; i++) { System.out.println(index[i]+" "); String toString = recordList.get(index[i]).toString(); if(docWeight[i] > 0.0) { sortedList.add(recordList.get(index[i])); } System.out.println(toString); } return sortedList; } public ClusterPool clusterPool() { DatabaseRWOperation dbrw = new DatabaseRWOperation(); // ambil dari db ClusterPool fastReadPool = null; try { fastReadPool = dbrw.fastRead(); } catch (SQLException ex) { Logger.getLogger(MainRetrieval.class.getName()).log(Level.SEVERE, null, ex); } return fastReadPool; } public int matchIndex(ClusterPool fastReadPool, Record recQuery, int booleanOperator) { int matchIndex = -1; double maxVal = 0; Utility util = new Utility(); Calculation calc = new Calculation(); LinkedList fastClusterList = fastReadPool.getClusterList(); for (int i = 0; i < fastClusterList.size(); i++) {
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
218. // AMBIL CENTROID DALAM BENTUK RECORD 219. Record centroid = fastClusterList.get(i).getCentroid(); 220. 221. // KONVERSI RECORD CENTROID KE BENTUK ARRAY 222. List dataList = centroid.getDataList(); 223. double[] convCentroid = new double[dataList.size()]; 224. for (int j = 0; j < dataList.size(); j++) { 225. convCentroid[j] = dataList.get(j); 226. } 227. 228. // KONVERSI RECORD QUERY (WNORM NYA) KE BENTUK ARRAY 229. double[] convQuery = util.convert1DRecordToArray(recQuery); 230. 231. double calculateWQD = calc.calculateWQD(convQuery, convCentroid, booleanOperator); 232. System.out.println("wqd : " + calculateWQD); 233. 234. if (calculateWQD > maxVal) { 235. maxVal = calculateWQD; 236. matchIndex = i; 237. } 238. } 239. 240. System.out.println("match index: " + matchIndex); 241. 242. return matchIndex; 243. } 244. 245. }
1.2.1.8. Package parser 1.2.1.8.1. Kelas Parser.java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package parser; import java.io.File; import java.io.IOException; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; /** * * @author basisd04
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
15. */ 16. public class Parser { 17. 18. public Parser() { 19. } 20. 21. public String readFileToString(String path) throws IOException { 22. File file = new File(path); 23. return FileUtils.readFileToString(file); 24. } 25. 26. /** 27. * Baca teks diantara 2 tag (xml) 28. * @param data teks yang akan diekstrak 29. * @param tagOpen String tag pembuka 30. * @param tagClose String tag penutup 31. * @return 32. */ 33. public String[] readBetweenTag(String data, String tagOpen, String tagClose) { 34. return StringUtils.substringsBetween(data, tagOpen, tagClose); 35. } 36. 37. public String replaceWhiteSpaceAndSymbol(String[] data) { 38. String all = ""; 39. 40. for (String title : data) { 41. String replaceWhiteSpace = title.trim().replaceAll("\\s+", " "); // replace whitespace, termasuk space, tab, newline 42. String replaceNonAlphaNumeric = replaceWhiteSpace.replaceAll("[\\W]|_", " "); 43. all += replaceNonAlphaNumeric; 44. } 45. 46. return all; 47. } 48. 49. public String replaceWhiteSpaceAndSymbol(String data) { 50. String all = ""; 51. 52. String replaceWhiteSpace = data.trim().replaceAll("\\s+", " "); // replace whitespace, termasuk space, tab, newline 53. String replaceNonAlphaNumeric = replaceWhiteSpace.replaceAll("[\\W]|_", " "); 54. all += replaceNonAlphaNumeric; 55. 56. return all; 57. } 58. 59. }
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
1.2.1.8.2. Kelas Tokenizer.java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30.
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package parser; /** * * @author root */ public class Tokenizer { public Tokenizer() { } /** * Mengambil tiap kata dlm suatu kalimat. Sekaligus menghilangkan tanda baca * @param sentence * @return */ public String[] tokenize(String sentence) { sentence = sentence.toLowerCase(); sentence = sentence.replaceAll("[^a-zA-Z0-9\\s]", ""); String[] wordArray = sentence.split("\\s+"); return wordArray; } }
1.2.1.9. Package stemmer 1.2.1.9.1. Kelas EnhancedStemmer.java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package stemmer; import database.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException;
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59.
import java.util.logging.Level; import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * * @author pacman */ public class EnhancedStemmer { public static void main(String[] args) { EnhancedStemmer m = new EnhancedStemmer(); String word = "diperistri"; String stem = m.stem(word); System.out.println(stem); // // // // // // // // // // // // //
String res = m.del_inflection_suffixes(word); System.out.println(res); boolean matches = Pattern.matches("([km]u|nya|[kl]ah|pun)+$", word); Matcher matcher = Pattern.compile("/(kan)+$/").matcher(word); String replaceAll = matcher.replaceAll(""); System.out.println(replaceAll); boolean matches = matcher.find(); System.out.println(matches); } public String[] stem(String[] sentence) { for (int i = 0; i < sentence.length; i++) { String[] wordArray = sentence[i].split("\\s+"); String newSentence = ""; for (int j = 0; j < wordArray.length; j++) { boolean cekKamusImportantWord = cekKamusImportantWord(wordArray[j]); if(!cekKamusImportantWord) {; wordArray[j] = stem(wordArray[j]); } newSentence += wordArray[j] + " "; } sentence[i] = newSentence; }
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107.
return sentence; } public String stem(String word) { boolean cekKamus = cekKamus(word); /* 1. Cek Kata di Kamus jika Ada SELESAI */ if (cekKamus) { return word; } /* 2. Buang Infection suffixes (\-lah", \-kah", \-ku", \-mu", atau \-nya") */ word = Del_Inflection_Suffixes(word); /* 3. Buang Derivation suffix (\-i" or \-an") */ word = Del_Derivation_Suffixes(word); /* 4. Buang Derivation prefix */ word = Del_Derivation_Prefix(word); return word; } public boolean cekKamusImportantWord(String word) { try { // TODO java.sql.Connection conn = Connection.getConnection(); String sql = "SELECT * from stopword_clustering_ina where stopword = ?"; conn.setAutoCommit(false); PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, word); ResultSet rs = ps.executeQuery(); conn.commit(); int counter = 0; while (rs.next()) { counter++; } conn.close(); if (counter > 0) { return true; } else {
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155.
return false; } } catch (SQLException ex) { Logger.getLogger(EnhancedStemmer.class.getName()).log(Level.SEVERE, null, ex); } return false; } public boolean cekKamus(String word) { try { // TODO java.sql.Connection conn = Connection.getConnection(); String sql = "SELECT * from rootword_ina where rootword = ? LIMIT 1"; conn.setAutoCommit(false); PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, word); ResultSet rs = ps.executeQuery(); conn.commit(); int counter = 0; while (rs.next()) { counter++; } conn.close(); if (counter > 0) { return true; } else { return false; } } catch (SQLException ex) { Logger.getLogger(EnhancedStemmer.class.getName()).log(Level.SEVERE, null, ex); } return false; } public String Del_Inflection_Suffixes(String kata) { String kataAsal = kata; if (eregi("([km]u|nya|[kl]ah|pun)+$", kata)) { // Cek Inflection Suffixes String kata1 = eregi_replace("([km]u|nya|[kl]ah|pun)+$", "", kata); if eregi " kl ah|pu +$", kata // Jika erupa parti les “-lah―, “-kah―,
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
“-tah― atau “-pun―) 156. if eregi " k u| ya +$", kata1 // Hapus Possesi e Pro ou s “-ku―, “mu―, atau “-nya―) 157. String kata2 = eregi_replace("([km]u|nya)+$", "", kata1); 158. return kata2; 159. } 160. } 161. return kata1; 162. } 163. return kataAsal; 164. } 165. 166. public boolean Cek_Rule_Precedence(String word) { 167. if (eregi("^(be)[[:alpha:]]+(lah|an)+$", word)) { // be- dan -i 168. return true; 169. } 170. if (eregi("^(di|([mpt]e))[[:alpha:]]+(i)+$", word)) { // di- dan -an 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200.
return true; } return false; } // Cek Prefix Disallowed Sufixes (Kombinasi Awalan dan Akhiran yang tidak diizinkan) public boolean Cek_Prefix_Disallowed_Sufixes(String word) { if (eregi("^(be)[[:alpha:]]+(i)+$", word)) { // be- dan -i return true; } if (eregi("^(di)[[:alpha:]]+(an)+$", word)) { // di- dan -an return true; } if (eregi("^(ke)[[:alpha:]]+(i|kan)+$", word)) { // ke- dan -i,-kan return true; } if (eregi("^(me)[[:alpha:]]+(an)+$", word)) { // me- dan -an return true; } if (eregi("^(se)[[:alpha:]]+(i|kan)+$", word)) { // se- dan -i,-kan return true; } return false; } // Hapus Derivation Suffixes ("-i", "-an" atau "-kan") public String Del_Derivation_Suffixes(String kata) { String kataAsal = kata;
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
201. if (preg_match("/(kan)+$/", kata)) { // Cek Suffixes 202. String kata1 = preg_replace("/(kan)+$/", "", kata); 203. if (cekKamus(kata1)) { // Cek Kamus 204. return kata1; 205. } 206. } 207. if (preg_match("/(an|i)+$/", kata)) { // cek -kan 208. String kata2 = preg_replace("/(an|i)+$/", "", kata); 209. if (cekKamus(kata2)) { // Cek Kamus 210. return kata2; 211. } 212. } 213. if (Cek_Prefix_Disallowed_Sufixes(kata)) { 214. return kataAsal; 215. } 216. return kataAsal; 217. } 218. 219. // Hapus Derivation Prefix ("di-", "ke-", "se-", "te-", "be-", "me-", atau "pe-") 220. public String Del_Derivation_Prefix(String kata) { 221. String kataAsal = kata; 222. String kata1 = ""; 223. String kata2 = ""; 224. /* ------ Tentukan Tipe Awalan ------------*/ 225. if (preg_match("/^(di|[ks]e)\\S{1,}/", kata)) { // Jika di-,ke-,se226. kata1 = preg_replace("/^(di|[ks]e)/", "", kata); 227. if (cekKamus(kata1)) { 228. return kata1; // Jika ada balik 229. } 230. kata2 = Del_Derivation_Suffixes(kata1); 231. if (cekKamus(kata2)) { 232. return kata2; 233. } 234. } 235. if (preg_match("/^([^aiueo])e\\1[aiueo]\\S{1,}/", kata)) { // aturan 37 236. kata1 = preg_replace("/^([^aiueo])e/", "", kata); 237. if (cekKamus(kata1)) { 238. return kata1; // Jika ada balik 239. } 240. kata2 = Del_Derivation_Suffixes(kata1); 241. if (cekKamus(kata2)) { 242. return kata2; 243. } 244. } 245. if (preg_match("/^([tmbp]e)\\S{1,}/", kata)) { //Jika awalannya adalah “te-―, “me-―, “be-―, atau “pe-― 246. /*------------ A ala “ e-―, ---------------------------------------------*/ 247. if (preg_match("/^(be)\\S 1, /", kata // Jika a ala “ e-―,
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271. 272. 273. 274. 275. 276. 277. 278. 279. 280. 281. 282. 283. 284. 285. 286. 287. 288. 289. 290. 291. 292. 293. 294. 295.
if (preg_match("/^(ber)[aiueo]\\S{1,}/", kata)) { // aturan 1. kata1 = preg_replace("/^(ber)/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } kata1 = preg_replace("/^(ber)/", "r", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } } if (preg_match("/^(ber)[^aiueor][[:alpha:]](?!er)\\S{1,}/", kata)) { //aturan 2. kata1 = preg_replace("/^(ber)/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } } if (preg_match("/^(ber)[^aiueor][[:alpha:]]er[aiueo]\\S{1,}/", kata)) { //aturan 3. kata1 = preg_replace("/^(ber)/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } } if (preg_match("/^belajar\\S{0,}/", kata)) { //aturan 4. kata1 = preg_replace("/^(bel)/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) {
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
296. 297. 298. 299. 300. 301. 302. 303. 304. 305. 306. 307. 308. 309. 310. 311. 312. 313. 314. 315. 316. 317. 318. 319. 320. 321. 322. 323. 324. 325. 326. 327. 328. 329. 330. 331. 332. 333. 334. 335. 336. 337. 338. 339. 340. 341. 342. 343.
return kata2; } } if (preg_match("/^(be)[^aiueolr]er[^aiueo]\\S{1,}/", kata)) { //aturan 5. kata1 = preg_replace("/^(be)/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } } } /*------------e d “ e-―, ---------------------------------------------*/ /*------------ A ala “te-―, ---------------------------------------------*/ if (preg_match("/^(te)\\S 1, /", kata // Jika a ala “te-―, if (preg_match("/^(terr)\\S{1,}/", kata)) { return kata; } if (preg_match("/^(ter)[aiueo]\\S{1,}/", kata)) { // aturan 6. kata1 = preg_replace("/^(ter)/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } kata1 = preg_replace("/^(ter)/", "r", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } } if (preg_match("/^(ter)[^aiueor]er[aiueo]\\S{1,}/", kata)) { // aturan 7. kata1 = preg_replace("/^(ter)/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) {
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
344. 345. 346. 347. 348. 349. 350. 351. 352. 353. 354. 355. 356. 357. 358. 359. 360. 361. 362. 363. 364. 365. 366. 367. 368. 369. 370. 371. 372. 373. 374. 375. 376. 377. 378. 379. 380. 381. 382. 383. 384. 385. 386. 387. 388. 389. 390. 391.
return kata2; } } if (preg_match("/^(ter)[^aiueor](?!er)\\S{1,}/", kata)) { // aturan 8. kata1 = preg_replace("/^(ter)/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } } if (preg_match("/^(te)[^aiueor]er[aiueo]\\S{1,}/", kata)) { // aturan 9. kata1 = preg_replace("/^(te)/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } } if (preg_match("/^(ter)[^aiueor]er[^aiueo]\\S{1,}/", kata)) { // aturan 35 belum bisa kata1 = preg_replace("/^(ter)/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } } } /*------------e d “te-―, ---------------------------------------------*/ /*------------ A ala “ e-―, ---------------------------------------------*/ if (preg_match("/^(me)\\S 1, /", kata // Jika a ala “ e-―, if (preg_match("/^(me)[lrwyv][aiueo]/", kata)) { // aturan 10 kata1 = preg_replace("/^(me)/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2;
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
392. 393. 394. 395. 396. 397. 398. 399. 400. 401. 402. 403. 404. 405. 406. 407. 408. 409. 410. 411. 412. 413. 414. 415. 416. 417. 418. 419. 420. 421. 422. 423. 424. 425. 426. 427. 428. 429. 430. 431. 432. 433. 434. 435. 436. 437. 438. 439.
} } if (preg_match("/^(mem)[bfvp]\\S{1,}/", kata)) { // aturan 11. kata1 = preg_replace("/^(mem)/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } } /*if(preg_match("/^(mempe)\\S{1,}/",kata)){ // aturan 12 kata1 = preg_replace("/^(mem)/",'pe',kata); if(cekKamus(kata1)){ return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if(cekKamus(kata2)){ return kata2; } }*/ if (preg_match("/^(mem)((r[aiueo])|[aiueo])\\S{1,}/", kata)) {//aturan 13 kata1 = preg_replace("/^(mem)/", "m", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } kata1 = preg_replace("/^(mem)/", "p", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } } if (preg_match("/^(men)[cdjszt]\\S{1,}/", kata)) { // aturan 14. kata1 = preg_replace("/^(men)/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
440. 441. 442. 443. 444. 445. 446. 447. 448. 449. 450. 451. 452. 453. 454. 455. 456. 457. 458. 459. 460. 461. 462. 463. 464. 465. 466. 467. 468. 469. 470. 471. 472. 473. 474. 475. 476. 477. 478. 479. 480. 481. 482. 483. 484. 485. 486. 487.
} kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } } if (preg_match("/^(men)[aiueo]\\S{1,}/", kata)) {//aturan 15 kata1 = preg_replace("/^(men)/", "n", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } kata1 = preg_replace("/^(men)/", "t", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } } if (preg_match("/^(meng)[ghqk]\\S{1,}/", kata)) { // aturan 16. kata1 = preg_replace("/^(meng)/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } } if (preg_match("/^(meng)[aiueo]\\S{1,}/", kata)) { // aturan 17 kata1 = preg_replace("/^(meng)/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } kata1 = preg_replace("/^(meng)/", "k", kata); if (cekKamus(kata1)) {
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
488. 489. 490. 491. 492. 493. 494. 495. 496. 497. 498. 499. 500. 501. 502. 503. 504. 505. 506. 507. 508. 509. 510. 511. 512. 513. 514. 515. 516. 517. 518. 519. 520. 521. 522. 523. 524. 525. 526. 527. 528. 529. 530. 531. 532. 533. 534. 535.
return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } kata1 = preg_replace("/^(menge)/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } } if (preg_match("/^(meny)[aiueo]\\S{1,}/", kata)) { // aturan 18. kata1 = preg_replace("/^(meny)/", "s", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } kata1 = preg_replace("/^(me)/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } } } /*------------e d “ e-―, ---------------------------------------------*/ /*------------ Awalan “pe-―, ---------------------------------------------*/ if (preg_match("/^(pe)\\S 1, /", kata // Jika a ala “pe-―, if (preg_match("/^(pe)[wy]\\S{1,}/", kata)) { // aturan 20. kata1 = preg_replace("/^(pe)/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2;
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
536. 537. 538. 539. 540. 541. 542. 543. 544. 545. 546. 547. 548. 549. 550. 551. 552. 553. 554. 555. 556. 557. 558. 559. 560. 561. 562. 563. 564. 565. 566. 567. 568. 569. 570. 571. 572. 573. 574. 575. 576. 577. 578. 579. 580. 581. 582. 583.
} } if (preg_match("/^(per)[aiueo]\\S{1,}/", kata)) { // aturan 21 kata1 = preg_replace("/^(per)/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } kata1 = preg_replace("/^(per)/", "r", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } } if (preg_match("/^(per)[^aiueor][[:alpha:]](?!er)\\S{1,}/", kata)) { // aturan 23 kata1 = preg_replace("/^(per)/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } } if (preg_match("/^(per)[^aiueor][[:alpha:]](er)[aiueo]\\S{1,}/", kata)) { // aturan 24 kata1 = preg_replace("/^(per)/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } } if (preg_match("/^(pem)[bfv]\\S{1,}/", kata)) { // aturan 25 kata1 = preg_replace("/^(pem)/", "", kata); if (cekKamus(kata1)) {
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
584. 585. 586. 587. 588. 589. 590. 591. 592. 593. 594. 595. 596. 597. 598. 599. 600. 601. 602. 603. 604. 605. 606. 607. 608. 609. 610. 611. 612. 613. 614. 615. 616. 617. 618. 619. 620. 621. 622. 623. 624. 625. 626. 627. 628. 629. 630. 631.
return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } } if (preg_match("/^(pem)(r[aiueo]|[aiueo])\\S{1,}/", kata)) { // aturan 26 kata1 = preg_replace("/^(pem)/", "m", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } kata1 = preg_replace("/^(pem)/", "p", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } } if (preg_match("/^(pen)[cdjzt]\\S{1,}/", kata)) { // aturan 27 kata1 = preg_replace("/^(pen)/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } } if (preg_match("/^(pen)[aiueo]\\S{1,}/", kata)) { // aturan 28 kata1 = preg_replace("/^(pen)/", "n", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik }
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
632. 633. 634. 635. 636. 637. 638. 639. 640. 641. 642. 643. 644. 645. 646. 647. 648. 649. 650. 651. 652. 653. 654. 655. 656. 657. 658. 659. 660. 661. 662. 663. 664. 665. 666. 667. 668. 669. 670. 671. 672. 673. 674. 675. 676. 677. 678. 679.
kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } kata1 = preg_replace("/^(pen)/", "t", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } } if (preg_match("/^(peng)[^aiueo]\\S{1,}/", kata)) { // aturan 29 kata1 = preg_replace("/^(peng)/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } } if (preg_match("/^(peng)[aiueo]\\S{1,}/", kata)) { // aturan 30 kata1 = preg_replace("/^(peng)/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } kata1 = preg_replace("/^(peng)/", "k", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } kata1 = preg_replace("/^(penge)/", "", kata); if (cekKamus(kata1)) {
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
680. 681. 682. 683. 684. 685. 686. 687. 688. 689. 690. 691. 692. 693. 694. 695. 696. 697. 698. 699. 700. 701. 702. 703. 704. 705. 706. 707. 708. 709. 710. 711. 712. 713. 714. 715. 716. 717. 718. 719. 720. 721. 722. 723. 724. 725. 726. 727.
return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } } if (preg_match("/^(peny)[aiueo]\\S{1,}/", kata)) { // aturan 31 kata1 = preg_replace("/^(peny)/", "s", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } kata1 = preg_replace("/^(pe)/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } } if (preg_match("/^(pel)[aiueo]\\S{1,}/", kata)) { // aturan 32 kata1 = preg_replace("/^(pel)/", "l", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } } if (preg_match("/^(pelajar)\\S{0,}/", kata)) { kata1 = preg_replace("/^(pel)/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik }
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
728. 729. 730. 731. 732. 733. 734. 735. 736. 737. 738. 739. 740. 741. 742. 743. 744. 745. 746. 747. 748. 749. 750. 751. 752. 753. 754. 755. 756. 757. 758. 759. 760. 761. 762. 763. 764. 765. 766. 767. 768. 769. 770. 771. 772. 773. 774. 775.
kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } } if (preg_match("/^(pe)[^rwylmn]er[aiueo]\\S{1,}/", kata)) { // aturan 33 kata1 = preg_replace("/^(pe)/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } } if (preg_match("/^(pe)[^rwylmn](?!er)\\S{1,}/", kata)) { // aturan 34 kata1 = preg_replace("/^(pe)/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } } if (preg_match("/^(pe)[^aiueor]er[^aiueo]\\S{1,}/", kata)) { // aturan 36 kata1 = preg_replace("/^(pe)/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } } } } /*------------e d “pe-―, ---------------------------------------------*/ /*------------ A ala “ e per-―, ---------------------------------------------*/ if (preg_match("/^(memper)\\S{1,}/", kata)) { kata1 = preg_replace("/^(memper)/", "", kata); if (cekKamus(kata1)) {
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
776. 777. 778. 779. 780. 781. 782. 783. 784. 785. 786. 787. 788. 789. 790. 791. 792. 793. 794. 795. 796. 797. 798. 799. 800. 801. 802. 803. 804. 805. 806. 807. 808. 809. 810. 811. 812. 813. 814. 815. 816. 817. 818. 819. 820. 821. 822. 823.
return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } //*-- Cek luluh -r ---------kata1 = preg_replace("/^(memper)/", "r", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } } /*------------e d “ e per-―, ---------------------------------------------*/ /*------------ A ala “ e pel-―, ---------------------------------------------*/ if (preg_match("/^(mempel)\\S{1,}/", kata)) { kata1 = preg_replace("/^(mempel)/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } //*-- Cek luluh -r ---------kata1 = preg_replace("/^(mempel)/", "l", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } } /*------------e d “ e pel-―, ---------------------------------------------*/ /*------------a ala “ e ter-―, ---------------------------------------------*/ if (preg_match("/^(menter)\\S{1,}/", kata)) { kata1 = preg_replace("/^(menter)/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; }
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
824. 825. 826. 827. 828. 829. 830. 831. 832. 833. 834. 835. 836. 837. 838. 839. 840. 841. 842. 843. 844. 845. 846. 847. 848. 849. 850. 851. 852. 853. 854. 855. 856. 857. 858. 859. 860. 861. 862. 863. 864. 865. 866. 867. 868. 869. 870. 871.
//*-- Cek luluh -r ---------kata1 = preg_replace("/^(menter)/", "r", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } } /*------------e d “ e ter-―, ---------------------------------------------*/ /*------------a ala “ e er-―, ---------------------------------------------*/ if (preg_match("/^(member)\\S{1,}/", kata)) { kata1 = preg_replace("/^(member)/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } //*-- Cek luluh -r ---------kata1 = preg_replace("/^(member)/", "r", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } } /*------------end member-―, ---------------------------------------------*/ /*------------awalan “diper-―, ---------------------------------------------*/ if (preg_match("/^(diper)\\S{1,}/", kata)) { kata1 = preg_replace("/^(diper)/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } /*-- Cek luluh -r ----------*/ kata1 = preg_replace("/^(diper)/", "r", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1);
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
872. 873. 874. 875. 876. 877. 878. 879. 880. 881. 882. 883. 884. 885. 886. 887. 888. 889. 890. 891. 892. 893. 894. 895. 896. 897. 898. 899. 900. 901. 902. 903. 904. 905. 906. 907. 908. 909. 910. 911. 912. 913. 914. 915. 916. 917. 918. 919.
if (cekKamus(kata2)) { return kata2; } } /*------------e d “diper-―, ---------------------------------------------*/ /*------------a ala “diter-―, ---------------------------------------------*/ if (preg_match("/^(diter)\\S{1,}/", kata)) { kata1 = preg_replace("/^(diter)/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } /*-- Cek luluh -r ----------*/ kata1 = preg_replace("/^(diter)/", "r", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } } /*------------e d “diter-―, ---------------------------------------------*/ /*------------a ala “dipel-―, ---------------------------------------------*/ if (preg_match("/^(dipel)\\S{1,}/", kata)) { kata1 = preg_replace("/^(dipel)/", "l", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } /*-- Cek luluh -l----------*/ kata1 = preg_replace("/^(dipel)/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } } /*------------end dipel-―, ---------------------------------------------*/ /*------------kata “terpelajar―(kasus khusus), ---------------------------------------------*/
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
920. 921. 922. 923. 924. 925. 926. 927. 928. 929. 930. 931. 932. 933. 934. 935. 936. 937. 938. 939. 940. 941. 942. 943. 944. 945. 946. 947. 948. 949. 950. 951. 952. 953. 954. 955. 956. 957. 958. 959. 960. 961. 962. 963. 964. 965. 966. 967.
if (preg_match("/terpelajar/", kata)) { kata1 = preg_replace("/terpel/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } } /*------------e d “terpelajar―-―, ---------------------------------------------*/ /*------------kata seseorang(kasus khusus), ---------------------------------------------*/ if (preg_match("/seseorang/", kata)) { kata1 = preg_replace("/^(sese)/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } } /*------------end seseorang-―, ---------------------------------------------*/ /*------------awalan "diber-"---------------------------------------------*/ if (preg_match("/^(diber)\\S{1,}/", kata)) { kata1 = preg_replace("/^(diber)/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } /*-- Cek luluh -l----------*/ kata1 = preg_replace("/^(diber)/", "r", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) { return kata2; } } /*------------end "diber-"---------------------------------------------*/ /*------------awalan "keber-"---------------------------------------------*/ if (preg_match("/^(keber)\\S{1,}/", kata)) { kata1 = preg_replace("/^(keber)/", "", kata); if (cekKamus(kata1)) { return kata1; // Jika ada balik } kata2 = Del_Derivation_Suffixes(kata1); if (cekKamus(kata2)) {
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
968. return kata2; 969. } 970. /*-- Cek luluh -l----------*/ 971. kata1 = preg_replace("/^(keber)/", "r", kata); 972. if (cekKamus(kata1)) { 973. return kata1; // Jika ada balik 974. } 975. kata2 = Del_Derivation_Suffixes(kata1); 976. if (cekKamus(kata2)) { 977. return kata2; 978. } 979. } 980. /*------------end "keber-"---------------------------------------------*/ 981. /*------------awalan "keter-"---------------------------------------------*/ 982. if (preg_match("/^(keter)\\S{1,}/", kata)) { 983. kata1 = preg_replace("/^(keter)/", "", kata); 984. if (cekKamus(kata1)) { 985. return kata1; // Jika ada balik 986. } 987. kata2 = Del_Derivation_Suffixes(kata1); 988. if (cekKamus(kata2)) { 989. return kata2; 990. } 991. /*-- Cek luluh -l----------*/ 992. kata1 = preg_replace("/^(keter)/", "r", kata); 993. if (cekKamus(kata1)) { 994. return kata1; // Jika ada balik 995. } 996. kata2 = Del_Derivation_Suffixes(kata1); 997. if (cekKamus(kata2)) { 998. return kata2; 999. } 1000. } 1001. /*------------end "keter-"---------------------------------------------*/ 1002. /*------------awalan "berke-"---------------------------------------------*/ 1003. if (preg_match("/^(berke)\\S{1,}/", kata)) { 1004. kata1 = preg_replace("/^(berke)/", "", kata); 1005. if (cekKamus(kata1)) { 1006. return kata1; // Jika ada balik 1007. } 1008. kata2 = Del_Derivation_Suffixes(kata1); 1009. if (cekKamus(kata2)) { 1010. return kata2; 1011. } 1012. } 1013. /*------------end "berke-"---------------------------------------------*/ 1014. /* --- Cek Ada Tidak ya Prefik/A ala “di-―, “ke-―, “se-―, “te-―, “be-―, “me-―, atau “pe-―) ------*/
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
1015. if (preg_match("/^(di|[kstbmp]e)\\S{1,}/", kata) == false) { 1016. return kataAsal; 1017. } 1018. 1019. return kataAsal; 1020. } 1021. 1022. public boolean eregi(String regex, String word) { 1023. // regex = regex.replace("+$", "++$"); 1024. Matcher matcher = Pattern.compile(regex, Pattern.CASE_INSENSITIVE).matcher(word); 1025. return matcher.find(); 1026. } 1027. 1028. public String eregi_replace(String regex, String replacement, String word) { 1029. // regex = regex.replace("+$", "++$"); 1030. Matcher matcher = Pattern.compile(regex, Pattern.CASE_INSENSITIVE).matcher(word); 1031. return matcher.replaceAll(replacement); 1032. } 1033. 1034. public boolean preg_match(String regex, String word) { 1035. char[] charArray = regex.toCharArray(); 1036. regex = regex.substring(1, charArray.length - 1); 1037. return eregi(regex, word); 1038. } 1039. 1040. public String preg_replace(String regex, String replacement, String word) { 1041. char[] charArray = regex.toCharArray(); 1042. regex = regex.substring(1, charArray.length - 1); 1043. return eregi_replace(regex, replacement, word); 1044. } 1045. 1046. }
1.2.1.10. Package stopwordremover 1.2.1.10.1. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Kelas StopWordRemover.java
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package stopwordremover; import database.Connection; import java.io.File; import java.io.IOException;
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59.
import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.commons.io.FileUtils; /** * * @author pacman */ public class StopWordRemover { private List<String> resources; public StopWordRemover() { } public StopWordRemover(String path) { try { loadFile(path); } catch (IOException ex) { Logger.getLogger(StopWordRemover.class.getName()).log(Level.SEVERE, null, ex); } catch (SQLException ex) { Logger.getLogger(StopWordRemover.class.getName()).log(Level.SEVERE, null, ex); } } private boolean isInList(String word) throws SQLException { word = word.trim(); java.sql.Connection conn = Connection.getConnection(); String sql = "SELECT stopword FROM stopword_ina WHERE stopword = ?"; conn.setAutoCommit(false); PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, word); ResultSet rs = ps.executeQuery(); conn.commit(); boolean check = false;
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82.
while (rs.next()) { check = true; break; } conn.close(); return check; } public String removeStopWord(String words) { String[] wordArray = words.split("\\s+"); String newSentence = ""; for (String word : wordArray) { boolean inList = false; try { inList = isInList(word); } catch (SQLException ex) { Logger.getLogger(StopWordRemover.class.getName()).log(Level.SEVERE, null, ex); } if(!inList && !containNumeric(word)) { // if tidak ada di stopword list AND tidak mengandung angka newSentence = newSentence + word + " "; } } return newSentence; }
83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106.
public boolean containNumeric(String word) { return word.matches(".*\\d+.*"); } public String[] removeNonAlphaNumeric(String[] sentence) { for (int i = 0; i < sentence.length; i++) { sentence[i] = removeNonAlphaNumeric(sentence[i]); } return sentence; } public String removeNonAlphaNumeric(String words) { String newWords = words.replaceAll("[^a-zA-Z0-9 ]", " "); return newWords; } public String[] removeStopWord(String[] sentence) {
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
107. 108. 109. 110. 111. 112.
for (int i = 0; i < sentence.length; i++) { sentence[i] = removeStopWord(sentence[i]); } return sentence; } }