Spesifikasi Perangkat Lunak dan Perangkat Keras Implementasi Inverted Index

48

BAB IV IMPLEMENTASI SISTEM

4.1. Spesifikasi Perangkat Lunak dan Perangkat Keras

4.1.1. Spesifikasi Perangkat Lunak

Sistem menggunakan spesifikasi beberapa perangkat lunak pendukung untuk implementasi sistem pemrosesan teks dan sistem pencarian makalah ilmiah berbahasa Indonesia sebagai berikut : 1. Sistem operasi: Oracle Linux Server Release 5.8 2. Oracle 11g, 3. Oracle SQL Developer 3.0.04, 4. Java JDK 1.6.0 dan OODBC 5. Netbeans 6.9.1 6. Browser : Mozilla Firefox

4.1.2. Spesifikasi Perangkat Keras

Spesifikasi perangkat keras yang digunakan untuk implementasi sistem pemrosesan teks dan sistem pencarian makalah ilmiah berbahasa Indonesia adalah sebagai berikut : 4.1. Prosesor: Intel XEON E5620 4 Core, 2, 40 GHz 4.2. Memori RAM: 8 GB RDIMM 4.3. Hardisk: RAID 5 Logical 2TB 4.4. Motherboard: HP Proliant ML 350 G6 49

4.2. Implementasi Basis Data

Pada sistem ini diimplementasikan database teks untuk menyimpan hasil seluruh proses preprocessing dokumen jurnal yang berbasis RDBMS. Database sistem ini dibuat menggunakan Oracle 11g. Aplikasi pendukung untuk melakukan pengolahan query adalah SQL Developer. Langkah – langkah dalam pembuatan database adalah seperti berikut : 1. Membuat database baru dengan login sebagai SYSTEM menggunakan SQL Developer. 2. Membuat tabel-tabel dalam database yang telah dibuat dengan menuliskan perintah create tabel diikuti nama tabel dan kolom-kolom dalam tabel. Di dalam database terdapat 8 tabel. Database „text‟ untuk sistem pemrosesan teks dapat dilihat pada gambar 4.1. 50 Gambar 4.1. Database berbasis RDBMS pada sistem pemrosesan teks Berikut proses pembuatan tabel untuk database text RDBMS : 1. Tabel Status Tabel 4.1. Tabel Status Nama Field Tipe Data Ukuran Keterangan id_status NUMBER - Primary key untuk tabel status description VARCHAR2 20 Deskripsi status Berikut query untuk membuat tabel status : 2. Tabel Documents Tabel 4.2. Tabel Documents Nama Field Tipe Data Ukuran Keterangan id_document NUMBER - Primary key untuk tabel documents title VARCHAR2 256 Judul dari dokumen path VARCHAR2 256 Nama file dari CREATE TABLE STATUS ID_STATUS NUMBER NOT NULL , DESCRIPTION VARCHAR2 20 ; ALTER TABLE STATUS ADD CONSTRAINT STATUS_DOCUMENTS_PK PRIMARY KEY ID_STATUS ; 51 dokumen max_term NUMBER - Frekuensi terbesar dari sebuah dokumen authors VARCHAR2 100 Penulis dari dokumen year NUMBER - Tahun dari dokumen id_status_ready NUMBER - Status untuk dokumen id_status2 NUMBER - Status untuk untuk sistem pencarian id_status3 NUMBER - Status untuk untuk sistem pencarian Berikut perintah untuk membuat tabel documents : CREATE TABLE DOCUMENTS ID_DOCUMENT NUMBER NOT NULL , MAX_TERM NUMBER, ID_STATUS_READY NUMBER NOT NULL , ID_STATUS2 NUMBER NOT NULL , ID_STATUS3 NUMBER NOT NULL , AUTHORS VARCHAR2 100 , YEAR NUMBER ; ALTER TABLE DOCUMENTS ADD CONSTRAINT documents_PK PRIMARY KEY ID_DOCUMENT ; ALTER TABLE DOCUMENTS ADD CONSTRAINT DOCUMENTS_STATUS1_FK FOREIGN KEY ID_STATUS_READY REFERENCES STATUS 52 ID_STATUS ; ALTER TABLE DOCUMENTS ADD CONSTRAINT DOCUMENTS_STATUS2_FK FOREIGN KEY ID_STATUS2 REFERENCES STATUS ID_STATUS ; ALTER TABLE DOCUMENTS ADD CONSTRAINT DOCUMENTS_STATUS_FK FOREIGN KEY ID_STATUS3 REFERENCES STATUS ID_STATUS ;

3. Tabel Posting

Tabel 4.3. Tabel Posting Nama Field Tipe Data Ukuran Keterangan id_document NUMBER - Foreign key dari tabel documents id_term NUMBER - Foreign key dari tabel terms frequency NUMBER - Frekuensi kata pada dokumen ntfik NUMBER - Hasil perhitungan frequency frequency terbesar pada sebuah dokumen w NUMBER - Bobot dari sebuah term dengan 53 rumus perhitungannya ndfikntfik Berikut perintah untuk membuat tabel posting : CREATE TABLE POSTING ID_DOCUMENT NUMBER NOT NULL , ID_TERM NUMBER NOT NULL , FREQUENCY NUMBER , NTFIK NUMBER , W NUMBER ; ALTER TABLE POSTING ADD CONSTRAINT POSTING_DOCUMENTS_FK FOREIGN KEY ID_DOCUMENT REFERENCES DOCUMENTS ID_DOCUMENT ; ALTER TABLE POSTING ADD CONSTRAINT POSTING_TERMS_FK FOREIGN KEY ID_TERM REFERENCES TERMS ID_TERM ; 54 4. Tabel Terms Tabel 4.4. Tabel Terms Nama Field Tipe Data Ukuran Keterangan id_term NUMBER - Primary key untuk tabel terms terms VARCHAR2 50 Kata sebelum proses stemming stemmed_word VARCHAR2 50 Kata setelah proses stemming is_root_word CHAR 1 Keterangan apakah terms ada di kamus Berikut perintah untuk membuat tabel terms : CREATE TABLE TERMS TERMS VARCHAR2 50 , STEMMED_WORDS VARCHAR2 50 , IS_ROOT_WORD CHAR 1 ; ALTER TABLE TERMS ADD CONSTRAINT TERMS_PK PRIMARY KEY ID_TERM ; 55

5. Tabel Posting_Stopword

Tabel 4.5. Tabel Posting_stopword Nama Field Tipe Data Ukuran Keterangan id_document NUMBER - Foreign key dari tabel documents id_stopword NUMBER - Foreign key dari tabel stopwords frequency NUMBER - Frekuensi stopword pada dokumen Berikut perintah untuk membuat tabel posting_stopword : CREATE TABLE POSTING_STOPWORD FREQUENCY NUMBER, ID_STOPWORD NUMBER NOT NULL , ID_DOCUMENT NUMBER NOT NULL ; ALTER TABLE POSTING_STOPWORD ADD CONSTRAINT POSTING_STOPWORD_DOCUMENTS_FK 56

6. Tabel Stopwords

Tabel 4.6. Tabel Stopwords Nama Field Tipe Data Ukuran Keterangan id_stopword NUMBER - Primary key untuk tabel stopwords stopword VARCHAR2 20 Daftar kata buang Berikut perintah untuk tabel stopwords : FOREIGN KEY ID_DOCUMENT REFERENCES DOCUMENTS ID_DOCUMENT ; ALTER TABLE POSTING_STOPWORD ADD CONSTRAINT POSTING_STOPWORD_STOPWORDS_FK FOREIGN KEY ID_STOPWORD REFERENCES STOPWORDS ID_STOPWORD ; CREATE TABLE STOPWORDS ID_STOPWORD NUMBER NOT NULL , STOPWORD VARCHAR2 20 } ; CREATE INDEX STOPWORDS__IDX ON STOPWORDS ID_STOPWORD ASC , STOPWORD ASC ; ALTER TABLE STOPWORDS ADD CONSTRAINT STOPWORDS_PK PRIMARY KEY ID_STOPWORD ; 57 7. Tabel Dictionary Tabel 4.7. Tabel Dictionary Nama Field Tipe Data Ukuran Keterangan id_dictionary NUMBER - Primary key untuk tabel dictionary root_word VARCHAR2 20 Daftar kata dasar Bahasa Indonesia Berikut perintah untuk membuat tabel dictionary : 8. Tabel Administrator Tabel 4.8. Tabel Administrator CREATE TABLE DICTIONARY ID_DICTIONARY NUMBER NOT NULL , ROOT_WORD VARCHAR2 20 ; CREATE UNIQUE INDEX DICTIONARY__IDX ON DICTIONARY ID_DICTIONARY ASC , ROOT_WORD ASC ; ALTER TABLE DICTIONARY ADD CONSTRAINT DICTIONARY_PK PRIMARY KEY ID_DICTIONARY ; 58 Nama Field Tipe Data Ukuran Keterangan id_administrator NUMBER - Primary key untuk tabel administrator username VARCHAR2 10 Username pasword VARCHAR2 20 Password Berikut perintah yang digunakan untuk membuat tabel administrator : 9. Tabel Sourceterm Tabel 4.9. Tabel Sourceterm Nama Field Tipe Data Ukuran Keterangan id_sourceterm NUMBER - Primary key untuk tabel sourceterm id_term NUMBER - Foreign key dari tabel terms word VARCHAR2 50 Kata tanpa proses stemming CREATE TABLE ADMINISTRATOR ID_ADMINISTRATOR NUMBER NOT NULL , USERNAME VARCHAR2 10 , PASWORD VARCHAR2 20 ; ALTER TABLE ADMINISTRATOR ADD CONSTRAINT ADMINISTRATOR_PK PRIMARY KEY ID_ADMINISTRATOR ; 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