BAB II TINJAUAN PUSTAKA 2.1 Algoritma Rabin-Karp Algoritma Rabin-Karp adalah suatu algoritma pencarian string yang diciptakan Michael O. Rabin dan Richard M. Karp pada tahun 1987 yang menggunakan fungsi hashing untuk menemukan pola berupa substring di dalam sebuah teks. Algoritma ini jarang digunakan untuk melakukan pencarian kata tunggal, namun sangat efektif apabila digunakan untuk pencarian lebih dari satu kata (Atmopawiro, 2006). Dalam implementasinya Algoritma Rabin Karp memiliki tahapan tahapan dalam yang harus dilalui seperti yang digambarkan pada flowchart pada Gambar 2.1 berikut. MULAI Teks : string Pattern : string i=0 Membentuk K-Gram Substring teks : array Pattern Menghitung Nilai Hash Hash teks : array Hash pattern : string i=hash teks. length Hash teks[i] = Hash pattern Substring teks[i] = Substring pattern Hitung similarity pattern dan teks Nilai String Sama Bertambah SELESAI Gambar 2.1 Flowchart Algoritma Rabin-Karp 9
10 Dalam algoritma Rabin-Karp, ada beberapa tahap yang harus dilalui dalam implementasi algoritma tersebut. 1) Preprocessing Tahap ini adalah tahap dimana dilakukan pemrosesan awal untuk mempersiapkan teks agar dapat digunakan dalam proses selanjutnya. Teks akan diubah ke dalam bentuk k-grams, dimana dalam hal ini teks akan dipotong potong dengan panjang K dari sebuah teks yang secara kontinuitas dibaca dari awal dokumen hingga akhir dari dokumen. 2) Rolling Hash Fungsi yang digunakan untuk menghasilkan nilai hash dari rangkaian gram dalam Algoritma Rabin-Karp adalah dengan menggunakan fungsi rolling hash. Fungsi hash H (C1 C k ) didefinisikan sebagai berikut, c 1 b (k 1) + c 2 b (k 2) + + c (k 1) b k + c k..(2.1) Keterangan : c : nilai ASCII karakter b : basis (bilangan prima) k : banyak karakter Metode hashing digunakan untuk mempercepat pencarian atau pencocokan suatu string. Apabila tidak di-hash, pencarian akan dilakukan karakter per karakter. Namun pencarian akan menjadi lebih mangkus setelah di-hash karena hanya akan membandingkan empat digit angka untuk mengetahui kesamaan suatu substring. Berikut ini merupakan contoh penghitungan rolling hash dengan k-grams = 6 dan basis = 101: Diketahui Teks : abracadabra ASCII : a = 97, b = 98, r = 114 Maka hash( abr ) = ( 97 x 101 2 ) + ( 98 x 101 1 ) + ( 114 x 101 0 ) = 999.509 Untuk menghitung nilai hash dari substring selanjutnya, dapat dilakukan dengan mengurangi hash dengan nilai dari karakter yang hilang kemudian
11 mengalikannya dengan basis dan menambahkannya dengan nilai karakter yang ditambahkan. hash( bra ) = [101 x ( 999.509 (97 x 101 2 ))] + ( 97 x 101 0 ) = 1.011.309 3) Pencocokan Proses pencocokan dalam Algoritma Rabin-Karp dilakukan dengan menggunakan sebuah teorema yaitu: Sebuah stringa identik dengan stringb, jika (syarat perlu) stringa memliki hash key yang sama dengan hash key yang dimiliki oleh stringb 4) Pengukuran Nilai Kemiripan Mengukur similarity (kemiripan) dan jarak antara dua entitas informasi adalah syarat inti pada semua kasus penemuan informasi, seperti pada Information Retrieval dan Data Mining yang kemudian dikembangkan dalam bentuk perangkat lunak, salah satunya adalah sistem deteksi kesamaan (Salmusih, 2013). Penggunaan ukuran similarity yang tepat tidak hanya meningkatkan kualitas pilihan informasi tetapi juga membantu mengurangi waktu dan biaya proses sehingga memperangkat lunakkan Dice's Similarity Coefficient dalam penghitungan nilai similarity yang menggunakan pendekatan k-gram. S = K C (A+B)..(2.2) Dimana S adalah nilai similarity, A dan B adalah jumlah dari kumpulan k- grams dalam teks 1 dan teks 2. C adalah jumlah dari k-grams yang sama dari teks yang dibandingkan. Berikut adalah contoh dari penggunaan rumus tersebut. Terdapat dua buah dokumen teks (dok A dan dok B) dengan nilai k-gram masingmasing dokumen secara bertutur-turut adalah 2608 dan 3040, sedangkan nilai k- gram yang sama adalah sebesar 1203. Maka hasil nilai dari kemiripan kedua dokumen tersebut adalah : S = K C (A + B) = 2 1203 (2608 + 3040) = 2406 = 0,4259 x 100% = 42,59% 5648
12 2.2 Peningkatan Performa Algoritma Rabin-Karp Pada Algoritma Rabin-Karp spurious hit merupakan beban tambahan bagi algoritma yang akan meningkatkan waktu proses. Hal ini dikarenakan algoritma harus membandingkan pola terhadap teks yang hasil modulonya sama tetapi nilai hashnya berbeda. Untuk menghindari pencocokan yang tidak perlu, Chillar dan Kochar (2008) memberikan solusi untuk tidak hanya membandingkan sisa hasil bagi, tetapi membandingkan hasil baginya juga. Jadi, successful hit harus memenuhi dua syarat, yaitu nilai sisa hasil bagi dan nilai hasil baginya harus sama. Selebihnya adalah unsuccessful hit tanpa perlu melakukan pencocokan lagi. Hal ini berarti tidak ada pemborosan waktu untuk mengecek spurious hit. Berikut merupakan flowchart dari Algoritma Rabin-Karp yang telah dimodifikasi: MULAI Teks : string Pattern : string i=0 Membentuk K-Gram Substring teks : array Pattern Menghitung Nilai Hash Hash teks : array Hash mod pattern: string Hash div pattern : string i=hash teks. length Hash teks[mod][i] = Hash mod pattern && Hash teks[div][i] = Hash div pattern SELESAI Hitung similarity pattern dan teks Nilai String Sama Bertambah Gambar 2.2 Flowchart Algoritma Rabin-Karp varian Chillar - Kochar
13 2.3 Text Preprocessing Melihat dari kemungkinan berbagai macam bentuk struktur data teks yang akan diproses, maka sebelum dilakukannya penghitungan kesamaan teks perlu dilakukan beberapa tahap awal yang bertujuan untuk agar teks dapat diubah menjadi lebih terstruktur dan menghilangkan noise pada dokumen. Proses preprocessing tersebut meliputi case folding, tokenizing, filtering, dan stemming. Gambar 2.3 berikut merupakan gambaran dari tahapan tahapan text preprocessing Gambar 2.3 Tahapan Text Preprocessing 2.3.1 Case Folding Case folding merupakan proses pertama dari rangkaian preprocessing dokumen. Dalam proses ini akan dilakukan perubahan pada kata kata dalam dokumen menjadi huruf kecil (a sampai z). Gambar 2.4 menunjukan flowchart dari proses case folding.
14 MULAI Teks : array of char i=0 Teks[i] = lower case( Teks[i] ) i=teks.length SELESAI Gambar 2.4 Flowchart Case Folding Berikut ini merupakan contoh dari proses case folding : [1] Input : Rabin Karp adalah algoritma pencarian kata yang mencari sebuah pola dalam sebuah teks. [2] Output : rabin karp adalah algoritma pencarian kata yang mencari sebuah pola dalam sebuah teks. 2.3.2 Tokenizing Tokenizing merupakan tahapan dimana dilakukannya pemotongan terhadap string input berdasarkan atas delimiter yang telah ditentukan. Karakter selain huruf akan dianggap sebagai delimiter dan akan dihilangkan atau dihapus untuk proses mendapat kata kata penyusun teks. Dari proses ini akan dihasilkan kata kata penyusun string / teks atau yang sering disebut token/term.
15 MULAI Teks : array of char Delimiter : array of char string Kata : array of string i=0, j=0 Count = 0 Teks[i] = Delimiter[j] j=0 Kata[i] = Substring Substring = j++ Substring = Substring + Teks[i] i=teks.length Kata SELESAI Gambar 2.5 Flowchart Tokenizing Berikut ini merupakan contoh dari proses tokenizing : [1] Input : rabin karp adalah algoritma pencarian kata yang mencari sebuah pola dalam sebuah teks. [2] Output : {rabin} {karp} {adalah} {algoritma} {pencarian} {kata} {yang} {mencari} {sebuah} {pola} {dalam} {sebuah} {teks} 2.3.3 Filtering Filtering merupakan tahap pengambilan kata kata penting dari hasil tokenizing string. Filtering dilakukan dengan membuang kata kata yang telah terdaftar ke dalam stopword/stoplist. Stopword adalah kata-kata yang sering muncul dalam teks dalam jumlah besar dan dianggap tidak memiliki makna penting.
16 MULAI Kata : array of string Stop word : array of string i : 0 j : 0 Kata[i] = Stop word [j] Hapus Kata[i] j++ i++ j=0 i = Kata.length Kata SELESAI Gambar 2.6 Flowchart Filtering Berikut ini merupakan contoh dari proses filtering : [1] Input : {rabin} {karp} {adalah} {algoritma} {pencarian} {kata} {yang} {mencari} {sebuah} {pola} {dalam} {sebuah} {teks} [2] Output : {rabin} {karp} {algoritma} {pencarian} {kata} {mencari} {pola} {teks} 2.3.4 Stemming Stemming merupakan proses yang dilakukan untuk mendapatkan kata dasar dari suatu kata. Stemming Nazief Adriani merupakan suatu algoritma stemming yang dibuat oleh Bobby Nazief dan Mirna Adriani.
17 MULAI Kata : String Apakah kata terdapat di kamus kata dasar Hapus Inflection Suffixes Apakah kata terdapat di kamus kata dasar Hapus Derivation Suffixes Apakah kata terdapat di kamus kata dasar Hapus Derivation Prefix SELESAI Gambar 2. 7 Flowchart Stemming Nazief Adriani Pencarian kata dasar dilakukan dengan menghilangkan semua imbuhan dari kata, baik itu awalan (prefiks), sisipan (infiks), maupun akhiran (suffiks). Berikut ini merupakan contoh dari proses stemming : [1] Input : {rabin} {karp} {algoritma} {pencarian} {kata} {mencari} {pola} {teks} [2] Output : {rabin} {karp} {algoritma} {cari} {kata} {cari} {pola} {teks} 2.4 Metode Pengembangan Waterfall Model proses mencakup kegiatan yang merupakan bagian dari proses perangkat lunak, produk perangkat lunak, dan peran orang yang terlibat dalam
18 rekayasa perangkat lunak. Model proses Waterfall merupakan suatu model proses klasik yang bersifat sistematis, berurutan dari satu tahap ke tahap lain dalam membangun perangkat lunak (Sommerville, 2011). Model proses Waterfall memiliki tahapan - tahapan dalam prosesnya, setiap tahapan tersebut harus diselesaikan sebelum berlanjut ke tahap berikutnya. Berikut tahapan yang ada dalam Waterfall adalah (Sommerville, 2011): Gambar 2.8 Model proses waterfall Berikut merupakan tahapan-tahapan dalam model proses Waterfall: 1) Analisis kebutuhan dan definisi (requirements analysis and definition) Layanan sistem, kendala, dan tujuan yang ditetapkan dengan berkonsultasi dengan pengguna sistem. Kemudian didefinisikan secara rinci dan dijadikan sebagai spesifikasi sistem. 2) Design sistem dan perangkat lunak (system and software design) Software desain meliputi mengidentifikasi dan menggambarkan abstraksi sistem perangkat lunak yang mendasar dan hubungan mereka. 3) Implementasi dan pengujian unit (implementation and unit testing) Selama tahap ini, perancangan perangkat lunak direalisasikan sebagai serangkaian program atau unit program. Unit pengujian melibatkan verifikasi bahwa setiap unit memenuhi spesifikasinya. 4) Integrasi dan pengujian sistem (integration and system testing) Tahapan dimana unit program individu atau program yang terintegrasi diuji sebagai sistem yang lengkap untuk memastikan bahwa persyaratan
19 perangkat lunak telah dipenuhi. Setelah pengujian, sistem perangkat lunak disampaikan kepada pengguna. 5) Pengoprasian dan maintenance (operation and maintenance) Biasanya tahap ini merupakan tahapan dengan masa waktu paling lama. Pemeliharaan meliputi kesalahan mengoreksi yang tidak ditemukan pada awal tahap siklus hidup, meningkatkan implementasi unit sistem dan meningkatkan pelayanan sistem sebagai kebutuhan baru ditemukan. Model ini memiliki keunggulan dalam kemudahan pengaplikasiannya, selain itu kelebihan lain yang dimiliki oleh model proses Waterfall adalah ketika seluruh kebutuhan sistem dapat didefinisikan secara lengkap, eksplisit, dan benar di awal proyek, maka fase - fase dalam pembangunan sistem akan dapat berjalan dengan baik. Sedangkan kekurangan utama dari model proses Waterfall ini adalah kesulitan dalam mengakomodasi perubahan setelah proses dijalani. Fase sebelumnya harus lengkap dan telah selesai sebelum dapat lanjut mengerjakan fase berikutnya. 2.5 Pengujian Sistem Terdapat 4 jenis pengujian yang dapat dilakukan pada suatu perangkat lunak, yaitu static testing, blackbox testing, whitebox testing, performance testing (Everett, 2007). 2.5.1 Static Testing Sekitar 85% kecacatan perangkat lunak bisa dilihat pada fase design dari pengembangan (Software Testing, Testing Across the Entire Software Development Life Cycle), sehingga diperlukan sebuah pengujian pada fase design tersebut untuk mengurangi cacat yang ada. Pengujian dilakukan dengan cara menguji dokumen dokumen pendukung sistem, hal ini dilaksanakan dikarenakan proses dokumentasi telah dimulai dan dibuat dari saat pengembangan dimulai, berlanjut, bahkan berakhir. Pengujian dokumentasi dapat dilakukan dengan beberapa cara, diantaranya adalah dilakukan dengan inspeksi, presentasi, walktrough, dan pengecekkan. Teknik teknik tersebut akan menguji kebenaran dan kelengkapan dari suatu dokumen. Dan apabila
20 ditemukkan kekurangan atau kecacatan pada dokumen, maka dokumen tersebut harus segera dikoreksi atau dibenahi. 2.5.2 Blackbox Testing Blackbox Testing merupakan test yang dapat dilakukan walaupun tester tidak memiliki source code dari software yang diuji, dan hanya yang software yang bisa dijalankan. Testing blackbox dilakukan dengan menjalankan aplikasi dan melakukan apa yang bisa dikerjakan oleh aplikasi, apa yang dilakukan dan bagaimana hasil yang diberikan aplikasi adalah hal yang diteliti. Hal penting yang harus dilakukan pada testing ini adalah, apakah tester mengetahui hasil (benar) apa yang diharapkan dan apakah tester melakukan test dengan benar. Dari kedua hal tersebut maka bisa dilihat apabila terjadi kesalahan, apakah kesalah tersebut dikarenakan kesalahan aplikasi atau kesalahan implementasi. 2.5.3 Whitebox Testing Whitebox testing merupakan sebuah pengujian yang dapat dilakukan saat user atau tester memiliki source code dari software yang akan dilakukan test. Testing whitebox dapat dilakukan oleh developer dengan cara mengetest tiap line dalam code satu-persatu. Namun Hal ini akan memakan banyak waktu untuk mengetest masing-masing line, terutama jika line mencapai ribuan hingga puluhan ribu, sehingga developer terkadang harus membuat rencana testing yang mengetest kebanyakan source code secara metodis. Testing seperti inipun lebih condong ke pengujian logika karena dominannya analisis jalur logika bagaimana input yang dimasukkan di proses oleh perangkat lunak menjadi hasil-hasil yang akan diproses hingga menjadi hasil yang diinginkan. Salah satu metode yang digunakan dalam White Box Testing adalah pengujian basis path testing atau disebut dengan Cylomatic Complexity. Dalam pelaksanaan White Box Testing, berikut langkah yang dilakukan (Pressman, 2010): a. Menggambar flowgraph yang ditransfer oleh flowchart. b. Menghitung Cylomatic Complexity V (G) untuk flowgraph yang telah dibuat. V(G) untuk flowgraph dapat dihitung dengan rumus:
21 V(G) = E N + 2 Keterangan: E = Jumlah edge pada flowrgaph N = Jumlah node pada flowrgaph c. Menentukan jalur pengujian dari flowgraph yang berjumlah sesuai dengan Cyclomatic Complexity yang telah ditentukan. Cyclomatic complexity yang tinggi menunjukkan prosedur kompleks yang sulit untuk dipahami, diuji dan dipelihara. Ada hubungan antara cyclomatic complexity dan resiko dalam suatu prosedur. Berikut hubungan antara cyclomatic complexity dan resiko dalam suatu prosedur. Tabel 2.1 Hubungan Cyclomatic Complexity dan resiko Cyclomatic Complexity Evaluasi Resiko 1-10 Sebuah program sederhana, tanpa banyak resiko 11-20 Agak kompleks, resiko sedang 21-50 Kompleks, program resiko tinggi Lebih dari 50 Program belum diuji (resiko sangat tinggi) 2.6 Tinjauan Studi Ada beberapa penelitian terkait yang pernah dilakukan mengenai sistem penilaian jawaban esai otomatis dan Algoritma Rabin-Karp, antara lain yaitu: 1) Automatic Essay Grading System Menggunakan Metode Latent Semantic Analysis (Bayu P, Baizal, dan Firdaus, 2011) Penelitian ini memiliki tujuan untuk membangun serta menganalisis kelayakan Automatic Essay Grading dengan mengimplementasikan Latent Semantic Analysis (LSA). Pada jurnal penilitian ini peniliti juga melakukan analisis mengenai seberapa besar pengaruh stemming pada proses essay grading bahasa Indonesia pada penerapan Latent Semantic Analysis. Pada penilitian ini peniliti menggunakan LSA dikarenakan LSA telah digunakan pada IEA dan memiliki kecocokan dengan human rater serta dianggap reliable dalam memberikan skor yang sama dengan human rater. Dalam penelitian ini peniliti menyatakan bahwa tingkat akurasi rata rata dari penilaian yang oleh sistem tidak tinggi, akurasi
22 berada di kisaran 45,03% dan 50,55%. Hal ini dikarenakan beberapa hal, seperti perbedaan panjang jawaban dengan kunci jawaban, persebaran term pada kalimat jawaban serta ketidakmampuan sistem untuk mendeteksi adanya maksud jawaban yang sama maupun sinonim. Selain itu dinyatakan pula bahwa proses stemming mampu menambah keakuratan dalam penilaian dengan rata rata nilai perbedaan 0,49% dan 0,63%. 2) A Comparison of Rabin Karp and Semantic-Based Plagiarism Detection (Supriyanto, Rakasiwi, & Syukur, 2012) Pada penilitian ini dilakukan perbandingan dua buah algoritma yaitu Rabin- Karp dan LSA. Penelitian ini bertujuan untuk membandingkan performa kedua algoritma tersebut dalam mendeteksi plagiarisme pada dokumen. Di dalam penilitian ini dihasilkan suatu kesimpulan bahwa performa Algoritma Rabin-Karp dalam pendeteksian plagiarisme melebihi performa dari Algoritma LSA. 3) Deteksi Plagiat Dokumen menggunakan Algoritma Rabin Karp (Firdaus, 2008) Pada penelitian ini peneliti membahas secara skematis bagaimana Algoritma Rabin-Karp bekerja dalam mendeteksi kesamaan pada suatu dokumen. Algoritma Rabin-Karp digunakan dalam mendeteksi kesamaan sebab memungkinkan untuk mencari pola tulisan yang didapat dari substring-substring pada sebuah teks dalam dokumen, dimana algoritma pencarian string tunggal sangat tidak efisien dan praktis. Untuk peningkatan akurasi pencarian pola dokumen kesamaan, dapat dikembangkan varian dari Algoritma Rabin-Karp untuk menyesuaikan dengan jenis dokumen. Salah satu contohnya menyesuaikan filtering dengan menambah atau mengubah kata-kata apa saja yang dapat diabaikan dan yang tidak. Selain itu dapat pula melakukan teknik pengelompokkan nilai hash. Dalam penelitian ini dihasilkan suatu kesimpulan bahwa Algoritma Rabin- Karp menghasilkan efisiensi waktu yang baik dalam mendeteksi string yang memiliki lebih dari satu pola.