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