Koreksi soal pilihan ganda menggunakan PHP udah sering kan, dan lumayan tidak terlalu sulit. Karena soal pilihan ganda memang sudah pasti jawabannya (kalo ga A, B, C, D atau E). Tapi bagaimana dengan essay?

Memang tidak ada perhitungan yang pasti dengan soal essay, banyak metode dan cara untuk otomatisasi koreksi jawaban essay. Saya ingin membagi script PHP untuk penilaian soal essay. Saya akui script saya ini belum sempurna, tapi lumayan akurat lah. O iya, saya menggunakan metode parsing dan keyword. Artinya string jawaban dan kunci jawaban essay di bagi-bagi dalam beberapa kata dan dimasukkan ke array lalu dicocokkan. Langsung saja ya..


function koreksiEssay($words,$wer,$max){ //$words -> untuk keyword jawaban dari guru; $wer -> jawaban dari siswa; $max -> bobot soal

/*

Script ini ditulis oleh Ibonk
url : https://buatkamusaja.wordpress.com/
laporan kesalahan dan perbaikan kirim email ke i-bonk@hotmail.com

*/
 $j = 0;

 $key = explode(",",$words);

 $ans = explode(" ",$wer);

 foreach($ans as $jaw){

 $n = strlen($jaw);

 $sub = substr($jaw,$n-1,$n);

 if(($sub ==  ',') or ($sub ==  '.') or ($sub ==  '!') or ($sub ==  '?')){

 $kata['ans'][] = substr($jaw,0,$n-1);

 }else{

 $kata['ans'][] = $jaw;

 }

 }

 foreach($key as $kunci){

 $n = strlen($kunci);

 $sub = substr($jaw,$n-1,$n);

 if(($sub ==  ',') or ($sub ==  '.') or ($sub ==  '!') or ($sub ==  '?')){

 $kata['key'][] = substr($kunci,0,$n-1);

 }else{

 $kata['key'][] = $kunci;

 }

 }

 foreach($kata['ans'] as $tempo){

 foreach($kata['key'] as $rary){

 if(strtolower($tempo) == strtolower($rary)){

 $j++; //hitung kecocokkan kata kunci dan jawaban siswa

 }

 }

 }

 if($j >= count($kata['key'])){

 $j = count($kata['key']);
 $nilai = $max;

 }else{

 $nilai = $max * ($j / count($kata['key']));    //menentukan nilai akhir

 }

 return (int)$nilai;

}

Penjelasan script

<pre>$key = explode(",",$words);

 $ans = explode(" ",$wer);
</pre>

Membagi-bagi jawaban dan kunci jawaban dan memasukkannya ke dalam array.

<pre>foreach($ans as $jaw){

 $n = strlen($jaw);

 $sub = substr($jaw,$n-1,$n);

 if(($sub ==  ',') or ($sub ==  '.') or ($sub ==  '!') or ($sub ==  '?')){

 $kata['ans'][] = substr($jaw,0,$n-1);

 }else{

 $kata['ans'][] = $jaw;

 }

 }

 foreach($key as $kunci){

 $n = strlen($kunci);

 $sub = substr($jaw,$n-1,$n);

 if(($sub ==  ',') or ($sub ==  '.') or ($sub ==  '!') or ($sub ==  '?')){

 $kata['key'][] = substr($kunci,0,$n-1);

 }else{

 $kata['key'][] = $kunci;

 }

 }</pre>

Menjamin kata-kata dalam array dari jawaban dan kunci jawaban bebas dari beberapa tanda baca seperti titik (.), koma (,), tanda seru (!), dan tanda tanya (?). Setelah itu dimasukan ke dalam array yang berbeda.

<pre>foreach($kata['ans'] as $tempo){

 foreach($kata['key'] as $rary){

 if(strtolower($tempo) == strtolower($rary)){

 $j++; //hitung kecocokkan kata kunci dan jawaban siswa

 }

 }

 }

 if($j >= count($kata['key'])){

 $j = count($kata['key']);
 $nilai = $max;

 }else{

 $nilai = $max * ($j / count($kata['key']));    //menentukan nilai akhir

 }

 return (int)$nilai;</pre>

Menghitung nilai akhirnya dengan nilai akhir bertipe integer. Mengapa integer? Biar gampang menhitung nilai keseluruhan dari beberapa soal.

O iya, Terdapat batasan-batasan yang saya utarakan untuk script di atas, antara lain keyword kunci jawaban berupa kata-kata yang dipisahkan oleh koma (,) dan tidak boleh ada kata yang sama.

Untuk lebih jelasnya silahkan download source code -nya.

Kritik dan sarannya saya sangat harapkan.. Terima kasih..