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