Implementasi Inverted Index IMPLEMENTASI SISTEM

59 is_root_word CHAR 1 Keterangan apakah terms ada di kamus Berikut perintah yang digunakan untuk membuat tabel administrator :

4.3. Implementasi Inverted Index

Dari pemodelan Inverted Index di dalam bab sebelumnya, di dalam struktur Inverted Index pada bagian Ordered Linked List dilakukan sorting pada saat akan menambahkan data sehingga posting dimasukkan secara terurut berdasarkan id document . Setiap data posting baru yang akan ditambahkan dilakukan sequensial search dari indek posisi 0 dengan cara melakukan casting LinkedList ke ListIterator dan menemukan posisi indek yang tepat berdasarkan nomor id dokumen data posting baru dibandingkan dengan id dokumen yang sudah ada di dalam List. Proses sorting pada saat penambahan posting di implementasikan dalam listing code 1 pada method addWord di dalam kelas InvertedIndex. Listing Code 1. Method addWord CREATE TABLE SOURCETERM ID_SOURCETERM INTEGER NOT NULL , WORD VARCHAR2 50 , IS_ROOT_WORD CHAR 1 , ID_TERM INTEGER NOT NULL ; ALTER TABLE SOURCETERM ADD CONSTRAINT SOURCETERM_PK PRIMARY KEY ID_SOURCETERM ; 60 Term freqtambah = getWordlist.getterm; ambil Posting Listnya ListIteratorPosting iteratorPosting = freqtambah.getPostlist.listIterator; selama iterator posting punnya data berikutnya while iteratorPosting.hasNext { jika jurnal_id Jurnal Posting sama dengan jurnal_id dari parameter IfiteratorPosting.next.getJurnal.getJurnal_id==aPost.getJurnal.getJurnal_ id { Posting freqtambahPosting = iteratorPosting.previous; return; } iteratorPosting.previous; if iteratorPosting.next.getJurnal.getJurnal_idaPost.getJurnal.getJurnal_id { tambahkan ke posting ke index sebelum Posting freqtambahPosting = iteratorPosting.previous; iteratorPosting.addaPost; return; } } if iteratorPosting.hasNext { iteratorPosting.addaPost; Posting freqtambahPosting = iteratorPosting.previous; } return; } Untuk melakukan search sistem akan menyaring dan memproses kata kunci masukan dari pengguna kemudian mengakses hashtable Term dengan kata kunci masukan dari pengguna sebagai key . Sistem akan memperoleh sebuah objek Term untuk setiap kata kunci dan melakukan interseksi dengan method AND pada Listing Code 2 antar posting list pada setiap Term dengan mencari id dokumen yang sama . Interseksi akan menghasilkan sebuah posting list baru dengan bobot posting yang sudah diakumulasi untuk setiap posting yang memiliki id dokumen sama pada saat Interseksi. Jumlah term yang memiliki posting list yang harus di interseksikan adalah sama dengan jumlah kata kunci yang dapat ditemukan oleh sistem di dalam Hashtable Term . Posting hasil interseksi terakhir diurutkan dari 61 bobot terbersar hingga bobot terkecil. Listing code untuk pencarian dapat dilihat pada lampiran bagian b. Dalam proses interseksi antara dua term sistem mengambil posting masing-masing term dan melakukan casting ke type objek ListIterator agar dapat dilakukan traversal pada posting . Posting yang memiliki dokumen paling sedikit akan diprioritaskan sebelum posting yang lain. Untuk dapat melakukan traversal di masing-masing posting maka dibuat variabel objek bertipe Posting penunjuk bantu1 dan bantu2. Penunjuk bantu1 dan bantu2 mulai dari indek pertama dan mulai membandingkan id dokumen masing-masing. Jika ditemukan dokumen yang sama maka akan diambil posting keduanya dan mengakumulasikan bobot kedua posting kemudian bantu1 bergeser ke posisi index berikutnya. Jika pada posisi bantu2 yang sedang ditunjuk tidak ditemukan dokumen yang sama, bantu2 akan bergeser ke posisi indek berikutnya hingga ditemukan atau sampai tidak ada lagi indek berikutnya. Hasil posting interseksi dikembalikan dengan bobot terakumulasi. Listing Code 2. Method AND -------method untuk operasi AND-------------- public Term ANDTerm term1, Term term2 { ListIteratorPosting t1; ListIteratorPosting t2; jika term1 mempunyai dokumen lebih sedikit dengan term2 if term1.getPostlist.size term2.getPostlist.size { t1 = term1.getPostlist.listIterator; t2 = term2.getPostlist.listIterator; } else { 62 t1 = term2.getPostlist.listIterator; t2 = term1.getPostlist.listIterator; } Term hasil = new Term + term1.getTerm + AND + term2.getTerm + ; hasil.setDfk0; System.out.println; System.out.printlnKata yang dicari + + term1.getTerm + AND + term2.getTerm + ; System.out.printterm1.getTerm + | + term1.getDfk + | ; menampilkan kata1 for int i = 0; i term1.getPostlist.size; i++ { System.out.printterm1.getPostlist.geti.getJurnal.getJurnal_id + , + term1.getPostlist.geti.getTfik + | ; } System.out.println; menampilkan kata2 System.out.printterm2.getTerm + | + term2.getDfk + | ; for int i = 0; i term2.getPostlist.size; i++ { System.out.printterm2.getPostlist.geti.getJurnal.getJurnal_id + , + term2.getPostlist.geti.getTfik + | ; } System.out.println; AND operator Posting bantu1 = t1.next; membuat bantu1 untuk kata t1.next membuat penunjuk yang digunakan untuk membandingkan dokumen int penunjuk = 0; penunjuk = bantu1.getJurnal.getJurnal_id; Posting bantu2 = t2.next; membuat bantu1 untuk kata t2.next t1.previous; t2.previous; while t1.hasNext { selama t1 mempunyai next jika lokasi dokumen kata2 kedua sama dengan kata1 1 63 if bantu2.getJurnal.getJurnal_id==penunjuk { pengecekan frekuensi yg plg sedikit if bantu2.getTfik bantu1.getTfik { hasil.getPostlist.addbantu1; bantu1.setWbantu1.getW+bantu2.getW; hasil.setDfkhasil.getDfk + bantu1.getWord.getDfk; } else { hasil.getPostlist.addbantu2; bantu2.setWbantu2.getW+bantu1.getW; hasil.setDfkhasil.getDfk + bantu2.getWord.getDfk; } bantu1 = t1.next; bantu1 bergeser ke selanjutnya penunjuk = bantu1.getJurnal.getJurnal_id; jika kata kedua masi mempunyai dokumen if t2.hasNext { bantu2 = t2.next; kata2 kedua akan bergeser jika tidak proses selesai } else { jika lokasi dok kata1 kata2 break if bantu1.getJurnal.getJurnal_idbantu2.getJurnal.getJurnal_id { break; } } jk kt2 puny nok dok penunjuk, kt2 geser } else if bantu2.getJurnal.getJurnal_idpenunjuk { if t2.hasNext { bantu2 = t2.next; kata kedua akan bergeser } jk kata2 puny no dok penunjuk, penunjuk geser } else if bantu2.getJurnal.getJurnal_idpenunjuk { bantu1 = t1.next; kata pertama akan bergeser penunjuk = bantu1.getJurnal.getJurnal_id; 64 } jk t1 tdk puny next if t1.hasNext { System.out.printlnt1.previous+doesnt have next; t1.next; cek bantu1 = bantu2 if bantu1.getJurnal.getJurnal_id==bantu2.getJurnal.getJurnal_id { cek frekuensi bantu2 frekuensi bantu1, tmbhkn bantu1 if bantu2.getTfik bantu1.getTfik { hasil.getPostlist.addbantu1; hasil.setDfkhasil.getDfk + bantu1.getWord.getDfk; bantu1.setWbantu1.getW+bantu2.getW; jk tdk tambhkn bantu2 } else { hasil.getPostlist.addbantu2; hasil.setDfkhasil.getDfk + bantu2.getWord.getDfk; bantu2.setWbantu2.getW+bantu1.getW; } } cek no dok kata1 kata2 if bantu1.getJurnal.getJurnal_idbantu2.getJurnal.getJurnal_id { selama no dok kata1 kata2, t2 geser while bantu1.getJurnal.getJurnal_idbantu2.getJurnal.getJurnal_idt2.hasNext { bantu2 = t2.next; jk nodok kata1 = kata2 if bantu2.getJurnal.getJurnal_id==bantu1.getJurnal.getJurnal_id { jk frek dok kt2 k1, tmbh bantu1 if bantu2.getTfik bantu1.getTfik { hasil.getPostlist.addbantu1; 65 hasil.setDfkhasil.getDfk + bantu1.getWord.getDfk; bantu1.setWbantu1.getW+bantu2.getW; } jk tdk tmbh bantu2 else { hasil.getPostlist.addbantu2; hasil.setDfkhasil.getDfk + bantu2.getWord.getDfk; bantu2.setWbantu2.getW+bantu1.getW; } } } } } } return hasil; }

4.4. Implementasi Antarmuka