BAB IV IMPLEMENTASI DAN PEMBAHASAN
4.3 Modul Pencarian
Gambar 4.17 Kode Program Modul Pencarian
Setelah pengindeksan selesai, maka proses pencarian dapat dilakukan. Pada penelitian ini modul pencarian akan menggunakan sebuah file yaitu
search.php. Pada file ini kata kunci yang diberikan oleh pengguna akan diproses if (trim($q)){ $mtime=microtime(); $mtime=explode(" ",$mtime); $mtime=$mtime[1] + $mtime[0]; $tstart=$mtime; $phrase = getPhraseArray($q,$stopwords); $plussql = getTermArray($q,$stopwords); $sql = "select distinct t_data.id_data from t_index,t_term,t_data
where t_index.id_term=t_term.id_term and t_data.id_data=t_index.id_data
and ($plussql) $addSqlBagian $addSqlType"; $rs = mysql_query($sql,$konek);
if (@mysql_num_rows($rs)){
while ($row = mysql_fetch_row($rs)){ unset($Dvektor);
unset($tf); unset($idf);
for ($i = 0 ; $i <= count($phrase)-1;$i++){
if($wij = getTruePhrase($phrase[$i],$row[0],$stopwords)){ $numQterm++; $atas += ($wij[0]); $qvektor += ($wij[1]); $found = true; $search = true; } } if ($numQterm){
$sqldi = "SELECT sum((t_index.tf* t_term.idf)*( t_index.tf*t_term.idf))
FROM t_term, t_index
WHERE t_index.id_data ='".$row[0]."' AND t_term.id_term = t_index.id_term"; $bawah = mysql_result(mysql_query($sqldi),0); $penyebut = $bawah*$qvektor;
$sim[$row[0]] = @($atas / sqrt($penyebut)); } unset($numQterm); unset($bawah); unset($atas); unset($qvektor); } $mtime=microtime(); $mtime=explode(" ",$mtime); $mtime=$mtime[1] + $mtime[0]; $tend=$mtime; $totaltime=($tend-$tstart); $totaltime=number_format($totaltime,4); } else{
$messages= ":: Data tidak ditemukan!!"; $found = false;
} }else {
$messages = ":: Kata apa yang mau anda cari?"; $found = false;
terlebih dahulu dengan proses parsing dan penghilangan stopwords, lalu akan dibentuk array yang berisi kata-kata yang terdapat dalam indeks. Dari kata kunci juga akan dibuat array yang berisi frasa yang mungkin dibuat oleh pengguna. Setelah itu akan dilanjutkan dengan pencarian dokumen yang memiliki frasa tepat sesuai dengan masukan oleh pengguna, penghitungan bobot, fungsi kesamaan dan yang terakhir pengurutan dokumen berdasarkan bobotnya. Setelah dokumen terurut maka hasilnya dapat ditampilkan kembali kepada pengguna.
Pada awal pengambilan kata kunci, akan diambil nilai dari waktu awal pengeksekusian file pencarian. Lalu pada akhir dari fungsi kesamaan akan diambil juga nilai waktu akhir. Selisih waktu awal dan waktu akhir ini digunakan untuk informasi kepada pengguna mengenai lamanya pencarian yang dilakukan oleh sistem. Potongan kode program pada file pencarian dapat dilihat pada Gambar 4.17.
Modul pencarian menggunakan tiga buah submodul yaitu modul untuk pencarian frasa pada query, submodul parsing dan penghilangan stopwords pada
query dan modul untuk pengecekan frasa tepat pada dokumen sesuai dengan frasa pada query yang diberikan.
4.3.1 Submodul Pencarian Frasa pada Query
Gambar 4.18 Kode Program Submodul Pencarian Frasa pada Query
Submodul ini diberi nama getPhraseArray. Kode program dari submodul pencarian frasa pada query dapat dilihat pada Gambar 4.18. Pengguna sistem didalam melakukan pencarian dapat mencari frasa yang terdapat di dalam dokumen dengan cara memberikan tanda kutip (“) sebagai batas frasa pada kata kunci yang dimasukan. Adakalanya pengguna memasukan lebih dari dua frasa pada kata kunci. Misal pengguna memasukan kata kunci: ‘ “bom bali” “kenaikan bbm” ’, maka sistem akan memecah kata kunci tersebut menjadi dua buah bagian frasa “bom bali” dan “kenaikan bbm”. Kedua frasa ini akan disimpan ke dalam array untuk digunakan pada proses selanjutnya.
Masukan dari submodul ini terdiri dari dua macam yaitu kata kunci yang diberikan oleh pengguna serta array dari daftar stopwords yang diambil dari file stopwords.txt.
function getPhraseArray($q,$stopwords){ $quoted = explode('"', $q);
for($i = 0; $i <= count($quoted)-1 ; $i++) { if($i == 0 && !$quoted[$i]) {
//kutip pada awal kata kunci $begin = True;
$i++; }
if($begin) { $phrase[] = $quoted[$i]; } elseif($quoted[$i]) {
$temp_phrase = explode(" ", $quoted[$i]); for($n = 0; $n < count($temp_phrase); $n++) { $str = trim($temp_phrase[$n]);
if(trim($str) && !in_array($str,$stopwords)) { $phrase[] = $str; } } } $begin = !$begin; } return $phrase; }
4.3.2 Submodul untuk Parsing dan Penghilangan Stopwords
Setelah kata kunci di proses untuk memisahkan frasa, maka pemrosesan selanjutnya yaitu pemisahan kata-kata di dalam kata kunci untuk di sesuaikan dengan indeks yang terdapat di dalam basis data. Submodul untuk parsing dan penghilangan stopwords akan memecah kata kunci tersebut menjadi beberapa kata lalu akan dicocokan dengan kata yang terdapat di dalam tabel t_term pada basis data. Namun sebelum itu kata-kata yang termasuk ke dalam stopwords akan dibuang.
Masukan dari submodul ini sama dengan submodul pencarian frasa. Perbedaannya terletak pada proses pemecahan teks pada kata kunci dari query. Pada submodul frasa kata kunci akan dipecah menjadi frasa-frasa yang sesuai berdasarkan tanda kutip (“) sebagai pemisah frasa, sedangkan pada submodul ini kata kunci akan dipecah berdasarkan tiap-tiap katanya. Misal: kata kunci ‘“bom bali” “kenaikan bbm”’ akan dipecah menjadi kata “bom”, “bali”, “kenaikan” dan “bbm”. Lalu setelah itu kata-kata tersebut akan di cari di dalam basis data untuk disesuaikan.
Pada Gambar 4.19 dijabarkan kode program dari submodul parsing dan penghilangan stopwords. Pada gambar tersebut dapat dilihat keluaran dari submodul ini adalah array yang berisi penyataan SQL untuk meng-query seluruh dokumen yang memiliki kata-kata yang terdapat pada kata kunci yang diberikan oleh pengguna ke dalam basis data. Pernyataan SQL yang dihasilkan pada submodul ini akan digunakan untuk mencari id_data dari dokumen yang memiliki kata yang sesuai dengan kata kunci dan juga kata kunci tersebut harus terdapat di
dalam tabel t_term. Id_data dari dokumen tersebut diambil dari tabel t_index pada basis data.
Gambar 4.19 Kode Program Submodul Parsing dan Penghilangan Stopwords 4.3.3 Submodul pencocokan dokumen yang memiliki frasa tepat
Setelah id_data diambil maka dapat dicari frasa yang sesuai dengan frasa yang sudah didapatkan dari submodul pencarian frasa. Setiap id_data yang didapatkan akan dicocokan kata per kata sesuai dengan posisinya di dalam dokumen. Urutan dari tiap-tiap kata di dalam frasa harus sama dengan urutan frasa yang sudah di dapatkan.
Kode Program dari submodul ini dapat dilihat pada Gambar 4.20. function getTermArray($q,$stopwords){
global $konek;
$user_query = trim(strtolower($q));
$user_query = ereg_replace('"',"",$user_query); $array_user_query = explode(" ",$user_query); $orSql = true;
for ($i=0 ; $i <= count($array_user_query) -1 ; $i++){ if (!in_array($array_user_query[$i],$stopwords)){ if ($orSql){
$plussql = "t_term.term = '".$array_user_query[$i]."'"; $orSql = false;
}else{
$plussql .= " or t_term.term = '".$array_user_query[$i]."'"; }
} }
$orSql = true;
$sql = "select distinct id_term from t_term
where $plussql"; $rs = mysql_query($sql,$konek); if (@mysql_num_rows($rs)){
while ($row= mysql_fetch_row($rs)){ if ($orSql){ $plussql = "t_term.id_term='".$row[0]."'"; $orSql = false; }else { $plussql .= " or t_term.id_term='".$row[0]."'"; } } } return $plussql; }
Gambar 4.20 Kode Program submodul Pencocokan Dokumen yang memiliki frasa tepat.
Submodul ini memiliki tiga masukan yaitu array dari frasa, id_data dan array kata stopwords. Pada awal pemrosesan, submodul ini akan memecah setiap
function getTruePhrase($phrase,$id_data,$stopwords){ global $konek;
global $buangkarakter; $temp = explode(" ",$phrase);
for ($i=0 ; $i <= count($temp) -1 ; $i++){ if (!in_array($temp[$i],$stopwords)){
$array_kunci[] = preg_replace($buangkarakter,"",$temp[$i]); }
}
for ($i = 0 ; $i <= count($array_kunci) -1 ; $i++){ $sql = "SELECT t_index.position,t_index.tf,t_term.idf FROM t_index, t_term
WHERE t_index.id_data = '".$id_data."' AND t_term.term = '".$array_kunci[$i]."' AND t_index.id_term = t_term.id_term"; $result = mysql_query($sql,$konek); if ($row = @mysql_fetch_row($result)){ $array_phrase[$i]= explode(",",$row[0]); $diwq += ($row[1]*$row[2])*$row[2]; $wq += ($row[2]*$row[2]); }else{ return false; } } if (count($array_kunci) > 1){ $match = false; $banyak_letak_kata1 = count($array_phrase[0]); for ($i = 0 ; $i <= $banyak_letak_kata1-1 ;$i++){ $j = 1; $letak = $array_phrase[0][$i]; while ($j <= count($array_phrase)-1){ if (in_array($letak+1,$array_phrase[$j])){ if($j == count($array_phrase)-1){ $match = true; $j++; }else{ $letak++; $j++; } }else{ break; } } if ($match){ break; } } if ($match){ return array($diwq,$wq); }else{ return false; } }else{ return array($diwq,$wq); } }
kata frasa yang dipisahkan oleh spasi. Apabila di dalam frasa tersebut terdapat kata stopwords maka akan dihilangkan juga. Setelah itu akan diambil dari basis data informasi mengenai posisi kata, nilai tf dari kata dan nilai idf dari kata pada dokumen yang dengan id_data sesuai pada masukan. Jika frasa yang dimasukan hanya terdiri dari satu kata maka submodul ini akan langsung memberikan hasilnya, kalau tidak, akan di cari urutan frasa yang benar pada dokumen berdasarkan posisi yang sudah diambil dari basis data.
Keluaran dari submodul ini adalah array yang berisi jumlah perkalian dari bobot kata (tf·idf) dengan bobot dari query, jumlah kuadrat dari bobot kata dan jumlah kuadrat dari bobot query. Array ini akan digunakan untuk penghitungan fungsi kesamaan dengan rumus:
∑
∑
∑
= = = × ⋅ = t j qj t j ij t j ij qj i w w w w D Q sim 1 2 1 2 1 ) ( ) ( ) , (Dimana : sim(Q,Di) = nilai fungsi kesamaan dari dokumen Di pada
query Q
wqj = bobot dari kata j pada query
wij = bobot dari kata j pada dokumen ke i t = jumlah indeks kata pada sistem
Submodul ini akan bernilai false jika dokumen tidak memiliki frasa yang sesuai dengan frasa yang didapatkan dari kata kunci. Setelah dokumen dihitung nilai kesamaannya, maka nilai-nilai tersebut akan dimasukan ke dalam array untuk
diurutkan. Lalu hasil dari pencarian dokumen akan tampilkan kepada pengguna. Tampilan antar muka pencarian dapat dilihat pada Gambar 4.21.
Gambar 4.21 Tampilan Antarmuka Modul Pencarian