• Tidak ada hasil yang ditemukan

BAB IV IMPLEMENTASI

4.1. Implementasi Proses

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

dikerjakan dengan memanggil methodstartIndexingProcess(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=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])) {

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);

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 kedalamHashTable

Berikut akan dipaparkan lebih jauh mengenai fungsi-fungsi yang dikerjakan padamethodstartIndexingProcess(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).

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, makaHashtableyang digunakan merupakanHashtablesebelumnya (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

mixingCode = 0;

mixingCode=MS.PJWHash(word);

Listing 4.6.3. Penentuanmixing 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 }

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,

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 kedalamHash 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.

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 memanggilmethodsaveIndexHashTable(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()));

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);

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 sebuahfile .txt (file text). Hal ini dapat dilakukan dengan memanggilmethod

loadIndexHashTable(String).

public void loadIndexHashTable(String namaFile) { double timeStart = (double) System.nanoTime(); double timeFinish;

double time;

FileReader fr = null; wordCount=0; try {

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

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 {

} 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 filetext

Terdapat juga method untuk melakukan proses penyimpanan LOG dari indeks HashTable yang telah terbentuk baik melalui proses indexingmaupun proses pembacaan hasil indeks dari sebuah file teks. Method ini akan menyimpan panjang

chainpada tiap bucket didalamHashTabledan 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;

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) {

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);

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);

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;

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(); }

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 LOGHashTable

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

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

Dokumen terkait