indeks dan pencarian chained hash table pada - PLAGIAT ...
-
Upload
khangminh22 -
Category
Documents
-
view
0 -
download
0
Transcript of indeks dan pencarian chained hash table pada - PLAGIAT ...
i
INDEKS DAN PENCARIAN CHAINED HASH TABLE PADAPEMEROLEHAN INFORMASI MENGGUNAKAN HASH
FUNCTION : KNUTH’S MULTIPLICATION METHOD DANDIVISION METHOD STUDI KASUS : PERPUSTAKAAN
UNIVERSITAS SANATA DHARMA
SKRIPSI
Diajukan untuk Memenuhi Salah Satu SyaratMemperoleh Gelar Sarjana Teknik Komputer (S.Kom.)
Program Studi Teknik Informatika
Oleh:Linardi
NIM : 085314057
FAKULTAS SAINS DAN TEKNOLOGIUNIVERSITAS SANATA DHARMA
YOGYAKARTA2012
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
ii
CHAINED HASH TABLE INDEX AND SEARCHING ININFORMATION RETRIEVAL WITH HASH FUNCTION :KNUTH’S MULTIPLICATION METHOD DAN DIVISION
METHOD CASE STUDY :LIBRARY OF SANATA DHARMA UNIVERSITY
THESIS
Presented as Partial Fullfilment of the RequirementsTo Obtain the Computer Bachelor Degree
In Informatics Engineering
By:Linardi
NIM : 085314057
FACULTY OF SCIENCE AND TECHNOLOGYSANATA DHARMA UNIVERSITY
YOGYAKARTA2012
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
iii
HALAMAN PERSETUJUAN
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
iv
HALAMAN PENGESAHAN
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
v
PERNYATAAN KEASLIAN KARYA
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
vi
HALAMAN MOTO
Tetapi carilah dahulu Kerajaan Allah dan
kebenarannya, maka semuanya itu akan ditambahkan
kepadamu.
( Matius 6:33 )
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
vii
HALAMAN PERSEMBAHAN
Skripsi ini saya persembahkan kepada Tuhan YME yang selalu
menjadi sandaran dan topangan saat menghadapi masalah, dan
menyertaiku dalam menyelesaikan skripsi.
Untuk Ibu , Ayah, kakak, dan keponakan saya atas dukungan
kalian semua.
Buat yang tercinta, Silvia Natalia, atas support, dukungan dan
doa dalam menyelesaikan skripsi.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
viii
ABSTRAKSI
Perpustakaan Universitas Sanata Dharma ( USD ) menggunakan sebuah
sistem pencarian koleksi yang mengharuskan pemustaka untuk memiliki informasi
yang memadai seperti judul, pengarang, dll. Pemustaka akan mengalami kesulitan
dalam menemukan koleksi apabila hanya memiliki sedikit informasi mengenai isi
koleksi yang ingin ditemukan. Sistem IR (Information Retrieval) dapat menjadi salah
satu solusi penyelesaiannya. Terdapat beberapa permasalahan dalam pengembangan
IR, salah satunya yaitu bagaiman melakukan pencarian yang cepat dan hemat sumber
daya. Hal ini berkaitan dengan bentuk dan struktur data yang digunakan sebagai
indeks. Salah satu struktur data yang dapat digunakan untuk menyelesaikannya
adalah struktur data Hash table.
Dari latar belakang tersebut, dikembangkan sebuah sistem untuk menguji
unjuk kerja Division method dan Knuth’s multiplication method sebagai hash function
pada index dalam bentuk inverted index yang menggunakan struktur data hash table.
Sistem dikembangkan dengan bahasa pemrograman JAVA. Hasil akhir penelitian
berupa data-data pengukuran waktu pemrosesan indeks, persebaran data dalam hash
table, penggunaan memori, dan waktu pencarian. Diperoleh bahwa untuk waktu
pembentukan dan penggunaan memori, division method lebih unggul, dan Knuth’s
multiplication method memiliki persebaran data yang lebih merata tetapi memiliki
lebih banyak bucket yang tidak terisi.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
ix
ABSTRACT
Library of Sanata Dharma University (USD) uses a collection searching
system that requires the user to have adequate information such as title, author, etc.
Users will have difficulty in finding the collection if they just have little information
about the contents of the collection. This problem can be solved by an IR
(Information retrieval) system. In developing IR, there are some problem such as how
to do a fast and efficient searching. This relates to the form and data structure that
used for the index. Hash table data structure can be used to solve this problems.
From these background, a system was developed to measure the
performance of Division method and Knuth’s multiplication method as a hash
function in inverted index with hash table data structure. The system was developed
with the JAVA programming language. The final results is measurement of time for
index processing, distribution of data in hash table, memory usage and searching
time. The results provide that division method is superior in processing time and
memory usage, and Knuth's multiplication method has a more equitable distribution
of the data but it has more empty buckets in the hash table.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
x
LEMBAR PENYATAAN PERSETUJUANPUBLIKASI KARYA ILMIAH
UNTUK KEPENTINGAN AKADEMIS
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
xi
KATA PENGANTAR
Puji dan syukur saya panjatkan pada Tuhan YME yang telah melimpahkan
berkatnya sehingga saya dapat menyelesaikan tugas akhir ini.
Pada kesempatan ini saya ingin mengucapkan terima kasih pada pihak-pihak
yang telah membantu saya dalam menyelesaikan skripsi ini, baik dalam hal
bimbingan, perhatian, kasih sayang, semangat, kritik dan saran yang diberikan.
Ucapan terima kasih ini saya sampaikan antara lain kepada :
1. Ibu Paulina Heruningsih Prima Rosa, S.Si., M.Sc selaku Dekan Fakultas
Sains dan Teknologi Universitas Sanata Dharma.
2. Ibu Ridowati Gunawan, S.Kom, M.T. selaku ketua jurusan Teknik
Informatika Sanata Dharma.
3. Bapak Eko Hari Parmadi S.Si., M.Kom. selaku Dosen Pembimbing
Akademik Teknik Informatika angkatan 2008.
4. Ibu Sri Hartati Wijono, S.Si., M.Kom. selaku Dosen Pembimbing TA, terima
kasih atas bimbingannya selama saya mengerjakan skripsi ini.
5. Bapak JB. Budi Darmawan, S.T, M.Sc. dan Albertus Agung Hadhiatma S.T.,
M.T. selaku Dosen Penguji Pendadaran skripsi saya, terima kasih atas
masukkan dalam memperbaiki skripsi ini.
6. Ibu, kakak dan kekasih saya terima kasih atas dukungan, semangat dan kasih
sayang yang diberikan sehingga saya dapat menyelesaikan tugas akhir ini.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
xiii
DAFTAR ISI
HALAMAN JUDUL INDONESIA............................................................................... i
HALAMAN JUDUL INGGRIS ................................................................................... ii
HALAMAN PERSETUJUAN.....................................................................................iii
HALAMAN PENGESAHAN...................................................................................... iv
PERNYATAAN KEASLIAN KARYA ....................................................................... v
HALAMAN MOTO ....................................................................................................vi
HALAMAN PERSEMBAHAN .................................................................................vii
ABSTRAKSI .............................................................................................................viii
ABSTRACT................................................................................................................. ix
LEMBAR PENYATAAN PERSETUJUAN ................................................................ x
KATA PENGANTAR .................................................................................................xi
DAFTAR ISI..............................................................................................................xiii
DAFTAR GAMBAR .................................................................................................xix
DAFTAR TABEL......................................................................................................xxi
DAFTAR LISTING ..................................................................................................xxii
DAFTAR LAMPIRAN............................................................................................xxiii
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
xiv
BAB I PENGANTAR................................................................................................... 1
1.1. Latar Belakang ........................................................................................... 1
1.2. Rumusan Masalah ...................................................................................... 4
1.3. Tujuan Penelitian........................................................................................ 4
1.4. Batasan Permasalahan ................................................................................ 4
1.5. Manfaat Penelitian...................................................................................... 5
1.6. Luaran......................................................................................................... 5
1.7. Metodologi Penelitian ................................................................................ 5
1.8. Sistematika Penulisan................................................................................. 7
BAB II LANDASAN TEORI ....................................................................................... 8
2.1. Perpustakaan............................................................................................... 8
2.1.1. Perpustakaan Universitas Sanata Dharma.................................................. 8
2.2. Information Retrieval ( IR ) ....................................................................... 9
2.3. Data Preprocessing .................................................................................. 10
2.3.1. Tokenizing ................................................................................................ 10
2.3.2. Stopword Removal.................................................................................... 10
2.3.3. Stemming .................................................................................................. 11
2.4. Index ......................................................................................................... 15
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
xv
2.5. Indexing and Searching ............................................................................ 16
2.6. Hash Table ............................................................................................... 17
2.6.1. Chained Hash Table................................................................................. 17
2.6.2. Hash Function .......................................................................................... 19
2.6.2.1. Mixing Step ....................................................................................... 19
2.6.2.2. Division Method................................................................................ 21
2.6.2.3. Knuth’s Multiplication Method......................................................... 21
2.7. Metodologi FAST .................................................................................... 22
BAB III ANALISIS DESAIN..................................................................................... 26
3.1. Analisis Sistem......................................................................................... 26
3.1.1. Fase Definisi Ruang Lingkup (Scope Definition Phase) ......................... 26
3.1.2. Fase Analisis Masalah (Problem Analysis Phase) ................................... 27
3.1.2.1. Gambaran Sistem Lama .................................................................... 27
3.1.2.2. Gambaran Sistem Penelitian ............................................................. 27
3.2. Perancangan Penelitian ............................................................................ 28
3.2.1. Data Penelitian ......................................................................................... 28
3.2.2. Diagram Blok Penelitian .......................................................................... 28
3.2.3. Diagram Kelas UML................................................................................ 29
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
xvi
3.2.4. Flowchart Proses...................................................................................... 30
3.2.4.1. Flowchart Scanning dan Tokenizing ................................................. 31
3.2.4.2. Flowchart Stopword Removal ........................................................... 32
3.2.4.3. Flowchart Porter Stemmer................................................................. 33
3.2.4.4. Flowchart Indexing............................................................................ 34
3.2.4.5. Flowchart Searching.......................................................................... 37
3.2.5. Skenario Pengujian................................................................................... 38
3.2.5.1. Pengujian Waktu Pemrosesan Index ................................................. 38
3.2.5.2. Pengujian Sumberdaya Memori ........................................................ 38
3.2.5.3. Pengujian Persebaran Data dalam Hash Table.................................. 38
3.2.5.4. Pengujian Waktu Pencarian Koleksi ................................................. 39
BAB IV IMPLEMENTASI ........................................................................................ 40
4.1. Implementasi Proses................................................................................. 40
4.1.1. Implementasi Preprocessing .................................................................... 40
4.1.1.1. Tahap Scanning dan Tokenizing ........................................................ 41
4.1.1.2. Tahap Stopword Removal.................................................................. 43
4.1.1.3. Tahap Stemming ................................................................................ 44
4.1.2. Implementasi Indexing ............................................................................. 45
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
xvii
4.1.3. Implementasi Searching ........................................................................... 66
BAB V HASIL PENGUJIAN DAN ANALISA......................................................... 72
5.1. Hasil Pengujian ........................................................................................ 72
5.1.1. Hasil Pengujian Waktu Pemrosesan Index............................................... 73
5.1.2. Hasil Pengujian Sumber Daya Memori.................................................... 74
5.1.3. Hasil Pengujian Persebaran Data dalam Hash Table ............................... 75
5.1.3.1. Grafik Persebaran Division Method ( 383 Bucket )........................... 75
5.1.3.2. Grafik Persebaran Knuth’s Multiplication Method ( 383 Bucket ).... 76
5.1.3.3. Grafik Persebaran Division Method ( 1531 Bucket )......................... 77
5.1.3.4. Grafik Persebaran Knuth’s Multiplication Method ( 1531 Bucket ).. 78
5.1.3.5. Grafik Persebaran Division Method ( 6143 Bucket )......................... 79
5.1.3.6. Grafik Persebaran Knuth’s Multiplication Method ( 6143 Bucket ).. 80
5.1.3.7. Grafik Persebaran Division Method ( 24571 Bucket )....................... 81
5.1.3.8. Grafik Persebaran Knuth’s Multiplication Method ( 24571 Bucket ) 82
5.1.4. Hasil Pengujian Waktu Pencarian ............................................................ 83
5.2. Analisa Hasil Pengujian ........................................................................... 85
5.2.1. Analisa Pengujian Waktu Pemrosesan Indeks ......................................... 85
5.2.2. Analisa Pengujian Sumber Daya Memori ................................................ 86
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
xviii
5.2.3. Analisa Pengujian Persebaran Data dalam Hash Table ........................... 87
5.2.4. Analisa Pengujian Waktu Pencarian ........................................................ 88
BAB VI KESIMPULAN DAN SARAN .................................................................... 93
6.1. Kesimpulan............................................................................................... 93
6.2. Saran......................................................................................................... 94
DAFTAR PUSTAKA ................................................................................................. 95
LAMPIRAN................................................................................................................ 97
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
xix
DAFTAR GAMBAR
Gambar 2.1. Komponen Inverted Index ...................................................................... 16
Gambar 2.2. Ilustrasi struktur chained hash table ...................................................... 18
Gambar 2.3. Algoritma PJWHash............................................................................... 20
Gambar 3.1. Diagram Blok Penelitian ........................................................................ 29
Gambar 3.2. Diagram Kelas UML.............................................................................. 30
Gambar 3.3. Flowchart Scanning dan Tokenizing ...................................................... 31
Gambar 3.4. Flowchart Stopword Removal ................................................................ 32
Gambar 3.5. Flowchart Porter Stemmer (Porter, 1980) ............................................. 33
Gambar 3.6. Flowchart Indexing dengan Knuth’s multiplication method .................. 35
Gambar 3.7. Flowchart Indexing dengan Division Method ........................................ 36
Gambar 3.8. Flowchart Searching .............................................................................. 37
Gambar 5.1. Grafik Persebaran Data untuk Division Method dengan ukuran
383 Bucket ................................................................................................ 76
Gambar 5.2. Grafik Persebaran Data untuk Knuth’s Multiplication Method
dengan ukuran 383 Bucket ....................................................................... 77
Gambar 5.3. Grafik Persebaran Data untuk Division Method dengan ukuran
1531 Bucket .............................................................................................. 78
Gambar 5.4. Grafik Persebaran Data untuk Knuth’s Multiplication Method
dengan ukuran 1531 Bucket ..................................................................... 79
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
xx
Gambar 5.5. Grafik Persebaran Data untuk Division Method dengan ukuran
6143 Bucket .............................................................................................. 80
Gambar 5.6. Grafik Persebaran Data untuk Knuth’s Multiplication Method
dengan ukuran 6143 Bucket ..................................................................... 81
Gambar 5.7. Grafik Persebaran Data untuk Division Method dengan ukuran
24571 Bucket ............................................................................................ 82
Gambar 5.8. Grafik Persebaran Data untuk Knuth’s Multiplication Method
dengan ukuran 24571 Bucket ................................................................... 83
Gambar 5.9. Grafik Perbandingan Waktu Pembentukan Hash Table......................... 86
Gambar 5.10. Grafik Perbandingan Penggunaan Memori .......................................... 87
Gambar 5.15. Grafik Perbandingan Standar Deviasi Persebaran Data dalam
Hash Table ............................................................................................... 88
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
xxi
DAFTAR TABEL
Tabel 5.1. Hasil Pengukuran Waktu Pembentukan Indeks ......................................... 73
Tabel 5.2. Hasil Pengukuran Jumlah Memori Pembentukan Indeks .......................... 74
Tabel 5.3. Hasil Pengukuran Pengujian Waktu Pencarian pada Hash
Function : Division Method...................................................................... 84
Tabel 5.4. Hasil Pengukuran Pengujian Waktu Pencarian pada Hash
Function : Knuth’s Multiplication Method ............................................... 84
Tabel 5.5. Tabel Persebaran Data kedua Hash Function ............................................ 90
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
xxii
DAFTAR LISTING
Listing 4.1. Scanning dan Tokenizing ......................................................................... 43
Listing 4.2. Stopword Removal ................................................................................... 44
Listing 4.3. Stemming.................................................................................................. 45
Listing 4.4. Pengindeksan kedalam HashTable .......................................................... 49
Listing 4.4.1. Variabel pencatat waktu pengindeksan ............................................ 50
Listing 4.4.2. Pengecekan status pemanggilan method .......................................... 50
Listing 4.6.3. Penentuan mixing step...................................................................... 51
Listing 4.4.4. Pengubahan Mixing code negatif menjadi positif............................ 51
Listing 4.6.5. Penghitungan Hash code.................................................................. 51
Listing 4.4.6. Pengisian objek koleksi kedalam Hash table................................... 53
Listing 4.4.7. Pencatatan dan perhitungan total waktu pengindeksan.................... 54
Listing 4.5. Penyimpanan hasil indeks........................................................................ 56
Listing 4.6. Pembuatan indeks dari file text ................................................................ 59
Listing 4.7. Penyimpanan LOG HashTable ................................................................ 65
Listing 4.8. PJWHash.................................................................................................. 66
Listing 4.9. Pencarian data koleksi ............................................................................. 71
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
xxiii
DAFTAR LAMPIRAN
Lampiran 1 Listing PreProcessing .............................................................................. 97
Lampiran 2 Listing IndexingProcess ........................................................................ 100
Lampiran 3 Listing SearchingProcess....................................................................... 108
Lampiran 4 Listing Koleksi ...................................................................................... 110
Lampiran 5 Listing Stemmer .................................................................................... 111
Lampiran 6 Listing PJWHash ................................................................................... 121
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
1
BAB I
PENGANTAR
1.1. Latar Belakang
Perpustakaan Universitas Sanata Dharma (USD) yang terletak di Yogyakarta
merupakan salah satu Perpustakaan Perguruan Tinggi. Perpustakaan terdiri dari 2
(dua) unit perpustakaan yaitu Perpustakaan USD yang terletak di Mrican dan Paingan
yang dikelola secara sentralisasi. Koleksi yang terdapat dalam Perpustakaan USD
dibagi kedalam beberapa kategori yaitu : koleksi buku, tugas akhir, majalah, artikel
majalah, suara (audio), gambar (image), gambar bergerak (video), dan e-book.
Terdapat lebih dari 350.000 judul koleksi yang siap digunakan pada Perpustakaan
USD. Dalam melakukan pelayanannya, Perpustakaan USD mengunakan sebuah
"sistem terbuka" yang memungkinkan pemustaka untuk dapat memilih dan mencari
sendiri koleksi yang diinginkannya.
Sistem yang digunakan pada hakekatnya bertujuan untuk mempermudah
pencarian koleksi perpustakaan oleh para pemustaka. Sistem pencarian koleksi
Perpustakaan USD sekarang ini memiliki sebuah antar-muka yang nantinya meminta
pengguna untuk terlebih dahulu menentukan jenis koleksi yang ingin ditemukan.
Kemudian koleksi dapat dicari dengan memasukkan satu atau lebih kata kunci. Kata
kunci yang terdapat pada sistem berupa judul buku, pengarang, penerbit, nomor
identitas buku, dan lain sebagainya. Dengan demikian, pemustaka harus memiliki
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
2
informasi yang memadai mengenai kata kunci yang dibutuhkan. Contohnya, seorang
pemustaka ingin mencari koleksi yang mengandung informasi mengenai
pertumbuhan bakteri, maka pemustaka harus mengetahui kata kunci pencarian yang
dapat dikenal oleh sistem, misalnya kata “mikrobiologi” sebagai kata kunci judul
buku atau kata “Gemilang” sebagai kata kunci penerbit. Jika pemustaka hanya
mengetahui penggalan kalimat yang terdapat pada pustaka tanpa mengetahui kata
kunci yang terdapat pada sistem, maka pemustaka akan kesulitan untuk menemukan
koleksi yang dibutuhkan. Hal ini menjadi keterbatasan sistem pencarian Perpustakaan
USD karena pemustaka harus mengetahui kata kunci yang tepat agar pemustaka
menemukan koleksi yang diinginkan.
Salah satu pendekatan yang dapat digunakan untuk menyelesaikan
permasalahan tersebut adalah dengan menggunakan Information Retrieval System
(Sistem Pemerolehan Informasi). Sebuah Sistem Pemerolehan Informasi
memungkinkan untuk dilakukannya pencarian bukan hanya pada kata kunci (judul,
penerbit, dan lainnya) tertentu melainkan juga pada keseluruhan isi atau teks yang
terdapat dalam pustaka koleksi. Beberapa tahapan dalam pengembangan sebuah
Sistem Pemerolehan Informasi yaitu : pengumpulan data, tokenizing, stemming,
indexing, searching, dan pemodelan hasil pencarian.
Sebagian besar kajian pengembangan sebuah Sistem Pemerolehan Informasi
ditujukan untuk meningkatkan efisiensi dan efektifitas sistem. Dalam hal efisiensi,
kajian lebih ditekankan pada bagaimana melakukan pencarian (retrieval) yang cepat
dan hemat sumberdaya (Rijsbergen, 1979). Salah satu bagian yang memberikan
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
3
pengaruh besar dalam hal efisiensi Information Retrieval System adalah pada proses
pembuatan index dan pencarian informasi (searching). Menurut (Loudon, 1999),
struktur data yang dapat mengakomodasi kebutuhan dalam pembuatan index dan
pencarian (searching) adalah Hash Table.
Terdapat beberapa permasalahan yang kerap muncul dalam pengembangan
sebuah Hash Table yaitu : menentukan jenis hash table, fungsi hash (hash function)
yang optimal untuk bentuk data tertentu, panjang hash table yang optimal dalam
penggunaan sumber daya memori dan kecepatan akses. Sebuah hash table yang baik
apabila diterapkan kedalam sebuah Information Retrieval System akan mendukung
efisiensi dalam pencarian informasi (Bell, Harries, McKenzie, 1990). Dalam
penelitian ini, penulis akan menganalisa unjuk kerja Knuth’s multiplication method
dan Division Method sebagai hash function pada Chained Hash Table dengan mixing
step PJWHash sebagai proses indexing untuk data berupa data teks koleksi
Perpustakaan Universitas Sanata Dharma yang berupa teks berbahasa Indonesia.
Diharapkan penelitian ini dapat memberikan dukungan positif dalam pengembangan
sebuah mesin Pencarian Koleksi Perpustakaan berbasis Information Retrieval System
yang lebih handal dalam sisi pengindeksan dan pencarian.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
4
1.2. Rumusan Masalah
Adapun masalah-masalah yang dapat dirumuskan dalam penelitian ini antara
lain :
1. Bagaimanakah unjuk kerja Knuth’s multiplication method dan Division
method sebagai hash function pada Chained Hash Table dengan mixing step
PJWHash pada data berupa data teks berbahasa Inggris?
1.3. Tujuan Penelitian
Tujuan-tujuan yang ingin dicapai penulis dalam penelitian ini adalah sebagai
berikut :
1. Mengetahui unjuk kerja Knuth’s multiplication method dan Division method
sebagai hash function pada Chained Hash Table dengan mixing step
PJWHash pada data berupa data teks berbahasa Inggris.
1.4. Batasan Permasalahan
Beberapa batasan permasalahan dalam penelitian ini adalah sebagai berikut :
1. Kategori data teks yang akan digunakan yaitu : data e-book.
2. Data teks koleksi Perpustakaan USD yang akan digunakan akan melalui
melalui proses scanning, tokenizing, stemming, dan indexing (inverted
index).
3. Data teks yang akan melalui proses stemming berupa data teks Bahasa
Inggris.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
5
4. Pengujian hash table yang akan dilakukan adalah berupa pengujian
persebaran data dalam hash table, penggunaan sumberdaya memori,
processing time (waktu pemrosesan), dan searching time (waktu pencarian).
5. Pengujian sistem pada penelitian dilakukan dengan bahasa pemrograman
Java.
6. Proses stemming dilakukan dengan menggunakan algoritma Porter Stemmer.
1.5. Manfaat Penelitian
Penelitian ini diharapkan dapat membantu pengembangan Sistem Pencarian
Koleksi Perpustakaan USD berbasis Information Retrieval System yang lebih efisien
dalam melakukan proses indexing dan pencarian koleksi.
1.6. Luaran
Luaran yang diharapkan penulis melalui penelitian ini adalah diperolehnya
informasi mengenai unjuk kerja Knuth’s multiplication method dan Division method
sebagai hash function pada Chained Hash Table untuk studi kasus Perpustakaan
Universitas Sanata Dharma.
1.7. Metodologi Penelitian
Metode yang digunakan penulis dalam melaksanakan penelitian ini adalah
Framework for the Application of Sistem Thinking (FAST). Adapun tahapan-tahapan
yang dilakukan dijabarkan sebagai berikut :
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
6
1. Analisis Ruang Lingkup
Menganalisis ruang lingkup permasalahan baik mengenai sistem sebelumnya
dan solusi yang ditawarkan.
2. Analisis Permasalahan
Melakukan analisis dari permasalahan yang muncul pada sistem
sebelumnya.
3. Perancangan Penelitian
Melakukan perancangan penelitian yang akan dilakukan dan metode
pengujian yang akan diterapkan pada hasil penelitian.
4. Pelaksanaan Penelitian
Melakukan penelitian yang telah dirancang sebelumnya untuk mengetahui
unjuk kerja indexing dan pencarian menggunakan Knuth’s multiplication
method dan Division method sebagai hash function pada chained hash table.
5. Analisis Hasil Penelitian
Melakukan analisis pada hasil yang diperoleh dari penelitian yang telah
dilaksanakan.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
7
1.8. Sistematika Penulisan
Sistematika penulisan pada penelitian ini dibagi kedalam beberapa bagian
sebagai berikut :
BAB I : Berisi latar belakang munculnya permasalahan yang akan
diteliti, rumusan permasalahan, tujuan penelitian, batasan
masalah, metodologi penelitian, dan sistematika penulisan.
BAB II : Berisi landasan-landasan teori yang digunakan penulis dalam
penyusunan penulisan penelitian ini.
BAB III : Berisi analisis permasalahan dan perancangan penelitian yang
akan dilaksanakan.
BAB IV : Berisi implementasi sistem pengujian.
BAB V : Berisi hasil dan pembahasan penelitian yang telah
dilaksanakan.
BAB VI : Berisi kesimpulan dan saran dari hasil analisis peneltian.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
8
BAB II
LANDASAN TEORI
Pada bagian ini, penulis akan membahas mengenai dasar-dasar teori yang
digunakan dalam penulisan penelitian. Dasar-dasar teori tersebut dapat dipaparkan
sebagai berikut :
2.1. Perpustakaan
Menurut Undang-undang Nomor 43 Tahun 2007 tentang Perpustakaan,
dtuliskan bahwa Perpustakaan adalah institusi pengelola koleksi karya tulis, karya
cetak, dan/atau karya rekam secara profesional dengan sistem yang baku guna
memenuhi kebutuhan pendidikan, penelitian, pelestarian, informasi, dan rekreasi para
pemustaka. Seperti yang diketahui, Perpustakaan dibedakan menjadi : Perpustakaan
Nasional, Umum, Sekolah / Madrasah, Perguruan Tinggi, dan Khusus. Perpustakaan
Sekolah dan Perguruan Tinggi harus mengikuti Standar Nasional Perpustakaan
sebagai acuan penyelenggaraan, pengelolaan, dan pengembangannya (Indonesia,
2007).
2.1.1. Perpustakaan Universitas Sanata Dharma
Perpustakaan Universitas Sanata Dharma merupakan salah satu
Perpustakaan yang cukup berkembang di wilayah Yogyakarta. Perpustakaan terdiri
dari 2 (dua) unit perpustakaan yaitu Perpustakaan Kampus Mrican dan Perpustakaan
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
9
Kampus Paingan. Kedua Perpustakaan Universitas Sanata Dharma (USD) dikelola
secara sentralisasi. Perpustakaan kampus Mrican merupakan perpustakaan Pusat,
sedangkan Perpustakaan Kampus Paingan merupakan perpustakaan cabang.
Perpustakaan Kampus Paingan berkonsentrai pada pelayanan pengguna bagi civitas
akademika Universitas Sanata Dharma (USD) yang berada di Kampus Paingan.
Sebuah jaringan komputer digunakan untuk menghubungkan Perpustakaan Mrican
dan Paingan agar dapat melayani penggunanya secara online.
2.2. Information Retrieval ( IR )
Sistem Pemerolehan Informasi adalah sebuah sistem yang dapat melakukan
penyimpanan, peneriamaan, dan pemeliharaan informasi. Informasi yang dimaksud
dalam konteks ini dapat terdiri dari teks (termasuk numerik dan data tanggal), citra,
audio, video, dan objek multimedia lainnya (Kowalsky, 1997). Terdapat beberapa
tahap dalam pengembangan sebuah Sistem Pemerolehan Informasi yaitu :
pemotongan setiap kata dari data teks hasil scan (Tokenizing), penghilangan kata
sambung dan lain sebagainya (Stop-word Removal), pengubahan setiap kata kedalam
bentuk dasarnya (Stemming), penataan data guna mempermudah proses pencarian
(Indexing), pencarian kembali koleksi oleh pengguna sistem (Searching), dan
menampilkan hasil pencarian (Modeling). Tahap-tahap yang dilalui sebelum
mencapai tahap Modeling sering disebut Data Preprocessing.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
10
2.3. Data Preprocessing
Data preprocessing merupakan tahap awal dalam pengembangan sebuah
Sistem Pemerolehan Informasi. Adapun tahap-tahap yang dikerjakan meliputi :
scanning data, tokenizing, stop-word removal, dan proses stemming.
2.3.1. Tokenizing
Teks dalam bentuk asli nya, berupa rangkaian karakter tanpa
informasi eksplisit mengenai batas-batas kata dan kalimat. Sebelum proses lebih
lanjut dapat diterapkan, teks perlu untuk dipotong ke dalam bentuk kata-kata. Proses
pemotongan ini disebut tokenization atau tokenizing. Hasil pemotongan biasa disebut
sebagai tokens. Tidak hanya kata-kata yang dianggap sebagai tokens, tetapi
juga angka, tanda baca, tanda kurung, tanda kutip, dan lainnya (Schmid, 2008).
Sebagai contoh terdapat sebuah kalimat : Andi bermain bola bersama Koko
di lapangan. Kalimat tersebut apabila dikenakan proses tokenizing maka akan
diperoleh hasil berupa potongan-potongan kata yaitu : Andi; bermain; bola; bersama;
Koko; di; lapangan. Dari hasil proses tokenizing, masih diperlukan beberapa langkah
sebelum data dapat di proses kedalam bentuk index. Langkah berikut setelah data teks
melalui proses tokenizing ini adalah proses stopword removal.
2.3.2. Stopword Removal
Beberapa kata umum yang sering muncul dalam jumlah besar dan tidak
memiliki makna yang berarti dalam sebuah kalimat disebuat sebagai stopword
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
11
(Manning, Raghavan, Schutze, 2008). Contoh-contoh stopword dalam bahasa Inggris
seperti : is, am, a, at, the, in, on, dan lain sebagainya.
Salah satu strategi umum yang sering digunakan dalam menentukan kata-
kata stopword dalam koleksi kata (dictionary) yang didapatkan adalah dengan
mengurutkan kata-kata pada koleksi berdasarkan collecction frequency yaitu
frekuensi kemunculan kata bersangkutan didalam seluruh koleksi dokumen. Pada
umumnya kata-kata yang termasuk kedalam stopword adalah kata-kata yang memiliki
frekuensi kemunculan tertinggi. Pembuangan stopword ini disebut sebagai proses
stopword removal. Proses stopword removal ini memberikan sedikit banyak
sumbangan kedalam hal efisiensi dalam penyimpanan dan pembuatan index dari
koleksi kata yang didapatkan melalui proses tokenizing (Manning, 2008).
2.3.3. Stemming
Untuk alasan ketatabahasaan dalam sebuah dokumen teks, akan digunakan
berbagai bentuk berbeda dari sebuah kata seperti kata “compute” dapat diubah
kedalam beberapa bentuk lain seperti : “computer”, “computing”, “computation”, dan
lain sebagainya. Dalam tata bahasa Inggris, hal ini dikenal sebagai penambahan
akhiran. Tugas dari proses stemming ini adalah untuk mengubah kembali kata-kata
dalam koleksi yang memiliki imbuhan kedalam bentuk kata dasarnya atau kata unik
yang sudah pasti menggambarkan kata dasarnya. Salah satu algoritma stemming
bahasa Inggris yaitu algoritma Porter Stemmer. Berikut penjelasan mengenai
algoritma stemming Porter Stemmer :
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
12
1. Langkah 1 : menghilangkan kejamakan kata, akhiran –ed dan –ing
caresses -> caress
ponies -> poni
ties -> ti
caress -> caress
cats -> cat
feed -> feed
agreed -> agree
disabled -> disable
matting -> mat
mating -> mate
meeting -> meet
milling -> mill
messing -> mess
meetings -> meet
2. Langkah 2 : mengubah huruf “y” pada akhir kata menjadi “i” apabila
terdapat huruf vokal didalam kata yang stem.
(m>0) ATIONAL → ATE relational → relate
(m>0) TIONAL → TION conditional → condition
(m>0) ENCI → ENCE valenci → valence
(m>0) ANCI → ANCE hesitanci → hesitance
(m>0) IZER → IZE digitizer → digitize
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
13
(m>0) ABLI → ABLE conformabli → conformable
(m>0) ALLI → AL radicalli → radical
(m>0) ENTLI → ENT differentli → different
(m>0) ELI → E vileli vile
(m>0) OUSLI → OUS analogousli → analogous
(m>0) IZATION → IZE vietnamization → vietnamize
(m>0) ATION → ATE predication → predicate
(m>0) ATOR → ATE operator → operate
(m>0) ALISM → AL feudalism → feudal
(m>0) IVENESS → IVE decisiveness → decisive
(m>0) FULNESS → FUL hopefulness → hopeful
(m>0) OUSNESS → OUS callousness → callous
(m>0) ALITI → AL formaliti → formal
(m>0) IVITI → IVE sensitiviti → sensitive
(m>0) BILITI → BLE sensibiliti → sensible
3. Langkah 3 : menghilangkan akhiran ganda (double suffix) seperti kata yang
berakhiran –ization (mangandung akhiran –ize dan –ation) diubah misal
menjadi –ize.
(m>0) ICATE → IC triplicate → triplic
(m>0) ATIVE → formative → form
(m>0) ALIZE → AL formalize → formal
(m>0) ICITI → IC electriciti → electric
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
14
(m>0) ICAL → IC electrical → electric
(m>0) FUL → hopeful → hope
(m>0) NESS → goodness → good
4. Langkah 4 : menangani beberapa imbuhan seperti -ic-, -full, -ness dan
sebagainya.
(m>1) AL → revival → reviv
(m>1) ANCE → allowance → allow
(m>1) ENCE → inference → infer
(m>1) ER → airliner → airlin
(m>1) IC → gyroscopic → gyroscop
(m>1) ABLE → adjustable → adjust
(m>1) IBLE → defensible → defens
(m>1) ANT → irritant → irrit
(m>1) EMENT → replacement → replac
(m>1) MENT → adjustment → adjust
(m>1) ENT → dependent → depend
(m>1 and (*S or *T)) ION → adoption → adopt
(m>1) OU → homologou → homolog
(m>1) ISM → communism → commun
(m>1) ATE → activate → activ
(m>1) ITI → angulariti → angular
(m>1) OUS → homologous → homolog
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
15
(m>1) IVE → effective → effect
(m>1) IZE → bowdlerize → bowdler
5. Langkah 5 : menghilangkan akhiran seperti -ant, -ence dan sebagainya.
(m>1) E → probate -> probat, rate -> rate
(m=1 and not *o) E → cease → ceas
(m > 1 and *d and *L) → single letter
controll → control
roll → roll
1. Langkah 6 : menghilangkan akhiran terakhir yaitu –e.
Untuk setiap langkah algoritma diatas, terdapat implementasi tertentu yang
dilakukan oleh porter, seperti variabel “m” yang merupakan variabel yang
menandakan jumlah pasangan vokal-konsonan ditengah kata. Contoh :
m=0 TR, EE, TREE, Y, BY.
m=1 TROUBLE, OATS, TREES, IVY.
m=2 TROUBLES, PRIVATE, OATEN, ORRERY.
2.4. Index
Pengindeksan merupakan bagian yang ditujukan untuk mempercepat
pencarian informasi pada sebuah Information Retrieval System. Salah satu bentuk
pengindeksan yang kerap digunakan yaitu inverted index / inverted file (Kowalski,
2011). Bentuk dari struktur inverted index dapat dilihat pada gambar 2.2.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
16
Gambar 2.1. Komponen Inverted Index
Sebuah inverted index terdiri dari tiga komponen utama yaitu document file
(data pada hasil proses dokumen), dictionary (kamus yang berisi daftar kata unik
yang didapat), dan inversion list (daftar letak atau posisi terdapatnya kata tersebut)
(Kowalsky, Maybury, 2002).
2.5. Indexing and Searching
Indexing dan Searching merupakan proses yang cukup krusial didalam
sebuah Information Retrieval System dikarenakan kedua hal inilah yang nantinya
akan membawa pengaruh besar pada sisi efisiensi (Borko, 1977). Seperti yang
diketahui, ukuran sebuah index pada Information Retrieval System akan berpengaruh
dalam besarnya sumber daya yang digunakan dan waktu pencarian (retrieval) akan
informasi yang diinginkan. Salah satu struktur data yang dapat mengakomodasi
kebutuhan tersebut adalah struktur data hash table.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
17
2.6. Hash Table
Hash table merupakan sebuah struktur data berbentuk array yang
pengaksesan isinya dilakukan melalui sebuah key value (nilai kunci). Gagasan utama
dari stuktur data hash table ini adalah untuk membentuk sebuah pemetaan data dan
posisi data tersebut terletak. Sebuah hash table yang baik akan memiliki persebaran
data yang merata. Hash value yang digunakan untuk mengakses posisi data dalam
array dihasilkan melalui sebuah hash function.
Sebuah hash function yang baik akan dapat memetakan data secara merata
kedalam array yang tersedia. Saat sebuah hash funtion dapat menjamin bahwa tidak
akan dihasilkannya sebuah hash value yang sama, maka akan terbentuk perfect hash
(pemetaan sempurna). Perfect hash merupakan best case (kondisi terbaik) dari sebuah
hash table dimana dimiliki kompleksitas algoritma untuk melakukan pencarian yaitu
O(1). Kompleksitas O(1) berarti bahwa pencarian dapat dilakukan dengan waktu
instant (Loudon, 1999).
Unjuk kerja sebuah hash function juga sangat dipengaruhi oleh bagaimana
bentuk integer data yang dimasukkan. Terutama apabila data input berupa data teks
(string), maka data harus terlebih dahulu melalui process String Processing (Cormen,
1990).
2.6.1. Chained Hash Table
Chained Hash Table merupakan salah satu cara untuk menyelesaikan
masalah collision yang terjadi dalam sebuah hash table. Collision terjadi saat sebuah
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
18
hash function, memetakan dua atau lebih data dengan sebuah hash value yang sama.
Chained Hash Table memiliki sebuah ide bahwa array statik pada hash table akan
berupa bucket atau array yang didalamnya berisi struktur data linked list. Gagasan ini
dapat mengatasi collision dengan cara, data dengan hash value yang sama, akan
dipetakan kedalam sebuah posisi array namun berada dalam linked list yang berbeda.
Contoh chained hash table dapat dilihat pada gambar 2.3 :
Gambar 2.2. Ilustrasi struktur chained hash table
Dalam sebuah chained hash table dikenal istilah load factor yaitu nilai
harapan jumlah maksimal data pada sebuah posisi dalam hash table (dengan asumsi
terjadi keseragaman pada persebaran data dalam hash table).
Menurut (Kruse, Rybe, 1998) salah satu keuntungan utama penggunaan
chained hash table sebagai solusi collision adalah dapat dihematnya pemakaian
sumberdaya yang dibutuhkan untuk penyimpanan data. Unjuk kerja sebuah chained
hash table juga tidak lepas dari hash function yang digunakan untuk menentukan
hash value-nya.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
19
2.6.2. Hash Function
Hash Function adalah suatu fungsi atau aturan yang digunakan untuk
memetakan key value kedalam bentuk hash value sesuai dengan panjang hash table.
Adapun bentuk umum rumus sebuah hash function adalah sebagai berikut (persamaan
(1)) :
Pemilihan hash function yang baik sangat signifikan dalam mempengaruhi
unjuk kerja suatu hash table. Hal ini dikarenakan dengan memilih suatu hash function
yang baik, data-data dapat dipetakan kedalam hash table secara merata sehingga
dapat menghindari terjadinya collision yang terlalu banyak. Contoh hash function
yang sederhana seperti Division method dan Knuth’s multiplication method.
2.6.2.1. Mixing Step
Mixing step merupakan tahap dimana data dalam bentuk String akan diubah
kedalam bentuk data Integer agar dapat diproses ketahap perhitungan hash code.
PJWHash merupakan mixing function yang dikembangkan oleh P.J. Weinberger yang
didalamnya terjadi beberapa proses pergeseran bit dari kode ASCII masing-masing
karakter dari key ( Aho, Sethi, Ullman, 1986).
h (k) = x ......... (1)
keterangan :h = fungsi Hashk = key valuex = hash value
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
20
Proses pada PJWHash dimulai dengan membuat sebuah variabel h=0. Untuk
setiap karakter dari key, dilakukan pergeseran bit kekiri sebanyak 4 bit kemudian
ditambahkan dengan bit karakter bersangkutan dan disimpan kedalam variabel “h”.
Jika pada 4 bit atas hasil penjumlahan tersebut terdapat bit 1, maka lakukan
pergeseran 4 bit tersebut kekanan sebanyak 24 bit, hasilnya dikenakan operasi XOR
terhadap variabel “h” dan hasilnya disimpan kedalam variabel “h”. Kemudian ubah 4
bit atas pada variabel “h” menjadi bit 0 ( Aho, Sethi, Ullman, 1986).
Algoritma tersebut dapat digambarkan dalam bahasa pemrograman C
sebagai berikut :
Gambar 2.3. Algoritma PJWHash
Pada bahasa pemrograman JAVA tidak terdapat tipe data Unsigned Integer,
sehingga untuk mendapatkan hasil yang sama dengan hasil pada bahasa C,
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
21
dibutuhkan konversi tipe data kedalam tipe data Long pada bahasa pemrograman
JAVA dimana hasil dari sebuah tipe data Integer akan dikenakan operasi AND
terhadap bit 0xffffffffL yang merupakan bit 1 pada semua 32-bit bawah pada tipe data
Long.
2.6.2.2. Division Method
Prinsip kerja division method adalah dengan mengambil sisa pembagian key
value dengan panjang hash table sebagai hash value. Metode ini merupakan metode
sederhana yang sering digunakan dalam merancang sebuah hash table. adapun
penjabaran dari perhitungan pada metode division method ini adalah sebagai berikut
(persamaan (2)) :
Pemilihan panjang hash table (m) pada division method sebaiknya dilakukan
dengan memilih suatu bilangan prima yang terletak jauh dari bilangan pangkat 2
dengan tetap memperhatikan load factor hash table yang diinginkan (Loudon, 1999).
2.6.2.3. Knuth’s Multiplication Method
Prinsip kerja dari Knuth’s Multiplication Method adalah dengan
mengkalikan key value dengan sebuah konstanta A yang bernilai 0 < A < 1.
h(k) = k mod m ......... (2)
Keterangan :h(k) = hash valuek = key valuem = panjang hash table
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
22
Kemudian nilai yang didapat akan dikalikan dengan jumlah slot / bucket pada hash
table. Nilai yang menjadi hash value adalah nilai hasil pembulatan kebawah dari hasil
yang didapat pada perhitungan sebelumnya. Nilai A yang sering digunakan adalah
0,618 yang disebut sebagai Golden Ratio. Perhitungan golden ratio dilihat pada
persamaan (3) (Loudon, 1999) :
Penjabaran rumus perhitungan hash value pada Knuth’s multiplication
method dapat dituliskan sebagai berikut (persamaan (4)) :
2.7. Metodologi FAST
Metodologi FAST (Framework for the Application of Sistem Thinking)
merupakan kerangka yang fleksibel untuk menyediakan tipe-tipe berbeda proyek dan
strategi (Whitten, 2004). Adapun tahapan-tahapan yang terdapat dalam FAST adalah
sebagai berikut :
ℎ( ) = ⌊ ( 1 ) ⌋ ......... (4)
Keterangan :h(k) = hash valuem = panjang hash tablek = key valueA = golden ratio
≈ 5− 12 ......... (3)
Keterangan :A = Golden Ratio
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
23
1. Scope Definition Phase
Pada tahap ini dilakukan pengumpulan informasi yang akan diteliti tingkat
feasibility dan ruang lingkup proyek yaitu dengan menggunakan kerangka
PIECES (Performance, Information, Economics, Control, Efficiency,
Service). Hal ini dilakukan untuk menemukan inti dari masalah-masalah
yang ada (problems), kesempatan untuk meningkatkan kinerja organisasi
(opportunity), dan kebutuhan-kebutuhan baru yang dibebankan oleh
pihak manajemen atau pemerintah (directives).
2. Problem Analysis Phase
Problem Analysis adalah studi untuk memahami sistem yang ada sekarang
dan menganalisa untuk menyediakan informasi kepada tim proyek. Pada
tahap ini akan diteliti masalah-masalah yang muncul pada sistem yang ada
sebelumnya.
3. Requirement Analysis Phase
Tujuan dari tahapan ini adalah mengidentifikasi data, proses dan antarmuka
yang diinginkan pengguna dari sistem yang baru. Alat bantu untuk
memahami kebutuhan yang ada adalah dengan pemodelan use case.
4. Logical Design Phase
Merupakan terjemahan dari kebutuhan pengguna bisnis ke dalam suatu
model sistem. Dengan kata lain pada fase ini akan menjawab pertanyaan-
pertanyaan seputar penggunaan teknologi (data, process, interface) yang
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
24
menjamin usability, reliability, completeness, performance, dan quality yang
akan dibangun di dalam sistem.
5. Decision Analysis Phase
Pada tahap ini akan akan dipertimbangkan beberapa kandidat dari perangkat
lunak dan keras yang nantinya akan dipilih dan dipakai dalam implementasi
sistem sebagai solusi atas problems dan requirements yang sudah
didefinisikan pada tahapan-tahapan sebelumnya.
6. Physical Design and Integration Phase
Tujuan dari tahapan ini adalah mentransformasikan kebutuhan bisnis yang
direpresentasikan sebagai logical design menjadi physical design yang
nantinya akan dijadikan sebagai acuan dalam membuat sistem yang akan
dikembangkan. Jika di dalam logical design tergantung kepada berbagai
solusi teknis, maka physical design merepresentasikan solusi teknis yang
lebih spesifik.
7. Construction and Testing Phase
Mulai mengkonstruksi dan menguji komponen-komponen sistem untuk
desain. Ada dua tujuan fase ini yaitu :
aMembangun dan menguji sebuah sistem yang memenuhi persyaratan
bisnis dan spesifikasi desain fisik.
b. Mengimplementasikan interface antara sistem yang baru dengan sistem
yang telah ada.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
25
8. Installation and Delivery Phase
Kegiatan yang dilakukan pada fase ini adalah instalasi sistem, training user,
manual sistem, mengkonversi file dan database yang ada ke dalam database
yang baru, final testing dan menyiapkan prosedur konversi.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
26
BAB III
ANALISIS DESAIN
3.1. Analisis Sistem
Pada bagian ini akan dijelaskan mengenai analisa dari perancangan sistem
penelitian yang akan dilakukan. Adapun perancangan sistem penelitian ini
berdasarkan tahapan metodologi FAST.
3.1.1. Fase Definisi Ruang Lingkup (Scope Definition Phase)
Sistem yang ada saat ini dibangun menggunakan metodologi dan prosedur
perangkat lunak secara terstruktur. Sistem pencarian koleksi adalah sebuah sistem
yang digunakan untuk melakukan pencarian data koleksi berdasarkan keyword yang
diinputkan oleh pengguna dan pengelolaan data oleh administrator serta staff dalam
hal ini petugas di perpustakaan. Pengguna dapat melakukan pencarian (searching)
pada data koleksi yang sudah terkumpul dan terekam pada database perpustakaan.
Sedangkan administrator dapat mengelola data user dengan melakukan login terlebih
dahulu. Akan dibangun sebuah sistem pencarian lebih canggih yang akan
memungkinkan pengguna melakukan pencarian dengan tidak hanya berdasarkan kata
kunci tertentu dan pada kategori tertentu saja. Sistem pencarian koleksi baru yang
akan dibangun akan menerapkan metode Information Retrieval (IR). Pada sistem
pencarian baru yang akan dibangun, muncul permasalahan mengenai efisiensi dan
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
27
efektifitas pemerolehan informasi. Masalah yang terdapat pada sisi efisiensi adalah
bagaimana membentuk index data koleksi yang efektif dan melakukan pencarian
dengan cepat.
3.1.2. Fase Analisis Masalah (Problem Analysis Phase)
3.1.2.1. Gambaran Sistem Lama
Sistem pencarian yang digunakan saat ini memungkinkan pengguna untuk
melakukan pencarian pada data koleksi Perpustakaan dengan memasukkan query
pada salah satu jenis kata kunci (pengarang, penerbit, judul, dan lainnya) dengan
terlebih dahulu memilih kategori koleksi (buku, majalah, tugas akhir, dan lain
sebagainya). Sistem dibangun menggunakan bahasa pemrograman PHP dan database
SQL. Pencarian data koleksi dilakukan menggunakan query database.
3.1.2.2. Gambaran Sistem Penelitian
Sistem yang dibangun pada penelitian ini adalah sistem yang digunakan
untuk menguji salah satu solusi pembentukan index. Penelitian yang akan dilakukan
ditujukan pada membandingkan unjuk kerja dua buah hash function pada chained
hash table yaitu Knuth’s multiplication method dan Division method. Sistem
pengujian akan dibangun dengan bahasa pemrograman JAVA. Sistem pengujian akan
melakukan pengujian mengenai pemrosesan pembentukan index dan pencarian pada
index. Parameter yang diujikan berupa waktu pembentukan index, sumber daya
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
28
memori yang digunakan, persebaran data dalam hash table, dan waktu pencarian
yang dibutuhkan untuk menemukan kembali koleksi yang tersimpan.
3.2. Perancangan Penelitian
Berikut akan dipaparkan perancangan sistem pengujian yang akan dibangun
pada penelitian ini.
3.2.1. Data Penelitian
Data yang digunakan penulis dalam penelitian ini berupa sejumlah data E-
book yang diperoleh dari Perpustakaan Universitas Sanata Dharma (USD). Data E-
book yang digunakan berupa 71 buah E-book berbahasa Inggris.
3.2.2. Diagram Blok Penelitian
Pada bagian ini akan dipaparkan diagram blok proses penelitian yang akan
dilakukan. Adapun diagram tersebut sebagai berikut :
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
29
Gambar 3.1. Diagram Blok Penelitian
Pada proses pencarian koleksi, dapat dilakukan pengujian dengan
memasukkan lebih dari 1 kata pencarian. Proses pencarian yang dilakukan dengan
memasukkan lebih dari 1 kata pencarian adalah proses pencarian dengan operasi
AND yang akan menghasilkan koleksi yang mengandung semua kata pencarian.
3.2.3. Diagram Kelas UML
Pada bagian ini akan dipaparkan kelas-kelas, atribut-atribut beserta method-
method yang dibutuhkan pada pembangunan sistem pengujian penelitian ini.
Diagram kelas UML tersebut dapat dilihat pada gambar 3.2.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
30
Gambar 3.2. Diagram Kelas UML
3.2.4. Flowchart Proses
Pada bagian berikut ini akan dijelaskan mengenai alur kerja proses-proses
(method-method) yang terdapat dalam sistem pengujian yang dibangun. Alur kerja
proses-proses tersebut akan digambarkan dengan sebuah flowchart.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
31
3.2.4.1. Flowchart Scanning dan Tokenizing
Gambar 3.3. Flowchart Scanning dan Tokenizing
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
32
3.2.4.2. Flowchart Stopword Removal
Gambar 3.4. Flowchart Stopword Removal
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
33
3.2.4.3. Flowchart Porter Stemmer
Gambar 3.5. Flowchart Porter Stemmer (Porter, 1980)
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
34
3.2.4.4. Flowchart Indexing
Terdapat 2 (dua) jenis indexing yang akan diujikan dalam penelitian ini yaitu
indexing menggunakan hash function Knuth’s multiplication method dan Division
method. Gambar 3.11 menunjukkan flowchart proses indexing dengan Knuth’s
multiplication method sebagai hash function dan gambar 3.12 menunjukkan flowchart
proses indexing Division Method sebagai hash function.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
35
Gambar 3.6. Flowchart Indexing dengan
Knuth’s multiplication method
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
36
Gambar 3.7. Flowchart Indexing dengan
Division Method
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
37
3.2.4.5. Flowchart Searching
Gambar 3.8. Flowchart Searching
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
38
3.2.5. Skenario Pengujian
Dibawah ini akan dijabarkan lebih lengkap mengenai parameter pengujian
yang akan dilaksanakan dalam penelitian ini. Adapun parameter pengujian tersebut
adalah sebagai berikut :
3.2.5.1. Pengujian Waktu Pemrosesan Index
Pengujian waktu pemrosesan merupakan pengujian yang dilakukan pada saat
pembentukan index. Waktu pemrosesan yang diukur dimulai dari saat sistem mulai
mengambil data pertama dari hasil stemming sampai saat sistem meletakkan data
terakhir. Waktu yang didapat melalui Knuth’s multiplication method dan Division
method akan dibandingkan dan dianalisis.
3.2.5.2. Pengujian Sumberdaya Memori
Pengujian sumberdaya memori merupakan pengujian pada besarnya jumlah
free memory (memori bebas) yang digunakan atau dipakai pada saat pembentukan
Hash table yang bersangkutan. besarnya free memory akan diukur mulai dari saat
pembacaan koleksi Perpustakaan sampai dengan saat Hash table berhasil dibentuk.
Free memory akan ditampilkan dalam bentuk besaran bytes memory.
3.2.5.3. Pengujian Persebaran Data dalam Hash Table
Pengujian persebaran data dalam hash table merupakan pengujian yang
dilakukan pada kondisi index telah terbentuk. Persebaran data dalam hash table akan
dipaparkan dalam bentuk diagram kartesius. Pada diagram kartesius, sumbu (x) akan
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
39
menampilkan nomor bucket pada hash table dan sumbu (y) akan menampilkan
panjang chain (linked list) yang terbentuk didalam bucket tersebut. Pengujian yang
dilakukan adalah dengan membandingkan dan menganalisis panjang chain terbesar
dan terkecil, rata-rata, varians dan standar deviasi panjang chain.
3.2.5.4. Pengujian Waktu Pencarian Koleksi
Pengujian waktu pencarian merupakan pengujian yang dilakukan pada saat
pengguna memasukkan query. Untuk mengukur waktu pencarian pada hash table
yang terbentuk melalui proses pengindeksan, dibutuh teknik sampling yang akan
menjamin bahwa data yang digunakan pada pencarian sudah mewakili keseluruhan
populasi dan lokasi bucket. Tanpa menggunakan sampling yang tepat, dapat
dihasilkan data pengukuran waktu pencarian yang bias.
Untuk mengetahui lebih lanjut unjuk kerja dalam hal waktu pencarian pada
kedua jenis hash function dapat dilakukan dengan mencatat beberapa informasi
terkait persebaran data-data dalam hash table. Pengukuran yang dilakukan akan
meliputi pencatatan persentase jumlah bucket yang tidak terisi, persentase jumlah
bucket yang terisi, panjang chain maksimum yang terbentuk, panjang chain minimum
yang terbentuk, varians persebaran data, dan standar deviasinya. Kemudian hasil
pengukuran yang diperoleh akan dianalisa.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
40
BAB IV
IMPLEMENTASI
Pada bagian ini penulis akan memaparkan proses implementasi sistem
pengujian yang telah dirancang kedalam bahasa yang dapat dimengerti mesin.
Spesifikasi perangkat lunak yang digunakan dalam melakukan implementasi sistem
pengujian adalah sebagai berikut :
1. Sistem operasi : Windows 7 Ultimate Edition
2. Netbeans IDE 6.9.1
4.1. Implementasi Proses
Berikut akan ditampilkan proses implementasi masing-masing proses utama
yang terdapat dalam sistem pengujian antara lain proses Preprocessing, proses
Indexing, dan proses Searching.
4.1.1. Implementasi Preprocessing
Proses Preprocessing ini merupakan proses yang akan mengolah data
mentah yang berupa koleksi-koleksi perpustakaan menjadi data-data yang siap
dipakai didalam tahap Indexing maupun Searching koleksi. Pada proses
Preprocessing ini, terdapat tahapan-tahapan pengolahan data yaitu : tahap Scanning
dan Tokenizing, tahap Stopword Removal, dan tahap Stemming.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
41
4.1.1.1. Tahap Scanning dan Tokenizing
Pada tahap ini, data koleksi perpustakaan akan dibaca dan diekstrak data
tulisan kedalam bentuk data String. Data String yang diperoleh masih berupa
kesatuan sekumpulan kata-kata yang terdapat dalam file yang dibaca. Kemudian data
String ini akan dipecah kedalam bentuk Object[ ] (Object Array) dimana setiap posisi
dalam Array tersebut akan diisi dengan 1 buah kata. Proses ini dilaksanakan dengan
memanggil method bacaDocument(String).
public Object[] bacaDocument(String bookSource) {
double timeStart = (double) System.nanoTime();
String inputFile = bookSource;
Object[] dataTextArray = null;
ArrayList<String> dataTextVector = new ArrayList <String>();
try {
reader = new PdfReader(inputFile);
int numberOfPages = reader.getNumberOfPages();
//dimulai pengulangan untuk ektraksi kata pada tiap halaman
String dataText = "";
for (int i = 0; i < numberOfPages; i++) {
dataText = PdfTextExtractor.getTextFromPage(reader, i + 1);
dataText = dataText.replaceAll("[^a-zA-Z0-9]", " ");
dataText = dataText.replaceAll(" ", " ");
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
42
dataText = dataText.replaceAll(" ", " ");
dataText = dataText.replaceAll(" ", " ");
dataText = dataText.replaceAll(" ", " ");
//tokenizing kata menjadi array
dataTextArray = dataText.split(" ");
for (int j = 0; j < dataTextArray.length; j++) {
dataTextVector.add(dataTextArray[j].toString()); }}
reader.close();
} catch (IOException ex) {
Logger.getLogger(PreProcessing.class.getName()).log(Level.SEVERE, null,
ex); }
//perhitungan waktu pemrosesan ektraksi kata
double timeFinish = (double) System.nanoTime();
double time = ((double) (timeFinish - timeStart)) / 1000000000;
System.out.println("Start time extraction : " + timeStart);
System.out.println("Finish time extraction : " + timeFinish);
System.out.println("Total time use : " + time);
//menampilkan hasil panjang array keseluruhan kata dari semua halaman
System.out.println("Jumlah keseluruhan array kata : " + dataTextVector.size());
//mengembalikan hasil ekstraksi
dataTextArray = dataTextVector.toArray();
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
43
return dataTextArray; }
Listing 4.1. Scanning dan Tokenizing
4.1.1.2. Tahap Stopword Removal
Pada tahap ini, data hasil Scanning dan Tokenizing yang berbentuk data
Object Array akan dikenai proses penghapusan atau penghilangan kata-kata yang
termasuk kedalam daftar kata “Stopword”. Proses ini dilaksanakan dengan
memanggil method stopwordRemoval(Object [ ]). Kata yang dikenai proses Stopword
Removal ini akan melalui dua tahap pengecekan, yaitu pengecekan terhadap kata
Stopword bahasa Indonesia dan bahasa Inggris. Keluaran method method
stopwordRemoval(Object [ ]) berupa sebuah variabel bertipe Object. Method
stopwordRemoval(Object [ ]) dapat dijabarkan sebagai berikut :
public Object[] stopwordRemoval(Object[] dataEkstraksi) {
double timeStart = (double) System.nanoTime();
String checkedData;
ArrayList<String> hasilStopWordRemoval = new ArrayList<String>();
//permulaan pengecekan dan penghapusan stopwords dengan data hasil Ektraksi
for (int i = 0; i < dataEkstraksi.length; i++) {
checkedData = (String) dataEkstraksi[i];
if (isInStopWordDictionary(checkedData) || checkedData.equals ("") ||
checkedData.length() <= 2 || checkedData.contains(" ")) {
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
44
} else {
hasilStopWordRemoval.add(checkedData); } }
//perhitungan waktu proses stopwordsRemoval
double timeFinish = (double) System.nanoTime();
double time = ((double) (timeFinish - timeStart)) / 1000000000;
System.out.println("Start time stopword Removal : " + timeStart);
System.out.println("Finish time stopword Removal : " + timeFinish);
System.out.println("Total time use : " + time);
//menampilkan jumlah kata setelah stopword removal
System.out.println("Jumlah kata setelah stopword removal : " +
hasilStopWordRemoval.size());
//mengembalikan hasil data array stopword removal
return hasilStopWordRemoval.toArray(); }
Listing 4.2. Stopword Removal
4.1.1.3. Tahap Stemming
Tahap Stemming merupakan proses pencarian kata dasar dari kata-kata yang
diperoleh sebelumnya (tahap Stopword Removal). Proses stemming ini akan mencari
kata dasar untuk kata berbahasa Inggris akan dilakukan dengan menerapkan
algoritma Porter stemmer. Proses Stemming dilaksanakan dengan memanggil method
stemming (Object [ ]). Keluaran method stemming ini berupa sebuah variabel bertipe
Object[ ].
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
45
public Object[] stemming(Object[] hasilStopwordRemoval) {
double timeStart = (double) System.nanoTime();
char[] sequenceWord;
porterStemmer = new Stemmer();
ArrayList<String> hasilStemming = new ArrayList<String>();
//proses stemming dimulai
String rootWord = "";
for (int i = 0; i < hasilStopwordRemoval.length; i++) {
sequenceWord = ((String) hasilStopwordRemoval[i]).toCharArray();
porterStemmer.add(sequenceWord, sequenceWord.length);
porterStemmer.stem();
rootWord = porterStemmer.toString().toLowerCase();
hasilStemming.add(rootWord); }
Listing 4.3. Stemming
Rincian listing Porter stemmer terlampir pada dokumen ini.
4.1.2. Implementasi Indexing
Setelah data-data diproses melalui tahap-tahap PreProcessing, maka
selanjutnya data akan dibentuk kedalam sebuah Indeks. Pada bagian ini, data-data
hasil stemming akan disusun kedalam HashTable sebagai bentuk struktur data
penyimpanannya. Didalam HashTable terdapat bucket-bucket yang menampung
masing-masing kata yang berbentuk Objek dari kelas Koleksi. Proses ini akan
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
46
dikerjakan dengan memanggil method startIndexingProcess(Object[ ], String, String,
String, int). Berikut merupakan hasil implementasi method
startIndexingProcess(Object[ ], String, String, String, int).
public void startIndexingProcess(Object[] hasilStemmingIndonesia, String status,
String idBuku, String hashMethod, int mixingStepTipe) {
double timeStart = (double) System.nanoTime();
double timeFinish;
double time;
//pengecekan status pengindeksan apakah permulaan atau sambungan
if (status.equalsIgnoreCase("start")) {
wordCount = 0;
koleksiArrayList = (ArrayList<Koleksi>[])
Array.newInstance(ArrayList.class, jumlahBucket);
for (int i = 0; i < jumlahBucket; i++) {
koleksiArrayList[i] = new ArrayList<Koleksi>(); } }
//mulai meletakkan kedalam hash table perkata
long mixingCode;
String word;
for (int i = 0; i < hasilStemmingIndonesia.length; i++) {
word = ((String) hasilStemmingIndonesia[i]);
mixingCode = 0;
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
47
mixingCode=MS.PJWHash(word);
//penghilangan angka negatif
mixingCode = Math.abs(mixingCode);
int hashCode;
if (hashMethod.equalsIgnoreCase("division")) {
//division method
hashCode = (int) (mixingCode % this.getJumlahBucket());
//end division method
} else {
//selesai pemotongan
hashCode = (int) (this.getJumlahBucket() * ((mixingCode * knuth) % 1));
//end multiplication method
}
boolean isIdBukuFind = false;
boolean isWordFind = false;
int posisiKataInHashTable = 0;
for (int j = 0; j < this.getKoleksiArrayList()[hashCode].size(); j++) {
if
(this.getKoleksiArrayList()[hashCode].get(j).getKata().equalsIgnoreCase((String)
hasilStemmingIndonesia[i])) {
isWordFind = true;
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
48
posisiKataInHashTable = j;
for (int k = 0; k <
this.getKoleksiArrayList()[hashCode].get(j).getIdBuku().size(); k++) {
if
(this.getKoleksiArrayList()[hashCode].get(j).getIdBuku().get(k).equalsIgnoreCase(id
Buku)) {
isIdBukuFind = true;
this.getKoleksiArrayList()[hashCode].get(j).getJumlahKataDalamBuku().set(k,
this.getKoleksiArrayList()[hashCode].get(j).getJumlahKataDalamBuku().get(k) + 1);
break; } }
break; } }
if (!isWordFind) {
wordCount++;
Koleksi temp = new Koleksi();
temp.setKata((String) hasilStemmingIndonesia[i]);
temp.getIdBuku().add(idBuku);
temp.getJumlahKataDalamBuku().add(1);
this.getKoleksiArrayList()[hashCode].add(temp);
} else if (!isIdBukuFind) {
koleksiArrayList[hashCode].get(posisiKataInHashTable).getIdBuku().add(idBuku);
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
49
koleksiArrayList[hashCode].get(posisiKataInHashTable).getJumlahKataDalamBuku(
).add(1); } }
//selesai meletakkan kedalam hash table perkata
// memulai perhitungan waktu Hash
timeFinish = (double) System.nanoTime();
time = ((double) (timeFinish - timeStart)) / 1000000000;
System.out.println("Start time indexing HashTable : " + timeStart);
System.out.println("Finish time indexing HashTable : " + timeFinish);
System.out.println("Total time use : " + time);
System.out.println("Total words created in HashTable : " + wordCount); }
Listing 4.4. Pengindeksan kedalam HashTable
Berikut akan dipaparkan lebih jauh mengenai fungsi-fungsi yang dikerjakan
pada method startIndexingProcess(Object[ ], String, String, String, int) ini. Pada awal
method startIndexingProcess(Object[ ], String, String, String, int) terdapat beberapa
variabel yang digunakan untuk mencatat lama waktu yang digunakan pada saat proses
pengindeksan berlangsung. Pada tahap awal akan dilakukan pencatatan waktu mulai
dilakukannya proses pengindeksan (Listing 4.4.1).
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
50
double timeStart = (double) System.nanoTime();
double timeFinish;
double time;
Listing 4.4.1. Variabel pencatat waktu pengindeksan
Sebelum melakukan proses pengindeksan, akan dilakukan terlebih dahulu
pengecekan terhadap status pemanggilan method startIndexingProcess(Object[ ],
String, String, String, int), hal ini dikarenakan terdapat dua jenis status pemanggilan
yaitu “start” atau “continue”. Apabila satus pemanggilan adalah “start” maka
Hashtable yang digunakan merupakan Hashtable yang baru sedangkan bila tidak,
maka Hashtable yang digunakan merupakan Hashtable sebelumnya (Lisitng 4.4.2).
//pengecekan status pengindeksan apakah permulaan atau sambungan
if (status.equalsIgnoreCase("start")) {
wordCount=0;
koleksiArrayList = (ArrayList<Koleksi>[])
Array.newInstance(ArrayList.class, jumlahBucket);
for (int i = 0; i < jumlahBucket; i++) {
koleksiArrayList[i] = new ArrayList<Koleksi>(); } }
Listing 4.4.2. Pengecekan status pemanggilan method
Kemudian akan mulai dilakukan pengisian setiap kata kedalam Hashtable
yang telah disediakan. Pada awalnya akan dihitung mixing code dengan mixing step
PJWHash (Listing 4.4.3).
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
51
mixingCode = 0;
mixingCode=MS.PJWHash(word);
Listing 4.6.3. Penentuan mixing step
Mixing code yang diperoleh dapat berupa nilai negatif yang tidak dapat
digunakan dalam perhitungan menggunakan Hash function sehingga harus diubah
kedalam bentuk positif (Listing 4.4.4).
mixingCode=Math.abs(mixingCode);
Listing 4.4.4. Pengubahan Mixing code negatif menjadi positif
Kemudian tahap selanjutnya adalah menghitung Hash code menggunakan
salah satu dari kedua Hash function yang digunakan dalam penelitian sesuai
parameter yang dimasukkan (Listing 4.4.5).
int hashCode;
if (hashMethod.equalsIgnoreCase("division")) {
//division method
hashCode = (int) (mixingCode % this.getJumlahBucket());
//end division method
} else {
//multiplication method
hashCode = (int) (this.getJumlahBucket() * ((mixingCode * knuth) % 1));
//end multiplication method }
Listing 4.6.5. Penghitungan Hash code
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
52
Setelah Hash code diperoleh, maka dilakukan pengisian kata bersangkutan
kedalam Hash table yang disediakan. Kata (word) yang akan dimasukkan dibentuk
kedalam sebuah objek dari kelas Koleksi. Proses ini dapat dilihat pada listing 4.4.6
dibawah ini.
boolean isIdBukuFind = false;
boolean isWordFind = false;
int posisiKataInHashTable = 0;
for (int j = 0; j < this.getKoleksiArrayList()[hashCode].size(); j++) {
if
(this.getKoleksiArrayList()[hashCode].get(j).getKata().equalsIgnoreCase((String)
hasilStemmingIndonesia[i])) {
isWordFind = true;
posisiKataInHashTable = j;
for (int k = 0; k <
this.getKoleksiArrayList()[hashCode].get(j).getIdBuku().size(); k++) {
if
(this.getKoleksiArrayList()[hashCode].get(j).getIdBuku().get(k).equalsIgnoreCase(id
Buku)) {
isIdBukuFind = true;
this.getKoleksiArrayList()[hashCode].get(j).getJumlahKataDalamBuku().set(k,
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
53
this.getKoleksiArrayList()[hashCode].get(j).getJumlahKataDalamBuku().get(k) + 1);
break; } }
break; } }
if (!isWordFind) {
wordCount++;
Koleksi temp = new Koleksi();
temp.setKata((String) hasilStemmingIndonesia[i]);
temp.getIdBuku().add(idBuku);
temp.getJumlahKataDalamBuku().add(1);
this.getKoleksiArrayList()[hashCode].add(temp);
} else if (!isIdBukuFind) {
koleksiArrayList[hashCode].get(posisiKataInHashTable).getIdBuku().add(idBuku);
koleksiArrayList[hashCode].get(posisiKataInHashTable).getJumlahKataDalamBuku(
).add(1); }
Listing 4.4.6. Pengisian objek koleksi kedalam Hash table
Setelah semua kata (word) telah diisikan kedalam Hash table maka akan
dicatat waktu selesainya proses pengindeksan yang dilakukan dan menampilkan
hasilnya berupa lama pemprosesan (waktu selesai - waktu mulai). Hal ini dapat
dilihat pada Listing 4.4.7.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
54
timeFinish = (double) System.nanoTime();
time = ((double) (timeFinish - timeStart)) / 1000000000;
System.out.println("Start time indexing HashTable : " + timeStart);
System.out.println("Finish time indexing HashTable : " + timeFinish);
System.out.println("Total time use : " + time);
System.out.println("Total words created in HashTable : " + wordCount);
Listing 4.4.7. Pencatatan dan perhitungan total waktu pengindeksan
Selain melakukan proses pengindeksan, sistem pengujian juga
memungkinkan untuk menyimpan HashTable yang telah terbentuk kedalam bentuk
sebuah file .txt (file text) sebagai bentuk penyimpanan permanen. Proses
penyimpanan ini dilakukan dengan memanggil method saveIndexHashTable(String).
public void saveIndexHashTable(String namaFile) {
double timeStart = (double) System.nanoTime();
double timeFinish;
double time;
FileWriter fw = null;
try {
String lokasiSaveHashTable = workSpace + namaFile;
fw = new FileWriter(lokasiSaveHashTable);
BufferedWriter bw = new BufferedWriter(fw);
bw.write(String.valueOf(getJumlahBucket()));
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
55
bw.newLine();
for (int i = 0; i < getJumlahBucket(); i++) {
bw.write(String.valueOf(koleksiArrayList[i].size()));
bw.newLine();
for (int j = 0; j < koleksiArrayList[i].size(); j++) {
bw.write(koleksiArrayList[i].get(j).getKata());
bw.newLine();
bw.write(String.valueOf(koleksiArrayList[i].get(j).getIdBuku().size()));
bw.newLine();
for (int k = 0; k < koleksiArrayList[i].get(j).getIdBuku().size(); k++) {
bw.write(koleksiArrayList[i].get(j).getIdBuku().get(k));
bw.newLine();
bw.write(String.valueOf(koleksiArrayList[i].get(j).getJumlahKataDalamBuku().get(k
)));
bw.newLine(); } } }
bw.close();
} catch (IOException ex) {
Logger.getLogger(IndexingProcess.class.getName()).log(Level.SEVERE,
null, ex);
} finally {
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
56
try {
fw.close();
} catch (IOException ex) {
Logger.getLogger(IndexingProcess.class.getName()).log(Level.SEVERE,
null, ex); } }
timeFinish = (double) System.nanoTime();
time = ((double) (timeFinish - timeStart)) / 1000000000;
System.out.println("Start time Save HashTable : " + timeStart);
System.out.println("Finish time Save HashTable : " + timeFinish);
System.out.println("Total time use : " + time); }
Listing 4.5. Penyimpanan hasil indeks
Sistem pengujian juga dapat mengambil dan membentuk sebuah indeks
melalui sebuah file .txt (file text). Hal ini dapat dilakukan dengan memanggil method
loadIndexHashTable(String).
public void loadIndexHashTable(String namaFile) {
double timeStart = (double) System.nanoTime();
double timeFinish;
double time;
FileReader fr = null;
wordCount=0;
try {
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
57
String lokasiLoadHashTable = workSpace + namaFile;
fr = new FileReader(lokasiLoadHashTable);
BufferedReader br = new BufferedReader(fr);
String jumlahBucket = "";
try {
//baca jumlahBucket
jumlahBucket = br.readLine();
this.setJumlahBucket(Integer.parseInt(jumlahBucket));
//selesai baca jumlahBucket
//buat koleksiArrayList baru dari hasil Load sesuai jumlahBucket
setKoleksiArrayList((ArrayList<Koleksi>[])
Array.newInstance(ArrayList.class, this.getJumlahBucket()));
for (int i = 0; i < this.getJumlahBucket(); i++) {
koleksiArrayList[i] = new ArrayList<Koleksi>(); }
//selesai buat koleksiArrayList baru dari hasil Load sesuai jumlahBucket
for (int i = 0; i < this.getJumlahBucket(); i++) {
//baca jumlah Koleksi dari bucket i
String jumlahKoleksi = br.readLine();
//for untuk jumlah Koleksi
for (int j = 0; j < Integer.parseInt(jumlahKoleksi); j++) {
Koleksi koleksi = new Koleksi();
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
58
wordCount++;
String kata = br.readLine();
koleksi.setKata(kata);
String jumlahKoleksiUntukKata = br.readLine();
for (int k = 0; k < Integer.parseInt(jumlahKoleksiUntukKata); k++) {
String idBuku = br.readLine();
koleksi.getIdBuku().add(idBuku);
String jumlahKataDalamBuku = br.readLine();
koleksi.getJumlahKataDalamBuku().add(Integer.parseInt(jumlahKataDalamBuku));
}
koleksiArrayList[i].add(koleksi); } }
} catch (IOException ex) {
Logger.getLogger(IndexingProcess.class.getName()).log(Level.SEVERE,
null, ex); }
} catch (FileNotFoundException ex) {
Logger.getLogger(IndexingProcess.class.getName()).log(Level.SEVERE,
null, ex);
} finally {
try {
fr.close();
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
59
} catch (IOException ex) {
Logger.getLogger(IndexingProcess.class.getName()).log(Level.SEVERE,
null, ex); } }
timeFinish = (double) System.nanoTime();
time = ((double) (timeFinish - timeStart)) / 1000000000;
System.out.println("Start time Load HashTable : " + timeStart);
System.out.println("Finish time Load HashTable : " + timeFinish);
System.out.println("Total time use : " + time);
System.out.println("Total words loaded in HashTable : " + wordCount); }
Listing 4.6. Pembuatan indeks dari file text
Terdapat juga method untuk melakukan proses penyimpanan LOG dari
indeks HashTable yang telah terbentuk baik melalui proses indexing maupun proses
pembacaan hasil indeks dari sebuah file teks. Method ini akan menyimpan panjang
chain pada tiap bucket didalam HashTable dan menunjukkan statistik persebaran data
didalam HashTable itu sendiri. Proses ini dilaksanakan dengan memanggil method
saveLOGHashTable(String).
public void saveLOGHashTable(String namaFile) {
double timeStart = (double) System.nanoTime();
double timeFinish;
double time;
FileWriter fw = null;
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
60
try {
String lokasiSaveLOG = getWorkSpace() + namaFile;
fw = new FileWriter(lokasiSaveLOG);
BufferedWriter bw = new BufferedWriter(fw);
int total = 0;
double average = 0;
double standardDeviation = 0;
double varians = 0;
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
for (int i = 0; i < this.getJumlahBucket(); i++) {
int ukuranChain = this.getKoleksiArrayList()[i].size();
//menulis kedalam LOG
bw.write(String.valueOf(ukuranChain));
bw.write("\t");
for (int j = 0; j < ukuranChain; j++) {
bw.write("-"); }
bw.newLine();
//selesai menulis kedalam LOG
total = total + ukuranChain;
if (ukuranChain > max) {
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
61
max = ukuranChain; }
if (ukuranChain < min) {
min = ukuranChain; } }
average = total / jumlahBucket;
//perhitungan standar deviasi
double totalKuadrat = 0;
for (int i = 0; i < jumlahBucket; i++) {
int ukuranChain = this.getKoleksiArrayList()[i].size();
totalKuadrat = totalKuadrat + (Math.pow((ukuranChain - average), 2));
}
varians = totalKuadrat / jumlahBucket;
standardDeviation = Math.sqrt((totalKuadrat / jumlahBucket));
//selesai perhitungan standar deviasi
bw.newLine();
bw.write("Total Hash Bucket=" + this.getKoleksiArrayList().length);
bw.newLine();
bw.write("Total=" + total);
bw.newLine();
bw.write("Max=" + max);
bw.newLine();
bw.write("Min=" + min);
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
62
bw.newLine();
bw.write("Average=" + average);
bw.newLine();
bw.write("Varians=" + varians);
bw.newLine();
bw.write("Standar Deviasi=" + standardDeviation);
bw.newLine();
//tambahan
int counterZeroBucket=0;
int
counterSector1=0,counterSector2=0,counterSector3=0,counterSector4=0,counterSect
or5=0;
double sector1=0,sector2=0,sector3=0,sector4=0,sector5=0;
double sizeOfEachSector=((double)max/5);
sector1=(sizeOfEachSector*1);
sector1=Double.parseDouble(String.format("%.5g%n",sector1));
sector2=(sizeOfEachSector*2);
sector2=Double.parseDouble(String.format("%.5g%n",sector2));
sector3=(sizeOfEachSector*3);
sector3=Double.parseDouble(String.format("%.5g%n",sector3));
sector4=(sizeOfEachSector*4);
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
63
sector4=Double.parseDouble(String.format("%.5g%n",sector4));
sector5=(sizeOfEachSector*5);
sector5=Double.parseDouble(String.format("%.5g%n",sector5));
for (int i = 0; i < this.getKoleksiArrayList().length; i++) {
if (this.getKoleksiArrayList()[i].size()==0) {
counterZeroBucket++;
}else if (this.getKoleksiArrayList()[i].size()<sector1) {
counterSector1++;
}else if (this.getKoleksiArrayList()[i].size()<sector2) {
counterSector2++;
}else if (this.getKoleksiArrayList()[i].size()<sector3) {
counterSector3++;
}else if (this.getKoleksiArrayList()[i].size()<sector4) {
counterSector4++;
}else if (this.getKoleksiArrayList()[i].size()<=sector5) {
counterSector5++; } }
double
emptyBucket=(double)(((double)counterZeroBucket)/((double)this.getKoleksiArrayL
ist().length))*100;
double filledBucket=(double)((((double)this.getKoleksiArrayList().length)-
((double)counterZeroBucket))/((double)this.getKoleksiArrayList().length))*100;
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
64
bw.write("Empty Bucket (%) =" + emptyBucket);
bw.newLine();
bw.write("Filled Bucket (%) =" + filledBucket);
bw.newLine();
bw.write("Sector 1 : 0<=x< " + sector1+" ="+counterSector1);
bw.newLine();
bw.write("Sector 2 : "+(sector1-1)+"<x< " + sector2+" ="+counterSector2);
bw.newLine();
bw.write("Sector 3 : "+(sector2-1)+"<x< " + sector3+" ="+counterSector3);
bw.newLine();
bw.write("Sector 4 : "+(sector3-1)+"<x< " + sector4+" ="+counterSector4);
bw.newLine();
bw.write("Sector 5 : "+(sector4-1)+"<x<= " + sector5+" ="+counterSector5);
bw.newLine();
//tambahan
bw.newLine();
//persiapan data excel
for (int i = 0; i < jumlahBucket; i++) {
bw.write(String.valueOf(this.getKoleksiArrayList()[i].size()));
bw.newLine(); }
//selesai persiapan data excel
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
65
bw.close();
} catch (IOException ex) {
Logger.getLogger(IndexingProcess.class.getName()).log(Level.SEVERE,
null, ex);
} finally {
try {
fw.close();
} catch (IOException ex) {
Logger.getLogger(IndexingProcess.class.getName()).log(Level.SEVERE,
null, ex); } }
timeFinish = (double) System.nanoTime();
time = ((double) (timeFinish - timeStart)) / 1000000000;
System.out.println("Start time LOG HashTable : " + timeStart);
System.out.println("Finish time LOG HashTable : " + timeFinish);
System.out.println("Total time use : " + time); }
Listing 4.7. Penyimpanan LOG HashTable
Berikut akan ditunjukkan hasil implementasi dari algoritma mixxing step
PJWHash yang digunakan dalam sistem pengujian yang dibangun :
public class MixingStep {
public long PJWHash(String input) {
char[] key = input.toCharArray();
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
66
long val = 0;
for (int i = 0; i < key.length; i++) {
long tmp;
val = ((val << 4) + (key[i]));
if ((tmp = (val & 0xf0000000)) != 0) {
val = (val ^ (tmp >> 24));
val = (val ^ tmp); } }
val=val& 0xffffffffL;
return val; }}
Listing 4.8. PJWHash
4.1.3. Implementasi Searching
Setelah indeks terbentuk, maka dilanjutkan dengan pengujian pencarian data
koleksi. Pengujian pencarian data koleksi ini dapat dilakukan dengan memanggil
method searchInHashTable(String). Pencarian data koleksi dapat dilakukan dengan
memasukkan parameter berupa 1 kata atau lebih sekaligus. Dengan memasukkan kata
pencarian berjumlah lebih dari 1 kata, maka akan dimunculkan juga hasil pencarian
dengan operasi pencarian AND yang akan mendaftarkan idBuku yang memiliki
semua kata yang digunakan dalam pencarian bersangkutan. Berikut hasil
implementasi dari method searchInHashTable(String).
public void searchInHashTable(String keyWords, String hashMethod, int
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
67
mixingStepTipe) {
String[] keywordArray = keyWords.split(" ");
Object[] stopwordRemoval = preProcessing.stopwordRemoval(keywordArray);
Object[] stemmingIndonesia = preProcessing.stemming(stopwordRemoval);
String word;
long mixingCode;
ArrayList<Koleksi> andSearch=new ArrayList<Koleksi>();
for (int i = 0; i < stemmingIndonesia.length; i++) {
String keyWord = (String) stemmingIndonesia[i];
MixingStep MS = new MixingStep();
mixingCode = 0;
word = ((String) stemmingIndonesia[i]);
//perhitungan waktu mulai pencarian menggunakan HashTable
double timeStart = (double) System.nanoTime();
double timeFinish=0;
double time;
//perhitungan waktu mulai pencarian menggunakan HashTable
mixingCode=MS.PJWHash(word);
int hashCode;
if (hashMethod.equalsIgnoreCase("division")) {
//division method
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
68
hashCode = (int) (mixingCode % this.koleksiArrayList.length);
//end division method
} else {
//multiplication method
hashCode = (int) (this.koleksiArrayList.length * ((mixingCode * knuth) %
1));
//end multiplication method
}
//proses pencarian dengan menggunakan hashCode
boolean isFindInHashTable = false;
ArrayList<Koleksi> bucket = this.getKoleksiArrayList()[hashCode];
for (int j = 0; j < bucket.size(); j++) {
if (bucket.get(j).getKata().equalsIgnoreCase(keyWord)) {
timeFinish = (double) System.nanoTime();
System.out.println("\nBuku yang mengandung keyWord : " + keyWord +
", berhasil ditemukan di " + bucket.get(j).getIdBuku().size() + " koleksi.");
andSearch.add(this.getKoleksiArrayList()[hashCode].get(j));
System.out.println("\nBuku yang mengandung keyWord : " + keyWord +
", berhasil ditemukan : \n");
for (int k = 0; k <
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
69
this.getKoleksiArrayList()[hashCode].get(j).getIdBuku().size(); k++) {
String idBuku =
this.getKoleksiArrayList()[hashCode].get(j).getIdBuku().get(k);
int jumlahKataDalamBuku =
this.getKoleksiArrayList()[hashCode].get(j).getJumlahKataDalamBuku().get(k);
isFindInHashTable = true;
System.out.println("ID Buku : " + idBuku + " --- Jumlah kata : " +
jumlahKataDalamBuku); }
isFindInHashTable = true;
break; } }
if (!isFindInHashTable) {
timeFinish = (double) System.nanoTime();
System.out.println("\nBuku yang mengandung keyWord : " + keyWord + ",
gagal ditemukan.");
}
//selesai proses pencarian dengan menggunakan hashCode
}
if (andSearch.size()==stemmingIndonesia.length) {
int positionOfSmallestSumOfBookID=Integer.MAX_VALUE;
for (int i = 0; i < andSearch.size(); i++) {
int sumOfBookID=andSearch.get(i).getIdBuku().size();
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
70
if (sumOfBookID<=positionOfSmallestSumOfBookID) {
positionOfSmallestSumOfBookID=i; } }
Koleksi temp=new Koleksi();
Koleksi selectedKoleksi=andSearch.get(positionOfSmallestSumOfBookID);
temp.setKata(selectedKoleksi.getKata());
temp.setIdBuku(selectedKoleksi.getIdBuku());
temp.setJumlahKataDalamBuku(selectedKoleksi.getJumlahKataDalamBuku());
andSearch.set(positionOfSmallestSumOfBookID, andSearch.get(0));
andSearch.set(0, temp);
ArrayList<String> listOfBookID=andSearch.get(0).getIdBuku();
boolean find=true;
for (int i = 0; i < listOfBookID.size(); i++) {
find=true;
String idBuku="";
ArrayList<Integer> frek=new ArrayList<Integer>();
idBuku=andSearch.get(0).getIdBuku().get(i);
frek.add(andSearch.get(0).getJumlahKataDalamBuku().get(i));
for (int j = 1; j < andSearch.size(); j++) {
if (!andSearch.get(j).getIdBuku().contains(listOfBookID.get(i))) {
find=false;
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
71
break;
}else{
int index=andSearch.get(j).getIdBuku().indexOf(listOfBookID.get(i));
frek.add(andSearch.get(j).getJumlahKataDalamBuku().get(index));
} }
if (find) {
System.out.println("Hasil pencarian AND didapat pada koleksi :
"+idBuku+" dengan rincian : ");
for (int j = 0; j < andSearch.size(); j++) {
System.out.println("Kata "+andSearch.get(j).getKata()+" ditemukan
sebanyak : "+frek.get(j)+" buah.");
} } }
}else{
System.out.println("Hasil pencarian AND, tidak berhasil ditemukan.");
} }
Listing 4.9. Pencarian data koleksi
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
72
BAB V
HASIL PENGUJIAN DAN ANALISA
Pada bagian ini, penulis akan memaparkan hasil dan analisa dari penelitian
yang telah dilakukan. Hasil penelitian yang diperoleh berupa hasil pengukuran
pengujian yang telah dirancang sebelumnya yaitu : Pengujian waktu pemrosesan
Index, Pengujian sumber daya memori, Pengujian persebaran data didalam Hash
table, dan Pengujian waktu pencarian. Pengujian dilaksanakan pada sebuah komputer
dengan spesifikasi :
1. Processor : Intel Core2Duo E7200 @ 2,53GHz
2. Operating System : Windows 7 Ultimate Edition 32-bit
3. Memory : 2GB kit Dual Channel DDR2-800
4. Harddisk : 250GB Sata SEAGATE 7200rpm
5.1. Hasil Pengujian
Dengan memproses data-data E-book ke dalam sistem pengujian yang telah
dibangun, maka diperoleh beberapa jenis hasil pengukuran yang dapat dipaparkan
sebagai berikut.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
73
5.1.1. Hasil Pengujian Waktu Pemrosesan Index
Berikut merupakan hasil pengukuran waktu pemrosesan atau pembentukan
indeks berupa Hash Table. Pengukuran waktu didapatkan melalui pencatatan waktu
saat memasuki blok program PreProcessing dan Indexing. Pengukuran waktu
diujikan kepada 4 jenis ukuran Hash Table yaitu 383, 1531, 6143, dan 24571 buckets.
Masing-masing ukuran Hash table yang digunakan merupakan bilangan prima
dengan posisi paling jauh dari perpangkatan 2 ( contoh : 2x ) terdekatnya.
Tabel 5.1. Hasil Pengukuran Waktu Pembentukan Indeks
Hash FunctionUkuran Hash Table
(Bucket)
Waktu
Pembentukan
(Second)
Rerata Waktu
Pembentukan
(Second)
Division
Method
383 218,538
212,9241531 211,422
6143 210,544
24571 211,192
Knuth’s
Multiplication
Method
383 219,072
213,3631531 212,220
6143 211,167
24571 210,993
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
74
5.1.2. Hasil Pengujian Sumber Daya Memori
Berikut merupakan hasil pengukuran jumlah sumberdaya memori ( RAM )
yang digunakan dalam pembentukan indeks berupa Hash table. Pengukuran jumlah
memori juga diukur mulai dari baris program dimulainya PreProcessing sampai
selesainya Indexing. Ukuran Hash table yang digunakan sama dengan ukuran saat
pengukuran waktu pembentukan indeks.
Tabel 5.2. Hasil Pengukuran Jumlah Memori Pembentukan Indeks
Hash functionUkuran Hash Table
(Bucket)
Pengunaan Memori
(Bytes)
Rerata Penggunaan
Memori
(Bytes)
Division
Method
383 304215
305226,2501531 305431
6143 305533
24571 305726
Knuth’s
Multiplication
Method
383 324007
325310,0001531 324537
6143 324620
24571 328076
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
75
5.1.3. Hasil Pengujian Persebaran Data dalam Hash Table
Berikut akan ditampilkan hasil pengukuran terhadap persebaran data di
dalam Hash table yang telah terbentuk saat proses Indexing. Grafik persebaran data
akan ditampilkan untuk masing-masing jenis ukuran Hash table bagi kedua jenis
Hash function. Sumbu x akan merepresentasikan jumlah bucket, sedangkan sumbu y
akan merepresentasikan panjang chain di dalam bucket x.
5.1.3.1. Grafik Persebaran Division Method ( 383 Bucket )
Data-data yang diperoleh dari pengukuran persebarannya adalah sebagai
berikut :
Total Hash Bucket=383
Total=174141
Max=523
Min=365
Average=454.0
Varians=459.1357702349869
Standar Deviasi=21.42745365728245
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
76
Gambar 5.1. Grafik Persebaran Data untuk Division Method dengan
ukuran 383 Bucket
5.1.3.2. Grafik Persebaran Knuth’s Multiplication Method ( 383 Bucket )
Data-data yang diperoleh dari pengukuran persebarannya adalah sebagai
berikut :
Total Hash Bucket=383
Total=174141
Max=517
Min=394
Average=454.0
Varians=450.54046997389037
Standar Deviasi=21.225938612317957
0
100
200
300
400
500
600
1 17 33 49 65 81 97 113
129
145
161
177
193
209
225
241
257
273
289
305
321
337
353
369
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
77
Gambar 5.2. Grafik Persebaran Data untuk Knuth’s Multiplication
Method dengan ukuran 383 Bucket
5.1.3.3. Grafik Persebaran Division Method ( 1531 Bucket )
Data-data yang diperoleh dari pengukuran persebarannya adalah sebagai
berikut :
Total Hash Bucket=1531
Total=174141
Max=156
Min=80
Average=113.0
Varians=115.0907903331156
Standar Deviasi=10.728037580709513
0
100
200
300
400
500
600
1 17 33 49 65 81 97 113
129
145
161
177
193
209
225
241
257
273
289
305
321
337
353
369
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
78
Gambar 5.3. Grafik Persebaran Data untuk Division Method dengan
ukuran 1531 Bucket
5.1.3.4. Grafik Persebaran Knuth’s Multiplication Method ( 1531 Bucket )
Data-data yang diperoleh dari pengukuran persebarannya adalah sebagai
berikut :
Total Hash Bucket=1531
Total=174141
Max=153
Min=80
Average=113.0
Varians=119.54147615937296
Standar Deviasi=10.933502465329807
0
20
40
60
80
100
120
140
160
180
1 63 125
187
249
311
373
435
497
559
621
683
745
807
869
931
993
1055
1117
1179
1241
1303
1365
1427
1489
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
79
Gambar 5.4. Grafik Persebaran Data untuk Knuth’s Multiplication
Method dengan ukuran 1531 Bucket
5.1.3.5. Grafik Persebaran Division Method ( 6143 Bucket )
Data-data yang diperoleh dari pengukuran persebarannya adalah sebagai
berikut :
Total Hash Bucket=6143
Total=174141
Max=52
Min=8
Average=28.0
Varians=37.2985511964838
Standar Deviasi=6.107253981658516
0
20
40
60
80
100
120
140
160
180
1 63 125
187
249
311
373
435
497
559
621
683
745
807
869
931
993
1055
1117
1179
1241
1303
1365
1427
1489
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
80
Gambar 5.5. Grafik Persebaran Data untuk Division Method dengan
ukuran 6143 Bucket
5.1.3.6. Grafik Persebaran Knuth’s Multiplication Method ( 6143 Bucket )
Data-data yang diperoleh dari pengukuran persebarannya adalah sebagai
berikut :
Total Hash Bucket=6143
Total=174141
Max=49
Min=10
Average=28.0
Varians=30.230343480384178
Standar Deviasi=5.498212753284851
0
10
20
30
40
50
60
123
847
571
294
911
8614
2316
6018
9721
3423
7126
0828
4530
8233
1935
5637
9340
3042
6745
0447
4149
7852
1554
5256
8959
26
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
81
Gambar 5.6. Grafik Persebaran Data untuk Knuth’s Multiplication
Method dengan ukuran 6143 Bucket
5.1.3.7. Grafik Persebaran Division Method ( 24571 Bucket )
Data-data yang diperoleh dari pengukuran persebarannya adalah sebagai
berikut :
Total Hash Bucket=24571
Total=174141
Max=21
Min=0
Average=7.0
Varians=7.760205119856741
Standar Deviasi=2.785714472062193
0
10
20
30
40
50
60
123
847
571
294
911
8614
2316
6018
9721
3423
7126
0828
4530
8233
1935
5637
9340
3042
6745
0447
4149
7852
1554
5256
8959
26
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
82
Gambar 5.7. Grafik Persebaran Data untuk Division Method dengan
ukuran 24571 Bucket
5.1.3.8. Grafik Persebaran Knuth’s Multiplication Method ( 24571 Bucket )
Data-data yang diperoleh dari pengukuran persebarannya adalah sebagai
berikut :
Total Hash Bucket=24571
Total=174141
Max=23
Min=0
Average=7.0
Varians=7.8245085670098895
Standar Deviasi=2.797232304798779
0
5
10
15
20
25
194
718
9328
3937
8547
3156
7766
2375
6985
1594
6110
407
1135
312
299
1324
514
191
1513
716
083
1702
917
975
1892
119
867
2081
321
759
2270
523
651
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
83
Gambar 5.8. Grafik Persebaran Data untuk Knuth’s Multiplication
Method dengan ukuran 24571 Bucket
5.1.4. Hasil Pengujian Waktu Pencarian
Hasil pengukuran waktu pencarian diperoleh melalui pencatatan waktu saat
mulai memasuki perhitungan nilai Mixing code sampai dengan saat kata pencarian
dinyatakan berhasil ditemukan atau tidak. Hasil pengukuran yang didapat merupakan
hasil pengujian pencarian sebanyak 3 kali percobaan dengan jumlah kata yang
berbeda-beda pada jenis dan panjang Hash table yang berbeda pula.. Dibawah ini
merupakan kata-kata pencarian yang diujikan pada tiap percobaan :
1. Information retrieval system
2. Indexing with hash table for fast response of searching algorithms
3. (digunakan kata-kata pada percobaan ke-2 diulang sebanyak 50 kali)
0
5
10
15
20
25
194
718
9328
3937
8547
3156
7766
2375
6985
1594
6110
407
1135
312
299
1324
514
191
1513
716
083
1702
917
975
1892
119
867
2081
321
759
2270
523
651
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
84
Berikut merupakan hasil pengukuran waktu pencarian koleksi dari semua
Hash table yang telah dibentuk.
Tabel 5.3. Hasil Pengukuran Pengujian Waktu Pencarian pada Hash Function :
Division Method
Ukuran
Hash TablePercobaan 1 (detik) Percobaan 2 (detik) Percobaan 3 (detik)
383 9.084376799E-4 9.34064249E-4 0.0022670964
1531 9.362226801E-4 9.29634159E-4 0.00134765628
6143 9.423990602E-4 9.14977659E-4 0.001301803179
24571 9.446706401E-4 8.65114782E-4 0.0012255131396
Rerata 9.3293252E-04 9.1094771E-04 1.5355172E-03
Tabel 5.4. Hasil Pengukuran Pengujian Waktu Pencarian pada Hash Function :
Knuth’s Multiplication Method
Ukuran
Hash TablePercobaan 1 (detik) Percobaan 2 (detik) Percobaan 3 (detik)
383 9.302807201E-4 9.538864796E-4 0.01725547134
1531 9.4178454E-4 9.464168206E-4 0.00489826128
6143 9.8573804E-4 9.289469799E-4 0.002084532436
24571 9.330537395E-4 9.161983798E-4 0.001406702802
Rerata 9.4771426E-04 9.3636216E-04 6.4112420E-03
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
85
5.2. Analisa Hasil Pengujian
Pada bagian ini akan dijabarkan hasil analisa penulis terhadap hasil-hasil
yang didapat dari masing-masing aspek yang diujikan.
5.2.1. Analisa Pengujian Waktu Pemrosesan Indeks
Dalam melakukan pengujian pemrosesan indeks ini, beberapa variabel
pengujian telah dikendalikan sedemikian rupa agar tidak turut mempengaruhi waktu
pembentukan indeks. beberapa variabel yang dikendalikan seperti spesifikasi
perangkat keras pelaksanaan pengujian, kondisi mesin saat dilakukannya pengujian,
dan jumlah koleksi Perpustakaan yang digunakan.
Dari hasil pengujian, dapat diketahui bahwa rata-rata waktu yang dibutuhkan
proses pembentukan Indeks menggunakan Division Method sedikit lebih banyak
(212,924 detik) dibandingkan dengan menggunakan Knuth’s Multiplication Method
(213,363 detik). Hal ini berarti bahwa Knuth’s Multiplication Method bekerja dengan
lebih cepat dan lebih efisien (0.205 %) dalam penggunaan sumber daya processor
untuk melakukan perhitungan Hash code. Perbedaan yang sangat kecil ini dapat
disebabkan karena kondisi mesin yang tidak selalu sama dari waktu ke waktu.
Keduanya dapat dikatakan bekerja sama cepat. Hal ini dapat dilihat melalui gambar
5.9 berikut ini :
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
86
Gambar 5.9. Grafik Perbandingan Waktu Pembentukan Hash Table
5.2.2. Analisa Pengujian Sumber Daya Memori
Hasil pengujian menunjukkan penggunaan memori (RAM) pada proses
pembentukan indeks dengan Knuth’s Multiplication Method ( 325310,000 bytes)
sebagai Hash function lebih banyak dibanding menggunakan Division method (
305226,250 bytes)sebagai Hash function. Keduanya memiliki selisih penggunaan
memori sebesar ( 20083.75 ) yaitu 6.174%. Jika ditinjau dari sisi matematis program,
Knuth’s Multiplication Method menggunakan lebih banyak operasi perhitungan
dibandingkan dengan Division method. Akan tetapi, perbedaan jumlah pembentukan
chain didalam hash table juga turut mempengaruhi penggunaan memori (RAM). Hal
ini dapat dilihat pada gambar 5.10 berikut ini :
206,000
208,000
210,000
212,000
214,000
216,000
218,000
220,000
383 buckets 1531 buckets 6143 buckets 24571 buckets
Wak
tu P
rose
s ( D
etik
)
Jumlah Bucket
division
multiplication
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
87
Gambar 5.10. Grafik Perbandingan Penggunaan Memori
5.2.3. Analisa Pengujian Persebaran Data dalam Hash Table
Menurut data Hashtable yang terbentuk, pada Hashtable dengan ukuran
1531 dan 24571 didapat hasil standar deviasi yang lebih kecil pada Division method,
sedangkan ukuran 383 dan 6143 Knuth’s multiplication method memiliki standar
deviasi yang lebih kecil. Jika ditinjau dari sisi program, Division method merupakan
Hash function yang lebih sederhana daripada Knuth’s multiplication method, dan
diperkirakan bahwa Knuth’s multiplication method akan memberikan hasil
persebaran data yang lebih baik.
Apabila dilihat dari hasil pengujian persebaran data dalam Hash table pada
grafik 5.1 sampai dengan grafik 5.8, dapat dilihat bahwa Knuth’s multiplication
290000
295000
300000
305000
310000
315000
320000
325000
330000
383 buckets 1531 buckets 6143 buckets 24571 buckets
Jum
lah
Peng
guna
an M
emor
i ( M
Byte
)
Jumlah Bucket
division
multiplication
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
88
method memiliki persebaran data yang lebih merata dibanding persebaran data pada
Division method. Walaupun Knuth’s multiplication method memiliki persebaran data
yang lebih merata didalam Hash table, kedua metode tersebut memiliki standar
deviasi persebaran data yang hampir sama. Gambar 5.15 dibawah ini akan
menunjukkan perbandingan standar deviasi persebaran data dari kedua metode :
Gambar 5.15. Grafik Perbandingan Standar Deviasi Persebaran Data dalam
Hash Table
5.2.4. Analisa Pengujian Waktu Pencarian
Berdasarkan hasil pengukuran pada tabel 5.5 dan 5.6 untuk percobaan 1 dan
2, Division method membutuhkan rata-rata waktu pencarian sebesar 9.3293252E-04
detik dan 9.1094771E-04 detik, sedangkan Knuth’s multiplication method
membutuhkan waktu sebesar 9.4771426E-04 detik dan 9.3636216E-04 detik. Dengan
0
5
10
15
20
25
383 buckets 1531 buckets 6143 buckets 24571 buckets
Stan
dar D
evia
si
Jumlah Bucket
division
multiplication
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
89
demikian, terdapat perbedaan masing-masing sebesar sebesar 0.0000147817 detik dan
0.0000254144 detik antara kedua method. Sehingga hal ini dapat diartikan bahwa
Division method lebih cepat sebanyak 1.5597 % dan 2.7142 % dari waktu yang
dibutuhkan Knuth’s multiplication method.
Akan tetapi, untuk hasil pengukuran waktu pencarian pada percobaan 3,
didapatkan perbedaan waktu pencarian yang digunakan keduanya semakin besar.
Untuk percobaan 3 kedua method memiliki perbedaan waktu pencarian mencapai
0.0048757248 detik (76.0496 %). Hal tersebut berarti bahwa semakin besar data yang
digunakan pada pencarian maka semakin besar perbedaan waktu pencarian yang
dibutuhkan oleh kedua method.
Hal ini dapat disebabkan karena letak kata yang dicari berada dalam posisi
chain yang berbeda dalam hash table yang terbentuk menggunakan kedua hash
function. Jadi, terdapat kemungkinan bahwa kata-kata query yang diujikan,
merupakan worst case bagi hash table yang terbentuk menggunakan hash function :
Knuth’s multiplication method dan merupakan best case pada hash table yang
terbentuk menggunakan hash function : Division method. Permasalahan ini muncul
karena pengambilan sample kata query yang mungkin tidak mewakili semua kriteria
koleksi atau dengan kata lain, perlu dilakukan percobaan dengan memasukkan kata
query berupa semua kata yang terdapat dalam hash table dan waktu pencarian yang
dibutuhkan dihitung rata-ratanya.
Terdapat juga faktor lain yang mungkin mempengaruhi waktu pencarian
kedua metode seperti dengan menggunakan data pencarian yang banyak, akan
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
90
dilakukan lebih banyak perhitungan Hash code pada Knuth’s multiplication method
sehingga menghasilkan waktu pencarian yang lebih lama.
Data-data pencatatan terhadap persebaran data dari hasil pembentukan hash
table dengan menggunakan kedua hash function dapat dilihat sebagai berikut :
Tabel 5.5. Tabel Persebaran Data kedua Hash Function
Hash
FunctionInformation
383
buckets
1531
buckets
6143
buckets
24571
buckets
Division
Method
Max. chain 523 156 52 21
Min. chain 365 80 8 0
Load Factor 454 113 28 7
Varians 459.13577 115.09079 37.29855 7.76020
Standard deviation 21.42745 10.72803 6.10725 2.78571
Empty buckets (%) 0.0 0.0 0.0 0.13837
Filled buckets (%) 100.0 100.0 100.0 99.86162
Knuth’s
Multiplication
Method
Max. chain 517 153 49 23
Min. chain 394 80 10 0
Load Factor 454 113 28 7
Varians 450.54046 119.54147 30.23034 7.82450
Standard deviation 21.22593 10.93350 5.49821 2.79723
Empty buckets (%) 0.0 0.0 0.0 0.14244
Filled buckets (%) 100.0 100.0 100.0 99.85755
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
91
Dengan asumsi bahwa semakin banyak bucket yang berhasil diisi dan
semakin merata panjang chain yang terbentuk (semakin mengecilnya standar
deviasi), maka semakin cepat pencarian dapat dilakukan. Dapat dilihat pada table 5.5,
bahwa pengukuran Max. chain dan Min. chain untuk ukuran hash table 383, 1531,
dan 6143 buckets, Knuth’s multiplication method memiliki rentang yang lebih kecil
dibandingkan Division method. Akan tetapi pada ukuran hash table 24571 buckets,
Division method memiliki rentang yang lebih kecil untuk pengukuran Max dan Min
chain.
Untuk pengukuran standar deviasi pada ukuran hash table sebesar 383 dan
6143 buckets, Division method memiliki standar deviasi yang lebih besar
dibandingkan dengan Knuth’s multiplication method. Namun untuk ukran hash table
sebesar 1531 dan 24571 buckets, Division method memiliki standar deviasi yang
lebih kecil. Keduanya bisa dikatakan hampir sama karena salah satu hash function
mengungguli hash function lainnya pada ukuran hash table tertentu dana begitu juga
sebaliknya.
Untuk pengukuran persentase jumlah bucket yang terisi dan bucket yang
kosong, dapat dilihat bahwa untuk ukuran hash table sebesar 383, 1531, dan 6143
bucket kedua hash function memiliki hasil yang sama yaitu 0% untuk bucket yang
kosong dan 100% untuk bucket yang terisi. Sedangkan untuk pengukuran pada
ukuran hash table sebesar 24571 buckets, dapat dilihat bahwa persentase jumlah
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
92
bucket kosong pada Knuth’s multiplication method lebih besar dibandingkan dengan
Division method.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
93
BAB VI
KESIMPULAN DAN SARAN
6.1. Kesimpulan
Melalui penelitian yang telah dilakukan, dapat diambil beberapa kesimpulan
sebagai berikut :
1. Division method memiliki waktu proses pembuatan indeks pada Hash table
yang hampir sama dengan Knuth’s multiplication method.
2. Knuth’s multiplication method menggunakan sumber daya memori komputer
yang lebih banyak jika dibandingkan dengan Division method.
3. Persebaran data dalam Hash table lebih merata dengan menggunakan
Knuth’s multiplication method tetapi memiliki standar deviasi yang hampir
sama dengan Division method.
4. Untuk pengukuran waktu pencarian pada hash table, digunakan hasil
pengukuran pola persebaran data pada bucket dan variasi panjang chain yang
terbentuk dengan aturan semakin banyak bucket yang tidak kosong dan
semakin kecil standar deviasi panjang chain, maka semakin cepat sebuah
pencarian data dapat dilakukan. Hasil pengujian dapat dijabarkan sebagai
berikut :
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
94
a. Knuth’s multiplication method memiliki selisih antara Max. chain dan
Min. chain yang lebih kecil dibandingkan selisih pada Division method
untuk ukuran hash table : 383, 1531, dan 6143 buckets.
b. Kedua hash function memiliki standar deviasi persebaran data yang
hampir sama satu dengan yang lainnya.
c. Division method memiliki persentase jumlah bucket kosong yang lebih
kecil pada ukuran hash table : 24571 buckets dibandingkan dengan
Knuth’s multiplication method.
6.2. Saran
1. Pengembangan pengujian dengan jumlah koleksi yang lebih besar.
2. Membandingkan kinerja kedua metode Hash table dengan Java Hash table.
3. Melakukan pengujian waktu pencarian yang lebih akurat.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
95
DAFTAR PUSTAKA
Agusta, L.2009. Perbandingan Algoritma Stemming Porter Dengan Algoritma Nazief
dan Adriani Untuk Stemming Dokumen Teks Bahasa Indonesia. Konferensi
Nasional Sistem dan Informatika 2009. Bali.
Aho, Alfred V., Sethi Ravi, Ullman, Jeffrey D. 1986. Compilers : Priciples,
Techniques, and Tools. Pearson Education. China. page 435-436.
Bobby, A., A. Nazief, dan Mirna Adriani. 1996. Confix Stripping: Approach to
Stemming Algorithm for Bahasa Indonesia. Internal publication. Faculty of
Computer Science, University of Indonesia, Depok.
Borko, Harold. 1977. Toward a Theory of Indexing, information Processing and
Management Vol.13. Pergamon Press. page 355-365
Cormen, Thomas H. 1990. Introduction to Algorithms Second Edition. Massachusetts
Institute of Technology Press. page 201.
Indonesia. Undang-Undang Nomor 43 Tahun 2007 tentang Perpustakaan.
Kowalski, Gerald. 2011. Information Retrieval Architexture and Algorithms. Springer
Science+Business Media. page 29-32.
Kowalski, G.J, Maybury, M.T. 2002. Information Storage and Retrieval Systems :
Theory and Implementation, second edition”. Kluwer Academic Publishers.
page 83.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
96
Kruse, Robert L., Ryba, Alexander J. 1998. Data Structures and Program Design in
C++. Prentice Hall. page 406-407.
Loudon, Kyle. 1999. “Mastering Algorithms With C”. O’Reilly Media, Inc. page
153-158.
Manning, Christopher D. Prabhakar Raghavan & Hinrich Schütze. 2008.
“Introduction to Information Retrieval”. Cambridge University Press. page
23-24.
McKenzie, B.J., Harries, R., and Bell, T.C.. 1990.“Selecting a hashing algorithm,”
Software Practice and Experience 20. 209–224.
Porter, M. F. 1980. An Algorithm for Suffix Stripping. Computer Laboratory. Corn
Exchange Street. Cambridge
Rijsbergen, C. J. van. 1979. “Information Retrieval”. Information Retrieval Group.
University of Glasglow. page 6-7.
Schimd.H. 2008. Tokenizing and Part-of-Speech Tagging in Corpus Linguistics : An
International handbook. Walter de Gruyter GmbH & Co. Berlin, Germany.
page 527-552
Yates, Ricardo Baeza & Neto, Berthier Ribeiro. 1992. Modern Information Retrieval
: The Concepts and Technology Behind Search. ACM Press Book.
Whitten, Bentley Dittman. 2004. Sistem Analysis and Design Method 6th Edition,
Irwin/McGraw-Hill, New York.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
97
LAMPIRAN
Lampiran 1 Listing PreProcessing
package skripsi;import com.itextpdf.text.pdf.PdfReader;import com.itextpdf.text.pdf.parser.ImageRenderInfo;import com.itextpdf.text.pdf.parser.PdfTextExtractor;import com.itextpdf.text.pdf.parser.TextExtractionStrategy;import com.itextpdf.text.pdf.parser.TextRenderInfo;import com.sun.org.apache.xalan.internal.xsltc.runtime.Hashtable;import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.io.IOException;import java.util.ArrayList;import java.util.Dictionary;import java.util.ArrayList;import java.util.logging.Level;import java.util.logging.Logger;/**** @author Lie_Lianx*/
public class PreProcessing {Hashtable kamusHash;Hashtable kamusStopWordHash;Hashtable kamusStopWordEngHash;PdfReader reader;Stemmer porterStemmer;public PreProcessing() {
//permulaan membaca daftar kata dari kamus .txtdouble timeStart = (double) System.nanoTime();String str;String kamus = "";String[] kamusArray = new String[0];kamusHash = new Hashtable();kamusStopWordHash = new Hashtable();kamusStopWordEngHash = new Hashtable();try {
BufferedReader in = new BufferedReader(new FileReader("G:\\Skripsi\\pustaka\\Stopword n stemming\\kamus.txt"));while ((str = in.readLine()) != null) {
str=str.substring(0, (str.length()-1));kamusHash.put(str, str);
}in.close();
} catch (IOException e) {}try {
BufferedReader in = new BufferedReader(new FileReader("G:\\Skripsi\\pustaka\\Stopword n stemming\\stopword.txt"));while ((str = in.readLine()) != null) {
kamusStopWordHash.put(str, str);}in.close();in.close();
} catch (IOException e) {}
// //permulaan membaca daftar stopwords english dari sebuah .txtString stopwordsEng = "";String[] stopwordsEngArray = new String[0];
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
98
try {BufferedReader in = new BufferedReader(new FileReader("G:\\Skripsi\\pustaka\\Stopword n
stemming\\stopwordeng.txt"));while ((str = in.readLine()) != null) {
stopwordsEng = str;}stopwordsEngArray = stopwordsEng.split(",");for (int i = 0; i < stopwordsEngArray.length; i++) {
kamusStopWordEngHash.put(stopwordsEngArray[i], stopwordsEngArray[i]);}in.close();
} catch (IOException e) {}double timeFinish = (double) System.nanoTime();double time = ((double) (timeFinish - timeStart)) / 1000000000;System.out.println("Start time read dictionary : " + timeStart);System.out.println("Finish time read dictionary : " + timeFinish);System.out.println("Total time use : " + time);
}
public Object[] stemming(Object[] hasilStopwordRemoval) {double timeStart = (double) System.nanoTime();char[] sequenceWord;porterStemmer = new Stemmer();ArrayList<String> hasilStemming = new ArrayList<String>();//proses stemming dimulaiString rootWord = "";for (int i = 0; i < hasilStopwordRemoval.length; i++) {
sequenceWord = ((String) hasilStopwordRemoval[i]).toCharArray();porterStemmer.add(sequenceWord, sequenceWord.length);porterStemmer.stem();rootWord = porterStemmer.toString().toLowerCase();
hasilStemming.add(rootWord);}//perhitungan waktu proses stemmingdouble timeFinish = (double) System.nanoTime();double time = ((double) (timeFinish - timeStart)) / 1000000000;System.out.println("Start time stemming : " + timeStart);System.out.println("Finish time stemming : " + timeFinish);System.out.println("Total time use : " + time);//menampilkan jumlah kata setelah stemmingSystem.out.println("Jumlah kata setelah stemming : " + hasilStemming.size());//mengembalikan hasil data array stemmingreturn hasilStemming.toArray();
}public boolean isInStopWordDictionary(String string) {
string = string.toLowerCase();boolean isInDict = false;String temp = (String) kamusStopWordHash.get(string);if (string.equalsIgnoreCase(temp)) {
isInDict = true;} else {
temp = (String) kamusStopWordEngHash.get(string);if (string.equalsIgnoreCase(temp)) {
isInDict = true; } }return isInDict; }
public boolean isInDictionary(String string) {string = string.toLowerCase();boolean isInDict = false;String temp = (String) kamusHash.get(string);if (string.equalsIgnoreCase(temp)) {
isInDict = true; }return isInDict; }
public Object[] stopwordRemoval(Object[] dataEkstraksi) {
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
99
double timeStart = (double) System.nanoTime();String checkedData;ArrayList<String> hasilStopWordRemoval = new ArrayList<String>();//permulaan pengecekan dan penghapusan stopwords dengan data hasil Ektraksifor (int i = 0; i < dataEkstraksi.length; i++) {
checkedData = (String) dataEkstraksi[i];if (isInStopWordDictionary(checkedData) || checkedData.equals ("") || checkedData.length() <= 2 ||
checkedData.contains(" ")) {} else {
hasilStopWordRemoval.add(checkedData); } }//perhitungan waktu proses stopwordsRemoval
double timeFinish = (double) System.nanoTime();double time = ((double) (timeFinish - timeStart)) / 1000000000;System.out.println("Start time stopword Removal : " + timeStart);System.out.println("Finish time stopword Removal : " + timeFinish);System.out.println("Total time use : " + time);//menampilkan jumlah kata setelah stopword removalSystem.out.println("Jumlah kata setelah stopword removal : " + hasilStopWordRemoval.size());//mengembalikan hasil data array stopword removalreturn hasilStopWordRemoval.toArray(); }
public Object[] bacaDocument(String bookSource) {double timeStart = (double) System.nanoTime();String inputFile = bookSource;Object[] dataTextArray = null;ArrayList<String> dataTextVector = new ArrayList<String>();try {
reader = new PdfReader(inputFile);// System.out.println(reader.getNumberOfPages());
int numberOfPages = reader.getNumberOfPages();// System.out.println("page"+numberOfPages);
//dimulai pengulangan untuk ektraksi kata pada tiap halamanString dataText = "";
// for (int i = 0; i < numberOfPages - (numberOfPages - 5); i++) {for (int i = 0; i < numberOfPages; i++) {
//perubahan for menjadi pendek// dataText = dataText.concat(PdfTextExtractor.getTextFromPage(reader, i + 1));
dataText = PdfTextExtractor.getTextFromPage(reader, i + 1);// System.out.println(dataText.length());
dataText = dataText.replaceAll("[^a-zA-Z0-9]", " ");dataText = dataText.replaceAll(" ", " ");dataText = dataText.replaceAll(" ", " ");dataText = dataText.replaceAll(" ", " ");dataText = dataText.replaceAll(" ", " ");
// System.out.println(dataText);//tokenizing kata menjadi arraydataTextArray = dataText.split(" ");
// System.out.println(dataTextArray.length);for (int j = 0; j < dataTextArray.length; j++) {
dataTextArrayList.add(dataTextArray[j].toString()); } }reader.close();
} catch (IOException ex) {Logger.getLogger(PreProcessing.class.getName()).log(Level.SEVERE, null, ex); }
//perhitungan waktu pemrosesan ektraksi katadouble timeFinish = (double) System.nanoTime();double time = ((double) (timeFinish - timeStart)) / 1000000000;System.out.println("Start time extraction : " + timeStart);System.out.println("Finish time extraction : " + timeFinish);System.out.println("Total time use : " + time);//menampilkan hasil panjang array keseluruhan kata dari semua halamanSystem.out.println("Jumlah keseluruhan array kata : " + dataTextVector.size());//mengembalikan hasil ekstraksidataTextArray = dataTextVector.toArray();return dataTextArray; }
public static void main(String[] args) {
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
100
PreProcessing preProcess = new PreProcessing();Object[] hasilStopwordRemoval = {"pentingnya"};Object[] hasilStemming = preProcess.stemming(hasilStopwordRemoval);System.out.println(""+(String)hasilStemming[0]); }}
Lampiran 2 Listing IndexingProcess
package skripsi;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.io.InputStreamReader;import java.lang.reflect.Array;import java.util.ArrayList;import java.util.logging.Level;import java.util.logging.Logger;import javax.naming.spi.DirectoryManager;import skripsi.Koleksi;/**** @author Lie_Lianx*/
public class IndexingProcess {
private ArrayList<Koleksi>[] koleksiArrayList;private int jumlahBucket;private String workSpace;GeneralHashFunctionLibrary ghfl = new GeneralHashFunctionLibrary();int wordCount;double knuth;public IndexingProcess() {
knuth=((double)(((Math.sqrt(5))) - 1) / 2); }public IndexingProcess(int jumlahBucket) {
this.jumlahBucket = jumlahBucket; }/*** @param jumlahBucket the jumlahBucket to set*/
public void setJumlahBucket(int jumlahBucket) {this.jumlahBucket = jumlahBucket; }
/*** @return the jumlahBucket*/
public int getJumlahBucket() {return jumlahBucket; }
/*** @param koleksiArrayList the koleksiArrayList to set*/
public void setKoleksiArrayList(ArrayList<Koleksi>[] koleksiArrayList) {this.koleksiArrayList = koleksiArrayList; }
/*** @return the koleksiArrayList*/
public ArrayList<Koleksi>[] getKoleksiArrayList() {return koleksiArrayList; }
public static void main(String[] args) {// //comment jika LOAD
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
101
// PreProcessing preProcess = new PreProcessing();// //comment jika LOAD
IndexingProcess indexingProcess = new IndexingProcess();indexingProcess.setWorkSpace("C:\\Users\\Lie_Lianx\\Desktop\\TA\\finish4\\try1\\");
//// comment jika LOAD//// indexingProcess.setJumlahBucket(193);//// indexingProcess.setJumlahBucket(383);//// indexingProcess.setJumlahBucket(769);//// indexingProcess.setJumlahBucket(1531);//// indexingProcess.setJumlahBucket(3067);//// indexingProcess.setJumlahBucket(6143);//// indexingProcess.setJumlahBucket(12289);//// indexingProcess.setJumlahBucket(24571);//// indexingProcess.setJumlahBucket(49157);//// indexingProcess.setJumlahBucket(98299);//// String hashMethod;// int mixingStepCode;// boolean skip = true;//// //book source// String bookSource = "G:\\Skripsi\\pustaka\\E-Book\\training_ready\\ebook";//// String bookSource = "H:\\ROY BACKUP\\Skripsi\\Stopword_stemming";// //end of book source//// //akses buku didalam folder// File dir = new File(bookSource);// String[] bookName = dir.list();//// System.out.println(bookName.length);// //selesai akses buku didalam folder//// Object[] dataEkstraksi;//// ArrayList<String> dataEkstraksi2;// Object[] hasilStopwordRemoval;// Object[] hasilStemming;//// //memulai perulangan untuk semua mixingStep yang ada// for (int j = 1; j < 5; j++) {// mixingStepCode = j;// //memulai perulangan untuk 2 jenis Hash Function// for (int k = 0; k < 2; k++) {// if (k == 0) {// hashMethod = "division";// } else {// hashMethod = "multiplication";// }////// System.out.println("Total Memory Allowed : " + Runtime.getRuntime().totalMemory());//// System.out.println("Max Memory Allowed : " + Runtime.getRuntime().maxMemory());//// System.out.println("Free Memory before GC : " + Runtime.getRuntime().freeMemory());//// System.gc();//// System.out.println("Free Memory after GC : " + Runtime.getRuntime().freeMemory());//// //mulai menghitung waktu proses dan free memory// double timeStart = (double) System.nanoTime();//// System.gc();// long freeMemoryStart = Runtime.getRuntime().freeMemory();//// //mulai perulangan sebanyak file buku yang ada di dalam folder// //bookCount untuk menghitung jumlah yg merupakan buku di dalam folder source// int bookCount = 0;// for (int i = 0; i < bookName.length; i++) {// if (bookName[i].endsWith(".pdf")) {// bookCount++;
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
102
// //preprocessing data// System.out.println(i + "-->" + bookSource + "\\" + bookName[i]);// dataEkstraksi = preProcess.bacaDocument(bookSource + "\\" + bookName[i]);//// dataEkstraksi2 = preProcess.bacaDocument2(bookSource + "\\" + bookName[i]);// hasilStopwordRemoval = preProcess.stopwordRemoval(dataEkstraksi);// dataEkstraksi = null;//// for (int l = 0; l < hasilStopwordRemoval.length; l++) {//// System.out.println(hasilStopwordRemoval[l]);//// }// // Object[] hasilStopwordRemoval = {"seseorang"};// hasilStemming = preProcess.stemming(hasilStopwordRemoval);// hasilStopwordRemoval = null;// //selesai preprocessing data//// //mulai proses indexing// String idBuku = "buku " + bookCount;// if (bookCount == 1) {// indexingProcess.startIndexingProcess(hasilStemming, "start", idBuku, hashMethod, mixingStepCode);// } else {// indexingProcess.startIndexingProcess(hasilStemming, "continue", idBuku, hashMethod, mixingStepCode);// }// hasilStemming = null;// //selesai proses indexing// }// }// //selesai perulangan untuk semua buku dalam folder////// //hitung free memory setelah process// long freeMemoryFinish = Runtime.getRuntime().freeMemory();//////// comment jika LOAD//// if (!skip) {//////// //save HashTable// indexingProcess.saveIndexHashTable("HashTableEBooks_" + hashMethod + "_" + mixingStepCode + "_" +indexingProcess.getJumlahBucket() + ".txt");//// //selesai save HashTable
//selingan jika Hash berasal dari LOAD// System.out.println(indexingProcess.getKoleksiArrayList().length);
indexingProcess.loadIndexHashTable("HashTableEBooks_division_1_383.txt");// System.out.println(indexingProcess.getKoleksiArrayList()[0].get(3).getKata());// System.out.println(indexingProcess.getKoleksiArrayList().length);
//selesai selingan jika Hash berasal dari LOAD//// //catat LOG// indexingProcess.saveLOGHashTable("LOGHashTableEBooks_" + hashMethod + "_" + mixingStepCode + "_" +indexingProcess.getJumlahBucket() + ".txt");//// //selesai catat LOG
//proses searchtry {
double timeStart = 0;double timeFinish = 0;double time;boolean cont = true;String searchWord;BufferedReader br = new BufferedReader(new InputStreamReader(System.in));searchingProcess search = new searchingProcess(indexingProcess.getKoleksiArrayList());while (cont) {
System.out.print("\n\nMasukkan kata yang ingin dicari : ");searchWord = br.readLine();if (!searchWord.equalsIgnoreCase("xxx")) {
timeStart = (double) System.nanoTime();search.searchInHashTable(searchWord, "division", 1);
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
103
timeFinish = (double) System.nanoTime();time = ((double) (timeFinish - timeStart)) / 1000000000;System.out.println("------------------------------------------------------------------------------------------------------");System.out.println("Start time All Search HashTable : " + timeStart);System.out.println("Finish time All Search HashTable : " + timeFinish);System.out.println("Total time use for All search : " + time);System.out.println("------------------------------------------------------------------------------------------------------");
} else {cont = false;
}System.gc();
}System.gc();
} catch (Exception e) {System.out.println("Error reading Input!!");
}//selesai proses search
// //comment jika LOAD// double timeFinish = (double) System.nanoTime();// double time = ((double) (timeFinish - timeStart)) / 1000000000;// System.out.println("Start time ALL (" + hashMethod + "_" + mixingStepCode + ") : " + timeStart);// System.out.println("Finish time ALL (" + hashMethod + "_" + mixingStepCode + ") : " + timeFinish);// System.out.println("Total time use ALL (" + hashMethod + "_" + mixingStepCode + ") : " + time);////// System.out.println("Max Memory Allowed : " + Runtime.getRuntime().maxMemory());// System.out.println("Free Memory start process : " + freeMemoryStart + " bytes");// System.out.println("Free Memory finish process : " + freeMemoryFinish + " bytes");// System.out.println("Memory used for process : " + ((long) (freeMemoryFinish - freeMemoryStart)) + " bytes");// System.out.println("Free Memory before GC : " + Runtime.getRuntime().freeMemory() + " bytes");// System.gc();// System.out.println("Free Memory after GC : " + Runtime.getRuntime().freeMemory() + " bytes");//////// //untuk skip//// }else{//// skip=false;//// j--;//// }////// //comment jika LOAD// }// if (skip) {// skip = false;// j--;// }// }// //comment jika LOAD
}public void saveIndexHashTable(String namaFile) {
double timeStart = (double) System.nanoTime();double timeFinish;double time;FileWriter fw = null;try {
String lokasiSaveHashTable = getWorkSpace() + namaFile;fw = new FileWriter(lokasiSaveHashTable);BufferedWriter bw = new BufferedWriter(fw);bw.write(String.valueOf(getJumlahBucket()));bw.newLine();for (int i = 0; i < getJumlahBucket(); i++) {
bw.write(String.valueOf(koleksiArrayList[i].size()));bw.newLine();
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
104
for (int j = 0; j < koleksiArrayList[i].size(); j++) {bw.write(koleksiArrayList[i].get(j).getKata());bw.newLine();bw.write(String.valueOf(koleksiArrayList[i].get(j).getIdBuku().size()));bw.newLine();for (int k = 0; k < koleksiArrayList[i].get(j).getIdBuku().size(); k++) {
bw.write(koleksiArrayList[i].get(j).getIdBuku().get(k));bw.newLine();bw.write(String.valueOf(koleksiArrayList[i].get(j).getJumlahKataDalamBuku().get(k)));bw.newLine(); } } }
bw.close();} catch (IOException ex) {
Logger.getLogger(IndexingProcess.class.getName()).log(Level.SEVERE, null, ex);} finally {
try {fw.close();
} catch (IOException ex) {Logger.getLogger(IndexingProcess.class.getName()).log(Level.SEVERE, null, ex);
} }timeFinish = (double) System.nanoTime();time = ((double) (timeFinish - timeStart)) / 1000000000;System.out.println("Start time Save HashTable : " + timeStart);System.out.println("Finish time Save HashTable : " + timeFinish);System.out.println("Total time use : " + time); }
public void loadIndexHashTable(String namaFile) {double timeStart = (double) System.nanoTime();double timeFinish;double time;FileReader fr = null;wordCount = 0;try {
String lokasiLoadHashTable = getWorkSpace() + namaFile;fr = new FileReader(lokasiLoadHashTable);BufferedReader br = new BufferedReader(fr);String jumlahBucket = "";try {
//baca jumlahBucketjumlahBucket = br.readLine();this.setJumlahBucket(Integer.parseInt(jumlahBucket));//selesai baca jumlahBucket
//buat koleksiArrayList baru dari hasil Load sesuai jumlahBucketsetKoleksiArrayList((ArrayList<Koleksi>[]) Array.newInstance(ArrayList.class, this.getJumlahBucket()));for (int i = 0; i < this.getJumlahBucket(); i++) {
koleksiArrayList[i] = new ArrayList<Koleksi>();}//selesai buat koleksiArrayList baru dari hasil Load sesuai jumlahBucketfor (int i = 0; i < this.getJumlahBucket(); i++) {
//baca jumlah Koleksi dari bucket iString jumlahKoleksi = br.readLine();//for untuk jumlah Koleksifor (int j = 0; j < Integer.parseInt(jumlahKoleksi); j++) {
Koleksi koleksi = new Koleksi();wordCount++;String kata = br.readLine();koleksi.setKata(kata);String jumlahKoleksiUntukKata = br.readLine();for (int k = 0; k < Integer.parseInt(jumlahKoleksiUntukKata); k++) {
String idBuku = br.readLine();koleksi.getIdBuku().add(idBuku);String jumlahKataDalamBuku = br.readLine();koleksi.getJumlahKataDalamBuku().add(Integer.parseInt(jumlahKataDalamBuku)); }
koleksiArrayList[i].add(koleksi); } }} catch (IOException ex) {
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
105
Logger.getLogger(IndexingProcess.class.getName()).log(Level.SEVERE, null, ex);} finally {
try {br.close();
} catch (IOException ex) {Logger.getLogger(IndexingProcess.class.getName()).log(Level.SEVERE, null, ex); }
}} catch (FileNotFoundException ex) {
Logger.getLogger(IndexingProcess.class.getName()).log(Level.SEVERE, null, ex);} finally {
try {fr.close();
} catch (IOException ex) {Logger.getLogger(IndexingProcess.class.getName()).log(Level.SEVERE, null, ex); }
}timeFinish = (double) System.nanoTime();time = ((double) (timeFinish - timeStart)) / 1000000000;System.out.println("Start time Load HashTable : " + timeStart);System.out.println("Finish time Load HashTable : " + timeFinish);System.out.println("Total time use : " + time);System.out.println("Total words loaded in HashTable : " + wordCount); }
public void startIndexingProcess(Object[] hasilStemmingIndonesia, String status, String idBuku, String hashMethod, intmixingStepTipe) {
double timeStart = (double) System.nanoTime();double timeFinish;double time;//pengecekan status pengindeksan apakah permulaan atau sambunganif (status.equalsIgnoreCase("start")) {
wordCount = 0;koleksiArrayList = (ArrayList<Koleksi>[]) Array.newInstance(ArrayList.class, jumlahBucket);for (int i = 0; i < jumlahBucket; i++) {
koleksiArrayList[i] = new ArrayList<Koleksi>();} }
//mulai meletakkan kedalam hash table perkatalong mixingCode;String word;for (int i = 0; i < hasilStemmingIndonesia.length; i++) {
word = ((String) hasilStemmingIndonesia[i]);mixingCode = 0;mixingCode=MS.PJWHash(word);//penghilangan angka negatifmixingCode = Math.abs(mixingCode);int hashCode;if (hashMethod.equalsIgnoreCase("division")) {
//division methodhashCode = (int) (mixingCode % this.getJumlahBucket());//end division method
} else {//multiplication methodhashCode = (int) (this.getJumlahBucket() * ((mixingCode * knuth) % 1));//end multiplication method
}boolean isIdBukuFind = false;boolean isWordFind = false;int posisiKataInHashTable = 0;for (int j = 0; j < this.getKoleksiArrayList()[hashCode].size(); j++) {
if (this.getKoleksiArrayList()[hashCode].get(j).getKata().equalsIgnoreCase((String) hasilStemmingIndonesia[i])) {isWordFind = true;posisiKataInHashTable = j;for (int k = 0; k < this.getKoleksiArrayList()[hashCode].get(j).getIdBuku().size(); k++) {
if (this.getKoleksiArrayList()[hashCode].get(j).getIdBuku().get(k).equalsIgnoreCase(idBuku)) {isIdBukuFind = true;this.getKoleksiArrayList()[hashCode].get(j).getJumlahKataDalamBuku().set(k,
this.getKoleksiArrayList()[hashCode].get(j).getJumlahKataDalamBuku().get(k) + 1);
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
106
break; } }break;
} }if (!isWordFind) {
wordCount++;Koleksi temp = new Koleksi();temp.setKata((String) hasilStemmingIndonesia[i]);temp.getIdBuku().add(idBuku);temp.getJumlahKataDalamBuku().add(1);this.getKoleksiArrayList()[hashCode].add(temp);
} else if (!isIdBukuFind) {koleksiArrayList[hashCode].get(posisiKataInHashTable).getIdBuku().add(idBuku);koleksiArrayList[hashCode].get(posisiKataInHashTable).getJumlahKataDalamBuku().add(1);
} }//selesai meletakkan kedalam hash table perkata// memulai perhitungan waktu HashtimeFinish = (double) System.nanoTime();time = ((double) (timeFinish - timeStart)) / 1000000000;System.out.println("Start time indexing HashTable : " + timeStart);System.out.println("Finish time indexing HashTable : " + timeFinish);System.out.println("Total time use : " + time);System.out.println("Total words created in HashTable : " + wordCount);
}public void saveLOGHashTable(String namaFile) {
double timeStart = (double) System.nanoTime();double timeFinish;double time;FileWriter fw = null;try {
String lokasiSaveLOG = getWorkSpace() + namaFile;fw = new FileWriter(lokasiSaveLOG);BufferedWriter bw = new BufferedWriter(fw);int total = 0;double average = 0;double standardDeviation = 0;double varians = 0;int max = Integer.MIN_VALUE;int min = Integer.MAX_VALUE;for (int i = 0; i < this.getJumlahBucket(); i++) {
int ukuranChain = this.getKoleksiArrayList()[i].size();//menulis kedalam LOGbw.write(String.valueOf(ukuranChain));bw.write("\t");for (int j = 0; j < ukuranChain; j++) {
bw.write("-"); }bw.newLine();//selesai menulis kedalam LOGtotal = total + ukuranChain;if (ukuranChain > max) {
max = ukuranChain; }if (ukuranChain < min) {
min = ukuranChain; } }average = total / jumlahBucket;//perhitungan standar deviasidouble totalKuadrat = 0;for (int i = 0; i < jumlahBucket; i++) {
int ukuranChain = this.getKoleksiArrayList()[i].size();totalKuadrat = totalKuadrat + (Math.pow((ukuranChain - average), 2)); }
varians = totalKuadrat / jumlahBucket;standardDeviation = Math.sqrt((totalKuadrat / jumlahBucket));//selesai perhitungan standar deviasibw.newLine();bw.write("Total Hash Bucket=" + this.getKoleksiArrayList().length);bw.newLine();
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
107
bw.write("Total=" + total);bw.newLine();bw.write("Max=" + max);bw.newLine();bw.write("Min=" + min);bw.newLine();bw.write("Average=" + average);bw.newLine();bw.write("Varians=" + varians);bw.newLine();bw.write("Standar Deviasi=" + standardDeviation);bw.newLine();
//tambahanint counterZeroBucket=0;int counterSector1=0,counterSector2=0,counterSector3=0,counterSector4=0,counterSector5=0;double sector1=0,sector2=0,sector3=0,sector4=0,sector5=0;double sizeOfEachSector=((double)max/5);sector1=(sizeOfEachSector*1);sector1=Double.parseDouble(String.format("%.5g%n",sector1));sector2=(sizeOfEachSector*2);sector2=Double.parseDouble(String.format("%.5g%n",sector2));sector3=(sizeOfEachSector*3);sector3=Double.parseDouble(String.format("%.5g%n",sector3));sector4=(sizeOfEachSector*4);sector4=Double.parseDouble(String.format("%.5g%n",sector4));sector5=(sizeOfEachSector*5);sector5=Double.parseDouble(String.format("%.5g%n",sector5));for (int i = 0; i < this.getKoleksiArrayList().length; i++) {
if (this.getKoleksiArrayList()[i].size()==0) {counterZeroBucket++;
}else if (this.getKoleksiArrayList()[i].size()<sector1) {counterSector1++;
}else if (this.getKoleksiArrayList()[i].size()<sector2) {counterSector2++;
}else if (this.getKoleksiArrayList()[i].size()<sector3) {counterSector3++;
}else if (this.getKoleksiArrayList()[i].size()<sector4) {counterSector4++;
}else if (this.getKoleksiArrayList()[i].size()<=sector5) {counterSector5++;
} }double emptyBucket=(double)(((double)counterZeroBucket)/((double)this.getKoleksiArrayList().length))*100;double filledBucket=(double)((((double)this.getKoleksiArrayList().length)-
((double)counterZeroBucket))/((double)this.getKoleksiArrayList().length))*100;bw.write("Empty Bucket (%) =" + emptyBucket);bw.newLine();bw.write("Filled Bucket (%) =" + filledBucket);bw.newLine();bw.write("Sector 1 : 0<=x< " + sector1+" ="+counterSector1);bw.newLine();bw.write("Sector 2 : "+(sector1-1)+"<x< " + sector2+" ="+counterSector2);bw.newLine();bw.write("Sector 3 : "+(sector2-1)+"<x< " + sector3+" ="+counterSector3);bw.newLine();bw.write("Sector 4 : "+(sector3-1)+"<x< " + sector4+" ="+counterSector4);bw.newLine();bw.write("Sector 5 : "+(sector4-1)+"<x<= " + sector5+" ="+counterSector5);bw.newLine();//tambahanbw.newLine();//persiapan data excelfor (int i = 0; i < jumlahBucket; i++) {
bw.write(String.valueOf(this.getKoleksiArrayList()[i].size()));bw.newLine(); }
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
108
//selesai persiapan data excelbw.close();
} catch (IOException ex) {Logger.getLogger(IndexingProcess.class.getName()).log(Level.SEVERE, null, ex);
} finally {try {
fw.close();} catch (IOException ex) {
Logger.getLogger(IndexingProcess.class.getName()).log(Level.SEVERE, null, ex); } }timeFinish = (double) System.nanoTime();time = ((double) (timeFinish - timeStart)) / 1000000000;System.out.println("Start time LOG HashTable : " + timeStart);System.out.println("Finish time LOG HashTable : " + timeFinish);System.out.println("Total time use : " + time); }
/*** @return the workSpace*/
public String getWorkSpace() {return workSpace; }
/*** @param workSpace the workSpace to set*/
public void setWorkSpace(String workSpace) {this.workSpace = workSpace; }}
Lampiran 3 Listing SearchingProcess
/** To change this template, choose Tools | Templates* and open the template in the editor.*/
package skripsi;
import java.util.ArrayList;
/**** @author Lie_Lianx*/
public class searchingProcess {
private ArrayList<Koleksi>[] koleksiArrayList;private PreProcessing preProcessing;double knuth;
public searchingProcess(ArrayList<Koleksi>[] koleksiArrayList) {this.koleksiArrayList = koleksiArrayList;preProcessing = new PreProcessing();knuth=((double)(((Math.sqrt(5))) - 1) / 2);
}
public void searchInHashTable(String keyWords, String hashMethod, int mixingStepTipe) {String[] keywordArray = keyWords.split(" ");Object[] stopwordRemoval = preProcessing.stopwordRemoval(keywordArray);Object[] stemmingIndonesia = preProcessing.stemming(stopwordRemoval);String word;long mixingCode;ArrayList<Koleksi> andSearch=new ArrayList<Koleksi>();for (int i = 0; i < stemmingIndonesia.length; i++) {
String keyWord = (String) stemmingIndonesia[i];MixingStep MS = new MixingStep();
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
109
mixingCode = 0;word = ((String) stemmingIndonesia[i]);//perhitungan waktu mulai pencarian menggunakan HashTabledouble timeStart = (double) System.nanoTime();double timeFinish=0;double time;//perhitungan waktu mulai pencarian menggunakan HashTablemixingCode=MS.PJWHash(word);int hashCode;if (hashMethod.equalsIgnoreCase("division")) {
//division methodhashCode = (int) (mixingCode % this.koleksiArrayList.length);//end division method
} else {//multiplication methodhashCode = (int) (this.koleksiArrayList.length * ((mixingCode * knuth) % 1));//end multiplication method
}//proses pencarian dengan menggunakan hashCodeboolean isFindInHashTable = false;ArrayList<Koleksi> bucket = this.getKoleksiArrayList()[hashCode];
for (int j = 0; j < bucket.size(); j++) {if (bucket.get(j).getKata().equalsIgnoreCase(keyWord)) {
timeFinish = (double) System.nanoTime();System.out.println("\nBuku yang mengandung keyWord : " + keyWord + ", berhasil ditemukan di " +
bucket.get(j).getIdBuku().size() + " koleksi.");andSearch.add(this.getKoleksiArrayList()[hashCode].get(j));System.out.println("\nBuku yang mengandung keyWord : " + keyWord + ", berhasil ditemukan : \n");for (int k = 0; k < this.getKoleksiArrayList()[hashCode].get(j).getIdBuku().size(); k++) {
String idBuku = this.getKoleksiArrayList()[hashCode].get(j).getIdBuku().get(k);int jumlahKataDalamBuku = this.getKoleksiArrayList()[hashCode].get(j).getJumlahKataDalamBuku().get(k);isFindInHashTable = true;System.out.println("ID Buku : " + idBuku + " --- Jumlah kata : " + jumlahKataDalamBuku);
}isFindInHashTable = true;break;
}}if (!isFindInHashTable) {
timeFinish = (double) System.nanoTime();System.out.println("\nBuku yang mengandung keyWord : " + keyWord + ", gagal ditemukan.");
}//selesai proses pencarian dengan menggunakan hashCode
}if (andSearch.size()==stemmingIndonesia.length) {
int positionOfSmallestSumOfBookID=Integer.MAX_VALUE;for (int i = 0; i < andSearch.size(); i++) {
int sumOfBookID=andSearch.get(i).getIdBuku().size();if (sumOfBookID<=positionOfSmallestSumOfBookID) {
positionOfSmallestSumOfBookID=i;} }
Koleksi temp=new Koleksi();Koleksi selectedKoleksi=andSearch.get(positionOfSmallestSumOfBookID);temp.setKata(selectedKoleksi.getKata());temp.setIdBuku(selectedKoleksi.getIdBuku());temp.setJumlahKataDalamBuku(selectedKoleksi.getJumlahKataDalamBuku());andSearch.set(positionOfSmallestSumOfBookID, andSearch.get(0));andSearch.set(0, temp);ArrayList<String> listOfBookID=andSearch.get(0).getIdBuku();boolean find=true;for (int i = 0; i < listOfBookID.size(); i++) {
find=true;String idBuku="";
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
110
ArrayList<Integer> frek=new ArrayList<Integer>();idBuku=andSearch.get(0).getIdBuku().get(i);frek.add(andSearch.get(0).getJumlahKataDalamBuku().get(i));for (int j = 1; j < andSearch.size(); j++) {
if (!andSearch.get(j).getIdBuku().contains(listOfBookID.get(i))) {find=false;break;
}else{int index=andSearch.get(j).getIdBuku().indexOf(listOfBookID.get(i));frek.add(andSearch.get(j).getJumlahKataDalamBuku().get(index));
} }if (find) {
System.out.println("Hasil pencarian AND didapat pada koleksi : "+idBuku+" dengan rincian : ");for (int j = 0; j < andSearch.size(); j++) {
System.out.println("Kata "+andSearch.get(j).getKata()+" ditemukan sebanyak : "+frek.get(j)+" buah.");} } }
}else{System.out.println("Hasil pencarian AND, tidak berhasil ditemukan.");
} }
/*** @return the koleksiArrayList*/
public ArrayList<Koleksi>[] getKoleksiArrayList() {return koleksiArrayList;
}
/*** @param koleksiArrayList the koleksiArrayList to set*/
public void setKoleksiArrayList(ArrayList<Koleksi>[] koleksiArrayList) {this.koleksiArrayList = koleksiArrayList;
}}
Lampiran 4 Listing Koleksi
package skripsi;import java.util.ArrayList;/**** @author Lie_Lianx*/
public class Koleksi {private String kata;private ArrayList<String> idBuku;private ArrayList<Integer> jumlahKataDalamBuku;public Koleksi(){
kata="";idBuku=new ArrayList<String>();jumlahKataDalamBuku=new ArrayList<Integer>(); }
/*** @return the kata*/
public String getKata() {return kata; }
/*** @param kata the kata to set*/
public void setKata(String kata) {this.kata = kata; }
/**
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
111
* @return the idBuku*/
public ArrayList<String> getIdBuku() {return idBuku; }
/*** @param idBuku the idBuku to set*/
public void setIdBuku(ArrayList<String> idBuku) {this.idBuku = idBuku; }
/*** @return the jumlahKataDalamBuku*/
public ArrayList<Integer> getJumlahKataDalamBuku() {return jumlahKataDalamBuku; }
/*** @param jumlahKataDalamBuku the jumlahKataDalamBuku to set*/
public void setJumlahKataDalamBuku(ArrayList<Integer> jumlahKataDalamBuku) {this.jumlahKataDalamBuku = jumlahKataDalamBuku; } }
Lampiran 5 Listing Stemmer
package skripsi;/**** @author Lie_Lianx*/
/*Porter stemmer in Java. The original paper is in
Porter, 1980, An algorithm for suffix stripping, Program, Vol. 14,no. 3, pp 130-137,
See also http://www.tartarus.org/~martin/PorterStemmer
History:
Release 1
Bug 1 (reported by Gonzalo Parra 16/10/99) fixed as marked below.The words 'aed', 'eed', 'oed' leave k at 'a' for step 3, and b[k-1]is then out outside the bounds of b.
Release 2
Similarly,
Bug 2 (reported by Steve Dyrdahl 22/2/00) fixed as marked below.'ion' by itself leaves j = -1 in the test for 'ion' in step 5, andb[j] is then outside the bounds of b.
Release 3
Considerably revised 4/9/00 in the light of many helpful suggestionsfrom Brian Goetz of Quiotix Corporation ([email protected]).
Release 4
*/import java.io.*;
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
112
/*** Stemmer, implementing the Porter Stemming Algorithm** The Stemmer class transforms a word into its root form. The input* word can be provided a character at time (by calling add()), or at once* by calling one of the various stem(something) methods.*/
class Stemmer {
private char[] b;private int i, /* offset into b */
i_end, /* offset to end of stemmed word */j, k;
private static final int INC = 50;/* unit of size whereby b is increased */
public Stemmer() {b = new char[INC];i = 0;i_end = 0;
}
/*** Add a character to the word being stemmed. When you are finished* adding characters, you can call stem(void) to stem the word.*/
public void add(char ch) {if (i == b.length) {
char[] new_b = new char[i + INC];for (int c = 0; c < i; c++) {
new_b[c] = b[c];}b = new_b;
}b[i++] = ch;
}
/** Adds wLen characters to the word being stemmed contained in a portion* of a char[] array. This is like repeated calls of add(char ch), but* faster.*/
public void add(char[] w, int wLen) {if (i + wLen >= b.length) {
char[] new_b = new char[i + wLen + INC];for (int c = 0; c < i; c++) {
new_b[c] = b[c];}b = new_b;
}for (int c = 0; c < wLen; c++) {
b[i++] = w[c];}
}
/*** After a word has been stemmed, it can be retrieved by toString(),* or a reference to the internal buffer can be retrieved by getResultBuffer* and getResultLength (which is generally more efficient.)*/
public String toString() {return new String(b, 0, i_end);
}
/**
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
113
* Returns the length of the word resulting from the stemming process.*/
public int getResultLength() {return i_end;
}
/*** Returns a reference to a character buffer containing the results of* the stemming process. You also need to consult getResultLength()* to determine the length of the result.*/
public char[] getResultBuffer() {return b;
}
/* cons(i) is true <=> b[i] is a consonant. */private final boolean cons(int i) {
switch (b[i]) {case 'a':case 'e':case 'i':case 'o':case 'u':
return false;case 'y':
return (i == 0) ? true : !cons(i - 1);default:
return true;}
}
/* m() measures the number of consonant sequences between 0 and j. if c isa consonant sequence and v a vowel sequence, and <..> indicates arbitrarypresence,
<c><v> gives 0<c>vc<v> gives 1<c>vcvc<v> gives 2<c>vcvcvc<v> gives 3....*/
private final int m() {int n = 0;int i = 0;while (true) {
if (i > j) {return n;
}if (!cons(i)) {
break;}i++;
}i++;while (true) {
while (true) {if (i > j) {
return n;}if (cons(i)) {
break;}i++;
}
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
114
i++;n++;while (true) {
if (i > j) {return n;
}if (!cons(i)) {
break;}i++;
}i++;
}}
/* vowelinstem() is true <=> 0,...j contains a vowel */private final boolean vowelinstem() {
int i;for (i = 0; i <= j; i++) {
if (!cons(i)) {return true;
}}return false;
}
/* doublec(j) is true <=> j,(j-1) contain a double consonant. */private final boolean doublec(int j) {
if (j < 1) {return false;
}if (b[j] != b[j - 1]) {
return false;}return cons(j);
}
/* cvc(i) is true <=> i-2,i-1,i has the form consonant - vowel - consonantand also if the second c is not w,x or y. this is used when trying torestore an e at the end of a short word. e.g.
cav(e), lov(e), hop(e), crim(e), butsnow, box, tray.
*/private final boolean cvc(int i) {
if (i < 2 || !cons(i) || cons(i - 1) || !cons(i - 2)) {return false;
}{
int ch = b[i];if (ch == 'w' || ch == 'x' || ch == 'y') {
return false;}
}return true;
}
private final boolean ends(String s) {int l = s.length();int o = k - l + 1;if (o < 0) {
return false;}
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
115
for (int i = 0; i < l; i++) {if (b[o + i] != s.charAt(i)) {
return false;}
}j = k - l;return true;
}
/* setto(s) sets (j+1),...k to the characters in the string s, readjustingk. */private final void setto(String s) {
int l = s.length();int o = j + 1;for (int i = 0; i < l; i++) {
b[o + i] = s.charAt(i);}k = j + l;
}
/* r(s) is used further down. */private final void r(String s) {
if (m() > 0) {setto(s);
}}
/* step1() gets rid of plurals and -ed or -ing. e.g.
caresses -> caressponies -> ponities -> ticaress -> caresscats -> cat
feed -> feedagreed -> agreedisabled -> disable
matting -> matmating -> matemeeting -> meetmilling -> millmessing -> mess
meetings -> meet
*/private final void step1() {
if (b[k] == 's') {if (ends("sses")) {
k -= 2;} else if (ends("ies")) {
setto("i");} else if (b[k - 1] != 's') {
k--;}
}if (ends("eed")) {
if (m() > 0) {k--;
}} else if ((ends("ed") || ends("ing")) && vowelinstem()) {
k = j;
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
116
if (ends("at")) {setto("ate");
} else if (ends("bl")) {setto("ble");
} else if (ends("iz")) {setto("ize");
} else if (doublec(k)) {k--;{
int ch = b[k];if (ch == 'l' || ch == 's' || ch == 'z') {
k++;}
}} else if (m() == 1 && cvc(k)) {
setto("e");}
}}
/* step2() turns terminal y to i when there is another vowel in the stem. */private final void step2() {
if (ends("y") && vowelinstem()) {b[k] = 'i';
}}
/* step3() maps double suffices to single ones. so -ization ( = -ize plus-ation) maps to -ize etc. note that the string before the suffix must givem() > 0. */private final void step3() {
if (k == 0) {return;
} /* For Bug 1 */ switch (b[k - 1]) {case 'a':
if (ends("ational")) {r("ate");break;
}if (ends("tional")) {
r("tion");break;
}break;
case 'c':if (ends("enci")) {
r("ence");break;
}if (ends("anci")) {
r("ance");break;
}break;
case 'e':if (ends("izer")) {
r("ize");break;
}break;
case 'l':if (ends("bli")) {
r("ble");break;
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
117
}if (ends("alli")) {
r("al");break;
}if (ends("entli")) {
r("ent");break;
}if (ends("eli")) {
r("e");break;
}if (ends("ousli")) {
r("ous");break;
}break;
case 'o':if (ends("ization")) {
r("ize");break;
}if (ends("ation")) {
r("ate");break;
}if (ends("ator")) {
r("ate");break;
}break;
case 's':if (ends("alism")) {
r("al");break;
}if (ends("iveness")) {
r("ive");break;
}if (ends("fulness")) {
r("ful");break;
}if (ends("ousness")) {
r("ous");break;
}break;
case 't':if (ends("aliti")) {
r("al");break;
}if (ends("iviti")) {
r("ive");break;
}if (ends("biliti")) {
r("ble");break;
}break;
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
118
case 'g':if (ends("logi")) {
r("log");break;
}}
}
/* step4() deals with -ic-, -full, -ness etc. similar strategy to step3. */private final void step4() {
switch (b[k]) {case 'e':
if (ends("icate")) {r("ic");break;
}if (ends("ative")) {
r("");break;
}if (ends("alize")) {
r("al");break;
}break;
case 'i':if (ends("iciti")) {
r("ic");break;
}break;
case 'l':if (ends("ical")) {
r("ic");break;
}if (ends("ful")) {
r("");break;
}break;
case 's':if (ends("ness")) {
r("");break;
}break;
}}
/* step5() takes off -ant, -ence etc., in context <c>vcvc<v>. */private final void step5() {
if (k == 0) {return;
} /* for Bug 1 */ switch (b[k - 1]) {case 'a':
if (ends("al")) {break;
}return;
case 'c':if (ends("ance")) {
break;}
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
119
if (ends("ence")) {break;
}return;
case 'e':if (ends("er")) {
break;}return;
case 'i':if (ends("ic")) {
break;}return;
case 'l':if (ends("able")) {
break;}if (ends("ible")) {
break;}return;
case 'n':if (ends("ant")) {
break;}if (ends("ement")) {
break;}if (ends("ment")) {
break;}/* element etc. not stripped before the m */if (ends("ent")) {
break;}return;
case 'o':if (ends("ion") && j >= 0 && (b[j] == 's' || b[j] == 't')) {
break;}/* j >= 0 fixes Bug 2 */if (ends("ou")) {
break;}return;
/* takes care of -ous */case 's':
if (ends("ism")) {break;
}return;
case 't':if (ends("ate")) {
break;}if (ends("iti")) {
break;}return;
case 'u':if (ends("ous")) {
break;}
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
120
return;case 'v':
if (ends("ive")) {break;
}return;
case 'z':if (ends("ize")) {
break;}return;
default:return;
}if (m() > 1) {
k = j;}
}
/* step6() removes a final -e if m() > 1. */private final void step6() {
j = k;if (b[k] == 'e') {
int a = m();if (a > 1 || a == 1 && !cvc(k - 1)) {
k--;}
}if (b[k] == 'l' && doublec(k) && m() > 1) {
k--;}
}
/** Stem the word placed into the Stemmer buffer through calls to add().* Returns true if the stemming process resulted in a word different* from the input. You can retrieve the result with* getResultLength()/getResultBuffer() or toString().*/
public void stem() {k = i - 1;if (k > 1) {
step1();step2();step3();step4();step5();step6();
}i_end = k + 1;i = 0;
}
/** Test program for demonstrating the Stemmer. It reads text from a* a list of files, stems each word, and writes the result to standard* output. Note that the word stemmed is expected to be in lower case:* forcing lower case must be done outside the Stemmer class.* Usage: Stemmer file-name file-name ...*/
public static void main(String[] args) {char[] w = new char[501];Stemmer s = new Stemmer();for (int i = 0; i < args.length; i++) {
try {FileInputStream in = new FileInputStream(args[i]);
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
121
try {while (true) {
int ch = in.read();if (Character.isLetter((char) ch)) {
int j = 0;while (true) {
ch = Character.toLowerCase((char) ch);w[j] = (char) ch;if (j < 500) {
j++;}ch = in.read();if (!Character.isLetter((char) ch)) {
/* to test add(char ch) */for (int c = 0; c < j; c++) {
s.add(w[c]);}
/* or, to test add(char[] w, int j) *//* s.add(w, j); */
s.stem();{
String u;
/* and now, to test toString() : */u = s.toString();
/* to test getResultBuffer(), getResultLength() : *//* u = new String(s.getResultBuffer(), 0, s.getResultLength()); */
System.out.print(u);}break;
}}
}if (ch < 0) {
break;}System.out.print((char) ch);
}} catch (IOException e) {
System.out.println("error reading " + args[i]);break;
}} catch (FileNotFoundException e) {
System.out.println("file " + args[i] + " not found");break; } } }}
Lampiran 6 Listing PJWHash
/** To change this template, choose Tools | Templates* and open the template in the editor.*/
package skripsi;
/***
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
122
* @author Lie_Lianx*/
public class MixingStep {
public long PJWHash(String input) {char[] key = input.toCharArray();long val = 0;
for (int i = 0; i < key.length; i++) {long tmp;val = ((val << 4) + (key[i]));if ((tmp = (val & 0xf0000000)) != 0) {
val = (val ^ (tmp >> 24));val = (val ^ tmp);
}
}val=val& 0xffffffffL;return val;
}}
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJIPLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI