Sabtu, 07 Mei 2022

PHP Winnowing dan Ngram

 

Algoritma Winnowing merupakan algoritma pencocokan string yang akan menggunakan fungsi hash sebagai pembanding antara string yang dicari (m) dengan substring pada teks (n).

Artinya  jika hash value keduanya adalah sama maka akan dilakukan perbandingan sekali lagi terhadap karakter-karakternya. Apabila hasil keduanya tidak sama, maka substring akan bergeser ke kanan. Pergeseran dilakukan sebanyak (n-m) kali. Perhitungan nilai hash yang efisien pada saat pergeseran akan mempengaruhi performa dari algoritma ini. (David Indra Lesmana, 2012).

Langkah-langkah dalam Algortima Winnowing:

1. Normalisasi text : Lowertext + Stopword (menghilangkan tanda baca, spasi, angka)  + Stemming (mengubah ke kata dasar).

2. Membagi teks kedalam gram-gram yang ditentukan nilai n-gramnya+window+base

3. Mencari nilai hash dengan fungsi hash dan fingerprint dari tiap kata yang terbentuk sesuai batasan window nya

4. Mencari nilai fingerprint yang sama antara dua dokumen/teks


Parsing k-gram adalah membentuk pola kata pada teks dengan memecah kata menjadi potongan-potongan dimana setiap potongan mengandung karakter sebanyak k.N-gram merupakan sebuah metode yang diaplikasikan untuk pembangkitan kata ataukarakter.Metode N-grams ini digunakan untuk mengambil potongan-potongankarakter huruf sejumlah k dari sebuah kata yang secara kontinuitas dibaca dari teks sumber hingga akhir dari dokumen.

Setelah melakukan Parsing N-gram maka langkah selanjutnya adalah hashing terhadap seluruh pecahan string hasil dari proses parsing k-gram. Hashing itu sendiri adalah suatu cara untuk mentransformasi string menjadi suatu nilai yang unik (hash value)dengan panjang tertentu (fixed-length) yang berfungsi sebagai penanda string tersebut. Pada sistem ini proses hashing memanfaatkan tabel ascii dengan rumus Hash (Diana dkk,2011):


Keterangan :

c = Nilai ascii karakter (desimal)

k = Banyak karakter (indeks karakter)

b = Basis Bilangan (nilai dari basis bilangan harus bilangan prima).

Alasan kenapa Basis bilangan (b) harus dipilih bilangan prima yang cukup besar, adalah untuk mengurangi kemungkinan adanya dua hash value yang sama.

Normalisasi Tabel:






Penampakan Hasil Script PHP Winnowing



https://media.neliti.com/media/publications/68455-ID-none.pdf
<?php

$time_start = microtime_float();

ini_set('memory_limit', '256M');

$tanggal=WKT(date("Y-m-d"));

$gram=5;
$base=3;
$window=4;
				
if(isset($_POST["Proses"])){
	$gram=strip_tags($_POST["gram"]);
	$base=strip_tags($_POST["base"]);
	$judul=strip_tags($_POST["judul"]);
	$abstrak=strip_tags($_POST["abstrak"]);
	$id_pengujian=strip_tags($_POST["q"]);
	$window=strip_tags($_POST["window"]);
}
 
$sql="select * from `$tbpengujian` order by `id_pengujian` desc";
if(isset($_GET["q"])){
	$id_pengujian=$_GET["q"];
	$sql="select * from `$tbpengujian` where `id_pengujian`='$id_pengujian'";
}

$d=getField($conn,$sql);
	$id_pengujian=$d["id_pengujian"];
	$judul=$d["judul"];
	$abstrak=$d["abstrak"];
	$rekapitulasi=$d["rekapitulasi"];
	$id_user=$d["id_user"];
	$kategori=$d["kategori"];
	$keterangan=$d["keterangan"];
	$norm=$d["normalisasi"];
	$window=$d["window"];
	$gram=$d["ngram"];
	$base=$d["base"];
?>
 <link rel="stylesheet" href="jsacordeon/jquery-ui.css">
  <link rel="stylesheet" href="resources/demos/style.css">
<script src="jsacordeon/jquery-1.12.4.js"></script>
  <script src="jsacordeon/jquery-ui.js"></script>
  <script>
  $( function() {
    $( "#accordion" ).accordion({
      collapsible: true
    });
  } );
  </script>
</head>
<body>
 
<div id="accordion">
<h3>Form Uji</h3>
<div>

<form action="" method="post" enctype="multipart/form-data">
<table border="1" width="90%" class="table table-hover rable-striped table-bordered" >
<tr>
<td>Judul
<td>:
<td>
<textarea name="judul" class="form-control" required cols="55" rows="2"><?php echo $judul;?></textarea>
</tr>

<tr>
<td>Abstrak
<td>:
<td>
<textarea name="abstrak" class="form-control" cols="55" rows="3"><?php echo $abstrak;?></textarea>
</tr>


<tr>
<td>
Konfigurasi
<td>:
<td>
<label>N-gram</label> 
<select name="gram" id="gram"  required />
<option <?php if($gram=="choose"){echo"selected";}?>>Pilih Angka</option>
<option value="3" <?php if($gram=="3"){echo"selected";}?>>3</option>
<option value="4" <?php if($gram=="4"){echo"selected";}?>>4</option>
<option value="5" <?php if($gram=="5"){echo"selected";}?>>5</option>
<option value="6" <?php if($gram=="6"){echo"selected";}?>>6</option>
<option value="7" <?php if($gram=="7"){echo"selected";}?>>7</option>
<option value="8" <?php if($gram=="8"){echo"selected";}?>>8</option>
<option value="9" <?php if($gram=="9"){echo"selected";}?>>9</option>
<option value="10" <?php if($gram=="10"){echo"selected";}?>>10</option>
</select>
<label>Base</label> 
<select name="base" id="base" required />
<option <?php if($base=="choose"){echo"selected";}?>>Angka Prima</option>
<option value="2" <?php if($base=="2"){echo"selected";}?>>2</option>
<option value="3" <?php if($base=="3"){echo"selected";}?>>3</option>
<option value="5" <?php if($base=="5"){echo"selected";}?>>5</option>
<option value="7" <?php if($base=="7"){echo"selected";}?>>7</option>
<option value="11" <?php if($base=="11"){echo"selected";}?>>11</option>
<option value="13" <?php if($base=="13"){echo"selected";}?>>13</option>
<option value="17" <?php if($base=="17"){echo"selected";}?>>17</option>
</select>
<label>Window</label> 
<select name="window" id="window"  required />
<option <?php if(window){echo"selected";}?>>Pilih Angka</option>
<option value="3" <?php if($window=="3"){echo"selected";}?>>3</option>
<option value="4" <?php if($window=="4"){echo"selected";}?>>4</option>
<option value="5" <?php if($window=="5"){echo"selected";}?>>5</option>
<option value="6" <?php if($window=="6"){echo"selected";}?>>6</option>
<option value="7" <?php if($window=="7"){echo"selected";}?>>7</option>
<option value="8" <?php if($window=="8"){echo"selected";}?>>8</option>
<option value="9" <?php if($window=="9"){echo"selected";}?>>9</option>
<option value="10" <?php if($window=="10"){echo"selected";}?>>10</option>
</select>
</tr>

<tr>
<td>
<td colspan="2">
<input name="q" type="hidden" id="q" value="<?php echo $id_pengujian;?>" />
<input name="Proses" type="submit" id="Proses" value="Analisa" />
<a href="?mnu=winnowing"><input name="Batal" type="button" id="Batal" value="Clear" /></a>
</td>

</tr> 
</table>
</form>
<?php
if(isset($_POST["Proses"])){	
	$window=strip_tags($_POST["window"]);
	$gram=strip_tags($_POST["gram"]);
	$base=strip_tags($_POST["base"]);
	$judul=strip_tags($_POST["judul"]);
	$abstrak=strip_tags($_POST["abstrak"]);
	$gab="$judul $abstrak";
	$norm=getNorm($gab);
}

//$norm="deteksiplagiarisme";////
echo "<h1><font color='#ffAA08'>$norm</font></h1><hr>";
echo "<h3><font color='#AA08ff'>Ngram: $gram, Base: $base, Window $window,</font></h3>";
$array = prosesWIN($norm,$gram,$base,$window); 

$arV=$array[0];
$arS=$array[1];
$arI=$array[2];
$arGS=$array[3];
$arGV=$array[4];
echo "<br><img src='ypathfile/winnowing1.png'></br>";

$gab1=gabAR($arS,$arV,$arGV);
echo $gab1;
echo "<br><img src='ypathfile/coeff.png'></br>";

$ars1 = $array[3];
$arv1 = $array[4];
$arr1=getUnix($arv1);
  
$nom=0;
$maxkemiripan=0;
$idmax=0;
$rekapitulasimax="";
$id_crawlingmax=0;
$ketmax="";

 $sql="select * from `$tbcrawling` order by `id_crawling` asc";
  $jum=getJum($conn,$sql);
		if($jum > 0){							
	$arr=getData($conn,$sql);
		foreach($arr as $d) {		
				$id_crawling=$d["id_crawling"];
				$judul=ucwords($d["judul"]);
				$abstrak=$d["abstrak"];
				$normalisasi=$d["normalisasi"];
				$kategori=$d["kategori"];
				$keterangan2=$d["keterangan"];
				$nom++;
		echo "<b><font color='green'>".$nom. ".".$judul."</font></b><br>"; 
		echo "<i><small><font color='magenta'>$normalisasi</font></small><br>"; 
		
			$array = prosesWIN($normalisasi,$gram,$base,$window);
			$arV2=$array[0];
			$arS2=$array[1];
			$arI2=$array[2];
			$ars2 = $array[3];
			$arv2 = $array[4];
			$gab2=gabAR($arS2,$arV2,$arv2);
			echo $gab2;

			$arr=array_merge($arr1,$arv2);
			$arr2=getUnix($arr);
			$sama=0;
			$gabv="";
			$H1=count($arr1);
			$H2=count($arv2);
			$H3=count($arr2);
			for($i=0;$i<$H1;$i++){
				for($j=0;$j<$H3;$j++){
					if($arr1[$i]==$arr2[$j]){
						$sama=$sama+1;
						$gabv.="{".$arr2[$j]."} ";
						//break;
					}
				}
			}

			$acc=($sama/$H3) *100;
			$acc=round($acc,2);
			$rekapitulasi= "Jumlah Hash DataUji : $H1<br>";
			$rekapitulasi.=  "Jumlah Hash Datalatih : $H2<br>";
			$rekapitulasi.=  "Fingerprint Sama: $gabv<br>";
			$rekapitulasi.=  "<font color=\"red\"><b>Jumlah Hash Irisan / Join : $sama / $H3 =$acc %</b></font>";

			echo"<hr>";
			echo $rekapitulasi;
			echo"<hr>";

			if($maxkemiripan<$acc){
				$maxkemiripan=$acc;
				$idmax=$id_crawling;
				$rekapitulasimax=$rekapitulasi;
				$id_crawlingmax=$id_crawling;
				$ketmax="$sama / $H3 =$acc %";
			}
 
	}//foreach
}//jum foreach
 
$kategori="Tidak Plagiarism"; 
if($maxkemiripan>50){$kategori="Plagiarism Tinggi";}
else if($maxkemiripan>30){$kategori="Plagiarism Sedang";}
else if($maxkemiripan>20){$kategori="Plagiarism Rendah";}	 


$time_end = microtime_float();
$waktu = $time_end - $time_start;

  $sql="update `$tbpengujian` set 
	`window`='$window',`ngram`='$gram',`id_crawling`='$id_crawlingmax',
	`rekapitulasi`='$rekapitulasimax',`waktu`='$waktu',`prosentase`='$maxkemiripan',
	`base`='$base',`kategori`='$kategori',`keterangan`='$ketmax' where `id_pengujian`='$id_pengujian'";
	$ubah=process($conn,$sql); 
	
	echo "<font color='blue'><b><h1>Kategori $kategori : $maxkemiripan %</h1><br>lama proses: $waktu ms</b></font>";	
?>
</div>
</div>


 
<?php
function gabAR($ar1,$ar2,$ar3){
$c=count($ar1);
$gabs="";
$gabv="";
for($i=0;$i<$c;$i++){
	$ds=$ar1[$i];
	$dv=$ar2[$i];
	$df=$ar3[$i];
	$gabs.="{".$ds."}";
	$gabv.="{".$dv."}";
	$gabf.="{".$df."}";
}
$gab="<small>
<font color='red'>GRAM:$gabs</font><br>
<font color='green'>HASH:$gabv</font><br>
<font color='blue'>FINGER:$gabf</font><br></small>";
return $gab;
}
 ?>

Formulas Kemiripan:




Tidak ada komentar:

Posting Komentar

global_priv WARNING Selalu

 Jika muncul pesan kesalahan: Warning in .\libraries\classes\Dbal\DbiMysqli.php#209  mysqli::query(): (HY000/1034): Index for table 'glo...