Minggu, 03 Maret 2013

Penerapan Information Retrieval

Information Retrieval (IR) sering disebut juga temu kembali infromasi adalah: ilmu yang mempelajari prosedur-prosedur dan metode-metode untuk menemukan kembali infromasi yang tersimpan dari berbagai sumber (resources) yang relevan atau koleksi sumber informasi yang dicari atau dibutuhkan. Dengan tindakan  index (indexing), panggilan (searching), pemanggilan data kembali (recalling). Dalam pencarian data bisa mencakup texts, table, gambar, video, audio. Adapun tujuan dari Infromation Retrieval ialah untuk memenuhi informasi pengguna dengan cara meretrieve dokumen yang relevan atau menguragi dokumen pencarian yang tidak relevean.



Cotoh Penerapan Information Retrieval dengan PHP dan Mysql sbb:

1). Buat Data Base dengan MySql dengan nama database fsakti

a) Buat tabel beriata 

CREATE TABLE IF NOT EXISTS `tbberita` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `Judul` varchar(100) NOT NULL,
  `Berita` varchar(255) NOT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=17 ;
 
b). buat inputan ke tabel berita



INSERT INTO `tbberita` (`Id`, `Judul`, `Berita`) VALUES
(1, 'CR9 Bikin Mourinho Tak Sabar ke Madrid', 'Yang spesial dari rencana kepindahan Jose Mourinho ke Real Madrid adalah pertemuan dia dengan Cristiano Ronaldo. Mengaku tak sabar bertemu rekan senegaranya itu, Mourinho juga berharap banyak gol dari CR9. '),
(2, 'Jepang Mau Sampai Semifinal', 'Kalah atas Korea Selatan tak membuat kepercayaan diri Jepang menyusut. Pelatih ''Samurai Biru'', Takeshi Okada, malah memasang target tinggi dengan menembus babak semifinal. '),
(3, 'Simpati Milito untuk Cambiasso & Zanetti', 'Diego Milito mengungkapkan rasa simpatinya kepada rekannya di Inter Milan. Meski sama-sama meraih treble di Inter namun Esteban Cambiasso dan Javier Zanetti tak masuk skuad Argentina. '),
(4, 'Neville Belum Berencana Pensiun', 'Gary Neville bersikukuh belum mau pensiun dari timnas Inggris. Meskipun sudah jarang dipanggil memperkuat The Three Lions, bek 35 tahun ini mengaku siap bermain saat negerinya membutuhkan jasanya'),
(5, 'Lawan Meksiko, Capello Banyak Belajar', 'Inggris tampil meyakinkan saat mengalahkan Meksiko 3-1. Namun manajer Inggris Fabio Capello mengaku bahwa mendapatkan banyak pelajaran dalam laga ujicoba tersebut.'),
(6, 'Maradona Hapus Kekhawatiran', 'Tanpa diperkuat beberapa bintang besarnya, Argentina sukses menghajar Kanada dengan skor telak 5-0. Atas hasil tersebut Diego Maradona yakin kalau publik negaranya bakal berhenti khawatir.'),
(7, ' Giuseppe Meazza Tak Tidur ', 'Sebuah malam bersejarah telah diraih Inter Milan, ketika mereka kembali menjadi juara Eropa untuk kali pertama dalam 45 tahun. Puluhan ribu tifosinya pun tidak mau melewatkan malam besar itu. '),
(8, 'Cambiasso: Selamat Jalan, Mourinho', 'Rumor hijrahnya Jose Mourinho dari Inter Milan ke Real Madrid sudah kian santer. Esteban Cambiasso pun memberi pernyataan yang secara tak langsung seperti membenarkan spekulasi yang ada.'),
(9, 'Seandainya Ribery Bisa Tampil', 'Franck Ribery terpaksa hanya menonton laga final Liga Champions dari bangku cadangan. Akibatnya, strategi yang dijalankan Bayern Muenchen tidak sesuai yang diharapkan sehingga mereka menelan kekalahan. '),
(10, 'Sneijder: Semua karena Mourinho', 'Trofi pertama Liga Champions sejak 45 tahun silam berhasil diraih oleh skuad terkini Inter Milan. Sukses itu boleh disebabkan oleh banyak hal, tapi sosok Jose Mourinho-lah yang dinilai sebagai aspek terpenting.'),
(11, 'Reina: Torres Bertahan di Anfield', 'Spekulasi masa depan Fernando Torres di Liverpool masih terus menghangat. Namun kiper Pepe Reina yakin rekan senegaranya tersebut akan tetap bertahan di Anfield musim depan. '),
(12, 'Liverpool Buruk karena Dana Minim', 'Musim 2009/2010 boleh disebut sebagai musim paling buruk yang pernah dialami Liverpool. Manajer Rafael Benitez "mendakwa" faktor minimnya dana sebagai penyebabnya. '),
(13, 'Fergie: Hargreaves Harus Berani', 'Owen Hargreaves mengalami krisis kepercayaan diri pasca comeback dari cedera panjang. Sir Alex Ferguson menyarankan anak buahnya itu harus memiliki mental baja agar bisa kembali ke permainan terbaiknya. '),
(14, 'Blackpool Raih Tiket Terakhir Premier League', 'Setelah menanti hampir selama empat dasawarsa, Blackpool kembali ke top-flight usai mengalahkan Cardiff di laga playoff penentuan tiket promosi ke Premier League. '),
(15, 'West Ham Bidik Henry', 'Nasib Thierry Henry di Barcelona menjadi tak pasti sejak jawara Spanyol itu mendatangkan David Villa. West Ham United melihat peluang itu dan mencoba menggaetnya. '),
(16, ' ''Liverpool Tetap Kompetitif!''', 'Rafael Benitez kembali mengungkapkan pembelaan terhadap dirinya, yang dituding gagal memberikan prestasi bagi Liverpool. Manajer Spanyol itu mengatakan Si Merah tetap kompetitif. Buktinya?');


c). buat tabel cache


CREATE TABLE IF NOT EXISTS `tbcache` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `Query` varchar(100) NOT NULL,
  `DocId` int(11) NOT NULL,
  `Value` float NOT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;


d). buat Tabel Index


CREATE TABLE IF NOT EXISTS `tbindex` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `Term` varchar(30) NOT NULL,
  `DocId` int(11) NOT NULL,
  `Count` int(11) NOT NULL,
  `Bobot` float NOT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;


e) buat Tabel Stem


CREATE TABLE IF NOT EXISTS `tbstem` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `Term` varchar(30) NOT NULL,
  `Stem` varchar(30) NOT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;


f). buat tabel vektor


CREATE TABLE IF NOT EXISTS `tbvektor` (
  `DocId` int(11) NOT NULL,
  `Panjang` float NOT NULL,
  PRIMARY KEY (`DocId`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;



2). Buat Coding untuk Koneksi

<?php
$con = mysql_connect("localhost","root","");
if (!$con)  {
      die('Koneksi ke database gagal: ' . mysql_error());
}
mysql_select_db("fsakti", $con);   
?>
 
3). Buat Coding untuk fungsi
 


<?php
//=============== koleksi fungsi ===================
//fungsi untuk melakukan preprocessing terhadap teks
//terutama stopword removal dan stemming
//--------------------------------------------------------------------------------------------
function preproses($teks) {
                    
       //bersihkan tanda baca, ganti dengan space
       $teks = str_replace("'", " ", $teks);
       $teks = str_replace("-", " ", $teks);
       $teks = str_replace(")", " ", $teks);
       $teks = str_replace("(", " ", $teks);
       $teks = str_replace("\"", " ", $teks);
       $teks = str_replace("/", " ", $teks);
       $teks = str_replace("=", " ", $teks);
       $teks = str_replace(".", " ", $teks);
       $teks = str_replace(",", " ", $teks);
       $teks = str_replace(":", " ", $teks);
       $teks = str_replace(";", " ", $teks);
       $teks = str_replace("!", " ", $teks);
       $teks = str_replace("?", " ", $teks);
                    
       //ubah ke huruf kecil                   
       $teks = strtolower(trim($teks));
                    
       //terapkan stop word removal
       $astoplist = array ("yang", "juga", "dari", "dia", "kami", "kamu", "ini", "itu",
                            "atau", "dan", "tersebut", "pada", "dengan", "adalah", 
"yaitu", "ke");                                  
       foreach ($astoplist as $i => $value) {
       $teks = str_replace($astoplist[$i], "", $teks);
       }
                    
       //terapkan stemming
       //buka tabel tbstem dan bandingkan dengan berita                    
       $restem = mysql_query("SELECT * FROM tbstem ORDER BY Id");

       while($rowstem = mysql_fetch_array($restem)) {                      
              $teks = str_replace($rowstem['Term'], $rowstem['Stem'], $teks);
       }                         
      
       //kembalikan teks yang telah dipreproses
       $teks = strtolower(trim($teks));
       return $teks;
} //end function preproses
//--------------------------------------------------------------------------------------------

//--------------------------------------------------------------------------------------------
//fungsi untuk membuat index
function buatindex() {
              //hapus index sebelumnya
              mysql_query("TRUNCATE TABLE tbindex");

              //ambil semua berita (teks)      
              $resBerita = mysql_query("SELECT * FROM tbberita ORDER BY Id");
              $num_rows = mysql_num_rows($resBerita);
              print("Mengindeks sebanyak " . $num_rows . " berita. <br />");

              while($row = mysql_fetch_array($resBerita)) {                
                     $docId = $row['Id']; 
                     $berita = $row['Berita']; 
                    
                     //terapkan preprocessing                
                     $berita = preproses($berita);
                    
                     //simpan ke inverted index (tbindex)
                     $aberita = explode(" ", trim($berita));
                    
                     foreach ($aberita as $j => $value) {                         
                           //hanya jika Term tidak null atau nil, tidak kosong                        
                           if ($aberita[$j] != "") {                      
                           
                                  //berapa baris hasil yang dikembalikan query tersebut?                           
                                  $rescount = mysql_query("SELECT Count FROM tbindex 
WHERE Term = '$aberita[$j]' AND DocId = $docId");                  
                                  $num_rows = mysql_num_rows($rescount);
                          
                                  //jika sudah ada DocId dan Term tersebut , naikkan 
Count (+1)                
                                  if ($num_rows > 0) {                           
                                         $rowcount = mysql_fetch_array($rescount);                                               
                                         $count = $rowcount['Count'];
                                         $count++;
                                                                    
                                         mysql_query("UPDATE tbindex SET Count = $count 
WHERE Term = '$aberita[$j]' AND DocId = $docId");
                                  }
                                  //jika belum ada, langsung simpan ke tbindex                 
                                  else {                    
                                         mysql_query("INSERT INTO tbindex (Term, DocId, 
Count) VALUES ('$aberita[$j]', $docId, 1)");
                                  }
                           } //end if
                     } //end foreach                  
              } //end while
} //end function buatindex()
//--------------------------------------------------------------------------------------------

//--------------------------------------------------------------------------------------------
//fungsi hitungbobot, menggunakan pendekatan tf.idf
function hitungbobot() {  
       //berapa jumlah DocId total?, n
       $resn = mysql_query("SELECT DISTINCT DocId FROM tbindex");
       $n = mysql_num_rows($resn);
      
       //ambil setiap record dalam tabel tbindex
       //hitung bobot untuk setiap Term dalam setiap DocId
       $resBobot = mysql_query("SELECT * FROM tbindex ORDER BY Id");
       $num_rows = mysql_num_rows($resBobot);
       print("Terdapat " . $num_rows . " Term yang diberikan bobot. <br />");

       while($rowbobot = mysql_fetch_array($resBobot)) {
              //$w = tf * log (n/N)
              $term = $rowbobot['Term'];       
              $tf = $rowbobot['Count'];
              $id = $rowbobot['Id'];
             
              //berapa jumlah dokumen yang mengandung term tersebut?, N
              $resNTerm = mysql_query("SELECT Count(*) as N FROM tbindex 
WHERE Term = '$term'");
              $rowNTerm = mysql_fetch_array($resNTerm);
              $NTerm = $rowNTerm['N'];
             
              $w = $tf * log($n/$NTerm);
             
              //update bobot dari term tersebut
              $resUpdateBobot = mysql_query("UPDATE tbindex SET Bobot = $w 
WHERE Id
 = $id");             
       } //end while $rowbobot  
} //end function hitungbobot
//--------------------------------------------------------------------------------------------

//--------------------------------------------------------------------------------------------
//fungsi panjangvektor, jarak euclidean
//akar(penjumlahan kuadrat dari bobot setiap Term)
function panjangvektor() {
       //hapus isi tabel tbvektor
       mysql_query("TRUNCATE TABLE tbvektor");
             
       //ambil setiap DocId dalam tbindex
       //hitung panjang vektor untuk setiap DocId tersebut
       //simpan ke dalam tabel tbvektor
       $resDocId = mysql_query("SELECT DISTINCT DocId FROM tbindex");
      
       $num_rows = mysql_num_rows($resDocId);
       print("Terdapat " . $num_rows . " dokumen yang dihitung panjang vektornya.
 <br />");
      
       while($rowDocId = mysql_fetch_array($resDocId)) {
              $docId = $rowDocId['DocId'];
      
              $resVektor = mysql_query("SELECT Bobot FROM tbindex WHERE 
DocId = $docId");
             
              //jumlahkan semua bobot kuadrat
              $panjangVektor = 0;       
              while($rowVektor = mysql_fetch_array($resVektor)) {
                     $panjangVektor = $panjangVektor + $rowVektor['Bobot']  *  $rowVektor['Bobot'];
              }
             
              //hitung akarnya          
              $panjangVektor = sqrt($panjangVektor);
             
              //masukkan ke dalam tbvektor            
              $resInsertVektor = mysql_query("INSERT INTO tbvektor (DocId, 
Panjang) VALUES ($docId, $panjangVektor)");
       } //end while $rowDocId
} //end function panjangvektor
//--------------------------------------------------------------------------------------------

//--------------------------------------------------------------------------------------------
//fungsi hitungsim - kemiripan antara query
//setiap dokumen dalam database (berdasarkan bobot di tbindex)
function hitungsim($query) {
       //ambil jumlah total dokumen yang telah diindex (tbindex atau tbvektor), n
       $resn = mysql_query("SELECT Count(*) as n FROM tbvektor");
       $rown = mysql_fetch_array($resn);
       $n = $rown['n'];
      
       //terapkan preprocessing terhadap $query
       $aquery = explode(" ", $query);
      
       //hitung panjang vektor query
       $panjangQuery = 0;
       $aBobotQuery = array();
      
       for ($i=0; $i<count($aquery); $i++) {
              //hitung bobot untuk term ke-i pada query, log(n/N);
              //hitung jumlah dokumen yang mengandung term tersebut
              $resNTerm = mysql_query("SELECT Count(*) as N from tbindex 
WHERE Term = '$aquery[$i]'");
              $rowNTerm = mysql_fetch_array($resNTerm);      
              $NTerm = $rowNTerm['N'] ;
             
              $idf = log($n/$NTerm);
             
              //simpan di array         
              $aBobotQuery[] = $idf;
             
              $panjangQuery = $panjangQuery + $idf * $idf;          
       }
      
       $panjangQuery = sqrt($panjangQuery);
      
       $jumlahmirip = 0;
      
       //ambil setiap term dari DocId, bandingkan dengan Query
       $resDocId = mysql_query("SELECT * FROM tbvektor ORDER BY DocId");
       while ($rowDocId = mysql_fetch_array($resDocId)) {
      
              $dotproduct = 0;
                    
              $docId = $rowDocId['DocId'];
              $panjangDocId = $rowDocId['Panjang'];
             
              $resTerm = mysql_query("SELECT * FROM tbindex WHERE DocId 
= $docId");
              while ($rowTerm = mysql_fetch_array($resTerm)) {
                     for ($i=0; $i<count($aquery); $i++) {
                           //jika term sama
                           if ($rowTerm['Term'] == $aquery[$i]) {
                                  $dotproduct = $dotproduct + $rowTerm['Bobot'] * $aBobotQuery[$i];                       
                           } //end if          
                     } //end for $i            
              } //end while ($rowTerm)
             
              if ($dotproduct > 0) {
                     $sim = $dotproduct / ($panjangQuery * $panjangDocId); 
                    
                     //simpan kemiripan > 0  ke dalam tbcache
                     $resInsertCache = mysql_query("INSERT INTO tbcache (Query, 
DocId, Value) VALUES ('$query', $docId, $sim)");
                     $jumlahmirip++;
              }
             
       } //end while $rowDocId
      
       if ($jumlahmirip == 0) {
              $resInsertCache = mysql_query("INSERT INTO tbcache (Query, 
DocId, Value) VALUES ('$query', 0, 0)");
       }     
             
} //end hitungSim()
//--------------------------------------------------------------------------------------------

//--------------------------------------------------------------------------------------------
function ambilcache($keyword) {
       $resCache = mysql_query("SELECT *  FROM tbcache WHERE 
Query = '$keyword' ORDER BY Value DESC");
       $num_rows = mysql_num_rows($resCache);
             
       if ($num_rows >0) {
              //tampilkan semua berita yang telah terurut
              while ($rowCache = mysql_fetch_array($resCache)) {
                     $docId = $rowCache['DocId'];
                     $sim = $rowCache['Value'];
                                 
                     if ($docId != 0) {                             
                           //ambil berita dari tabel tbberita, tampilkan
                           $resBerita = mysql_query("SELECT * FROM tbberita 
WHERE Id = $docId");
                           $rowBerita = mysql_fetch_array($resBerita);
                                 
                           $judul = $rowBerita['Judul'];
                           $berita = $rowBerita['Berita'];
                                 
                           print($docId . ". (" . $sim . ") <font color=blue><b>" . $judul . "</b></font><br />");
                           print($berita . "<hr />");       
                     } else {
                           print("<b>Tidak ada... </b><hr />");
                     }
              }//end while (rowCache = mysql_fetch_array($resCache))
       }//end if $num_rows>0
       else {
              hitungsim($keyword);
             
              //pasti telah ada dalam tbcache         
              $resCache = mysql_query("SELECT *  FROM tbcache WHERE 
Query = '$keyword' ORDER BY Value DESC");
              $num_rows = mysql_num_rows($resCache);
             
              while ($rowCache = mysql_fetch_array($resCache)) {
                     $docId = $rowCache['DocId'];
                     $sim = $rowCache['Value'];
                                 
                     if ($docId != 0) {                             
                           //ambil berita dari tabel tbberita, tampilkan
                           $resBerita = mysql_query("SELECT * FROM tbberita
 WHERE Id = $docId");
                           $rowBerita = mysql_fetch_array($resBerita);
                                 
                           $judul = $rowBerita['Judul'];
                           $berita = $rowBerita['Berita'];
                                 
                           print($docId . ". (" . $sim . ") <font color=blue><b>" . $judul . "</b></font><br />");
                           print($berita . "<hr />");       
                     } else {
                           print("<b>Tidak ada... </b><hr />");
                     }
              } //end while
       }
} //end function ambilcache
//--------------------------------------------------------------------------------------------
//============== akhir koleksi fungsi ==================

?>

  
4). Buat Coding untuk index


<head>
<title>Implentasi Indexing & Retrieval</title>
</head>

<body>
<h1 align=center>Implentasi Proses Indexing & Retrieval</h1>
<hr>
<div align=center>
| <a href="index.php">Beranda</a> |
<a href="index.php?act=corpus">Tampilkan Corpus</a> |
<a href="index.php?act=indexing">Buat Index</a> |
<a href="index.php?act=bobot">Hitung Bobot</a> |
<a href="index.php?act=panjangvektor">Hitung Panjang Vektor</a> |
<a href="index.php?act=showindex">Tampilkan Index</a> |
<a href="index.php?act=showvektor">Tampilkan Panjang Vektor</a> |
<a href="index.php?act=retrieve">Retrieval</a> |
<a href="index.php?act=cache">Tampilkan Cache</a> |
</div>
<hr />

<?php
include 'koneksi.php';
include 'fungsi.php';

//periksa apa yang diinginkan pengguna (variabel act)
$apa = $_GET["act"];   
     
//jika "corpus"  
if ($apa == "corpus") {
      $result = mysql_query("SELECT * FROM tbberita ORDER BY Id");

      while($row = mysql_fetch_array($result)) {
            echo $row['Id'] . ". <font color =blue>" . $row['Judul'] . "</font><br />" . $row['Berita'];
            echo "<hr />";
      }          
}
     
//jika "indexing"
else if ($apa == "indexing") {
      buatindex();           
      print("<hr />");
}
     
else if ($apa == "bobot") {
      hitungbobot();         
      print("<hr />");
}
     
else if ($apa == "panjangvektor") {
      panjangvektor();       
      print("<hr />");
}
     
else if ($apa == "showvektor") {
      print("<table>");
      print("<tr><td>Doc-ID</td><td>Panjang Vektor</td></tr>");
      $result = mysql_query("SELECT * FROM tbvektor");

      while($row = mysql_fetch_array($result)) {
           
            print("<tr>");
            print("<td>" . $row['DocId'] . "</td><td>" . $row['Panjang'] . "</td>");
            print("</tr>");

      }          
      print("</table><hr />");     
                 
}
     
//jika "showindex"     
else if ($apa == "showindex") {

      print("<table>");
      print("<tr><td>#</td><td>Term</td><td>Doc-ID</td><td>Count</td><td>Bobot</td></tr>");
      $result = mysql_query("SELECT * FROM tbindex ORDER BY Id");

      while($row = mysql_fetch_array($result)) {
           
            print("<tr>");
            print("<td>" . $row['Id'] . "</td><td>" . $row['Term'] . "</td><td>" . $row['DocId'] .
                      "</td><td>" . $row['Count'] . "</td><td>" . $row['Bobot'] . "</td>");
            print("</tr>");

      }          
      print("</table><hr />");
}
     
//jika "retrieve"
else if ($apa == "retrieve") {                             
      print('<center><form action="index.php?act=retrieve" method="post">
            Kata kunci: <input type="text" name="keyword" />
            <input name = "Cari!" type="submit" />
            </form></center><hr />');
           
      $keyword = $_POST["keyword"];
           
      if ($keyword)  {
            $keyword = preproses($keyword);          
           
            print('Hasil retrieval untuk <font color=blue><b>' . $_POST["keyword"]  . '</b></font> (<font color=blue><b>' . $keyword . '</b></font>) adalah <hr />');
            ambilcache($keyword);
            //hitungsim($keyword);
      }          
} //end retrieve
     
//jika "cache"   
else if ($apa == "cache") {
      print("<table>");
      print("<tr><td>#</td><td>Query</td><td>Doc-ID</td><td>Value</td></tr>");
      $result = mysql_query("SELECT * FROM tbcache ORDER BY Query ASC");

      while($row = mysql_fetch_array($result)) {
           
            print("<tr>");
            print("<td>" . $row['Id'] . "</td><td>" . $row['Query'] . "</td><td>" . $row['DocId'] .
                      "</td><td>" . $row['Value'] . "</td>");
            print("</tr>");

      }          
      print("</table><hr />");     
}    
                 
//jika beranda atau tidak memilih apapun 
else {
      print("<p align=center>Pilih salah satu link di atas!</p><hr />");
}
?>
</body>
  

 Out put

Semoga bermanfat  


oleh fsakti FASANA IT | Tutorial Computer Updated at : 02.38
Anda suka artikel di atas ???
Klik salah satu atau ketiga tombol di bawah ini :

Jangan Lupa Baca Juga :

2 komentar:

boleh minta projectnya..?? punyaku koc error ya..
kalo boleh ini email saya : baiq.najah@gmail.com

 
Ke bawah Ke ATAS