Penilaian Otomatis Soal Essay Menggunakan Algoritma Jaccard dalam PHP Sederhana

Dalam penilaian jawaban soal dalam e-learning secara otomatis merupakan problem utama, berbeda dengan jawaban soal pilihan ganda. Agar dapat mengatasi isu ini, prinsip-prinsip yang harus diterapkan oleh sistem penilaian otomatis pada jawaban soal essay adalah konsistensi, efisiensi dalam waktu dan biaya, serta nilai obyektivitas yang dapat dipertanggungjawabkan. Salah satu cara untuk mengukur kesamaan antara jawaban mahasiswa dan jawaban yang diharapkan adalah dengan menggunakan teknik kemiripan string.

Terdapat dua jenis kemiripan string yang dapat digunakan yaitu kemiripan sintaktik kata, yang memperhitungkan struktur huruf penyusun kata, dan kemiripan arti kata, yang memperhitungkan arti kata. Kemiripan antara kalimat juga dapat dihitung berdasarkan arti keseluruhan kalimat, bukan hanya arti tiap kata.

Nilai kemiripan (similarity score) dinyatakan dalam rentang 0 hingga 1, dengan nilai 1 menunjukkan bahwa dua kata identik atau persis sama. Penggunaan teknik kemiripan string pada sistem penilaian otomatis dapat memberikan penilaian yang obyektif pada jawaban mahasiswa, namun penting untuk mempertimbangkan keterbatasan teknik ini sebelum menggunakannya.

Berikut ini saya tuliskan langkah membuat penilaian otomatis dari soal dan jawaban di Google form yang dikirim ke Google sheets dan diolah menggunakan bahasa pemrograman PHP di website.

  1. Buatlah soal 1 s/d soal 5 dengan jawaban bentuk paragraf di Google forms,
  2. Dalam menu Jawaban, klik link Lihat Spreadsheet sehingga muncul format Google sheets,
  3. Pada Google sheets, pilih menu File > Bagikan > Publikasikan ke web
  4. Jika link Publikasikan ke Web diklik maka akan muncul seperti gambar berikut:
  5. Pilih Tautan: Form Responses 1 dan Nilai dipisahkan koma (.csv)
  6. Copy link yang dihasilkan,
  7. Tempelkan link tadi di file data.php berikut  pada bagian $feed = ” seperti berikut:

    <?php

    //sesuaikan dengan link spreadsheet yang didapatkan sebelumnya
    $feed = ‘https://docs.google.com/spreadsheets/d/e/2PACX-xxxxxo7ZOyYxyZuPNOzsYPUUKnxXvHs-ma9aDuAuY56-4pC0p1KKV4BuL000h9uV2RUlDs3Ih1ThTzDl/pub?output=csv‘;

    // variabel ini akan digunakan untuk melooping data
    $keys = array();
    $newArray = array();

    //fungsi untuk mengkonversi csv ke array asosiatif
    function csvToArray($file, $delimiter) {
    if (($handle = fopen($file, ‘r’)) !== FALSE) {
    $i = 0;
    while (($lineArray = fgetcsv($handle, 4000, $delimiter, ‘”‘)) !== FALSE) {
    for ($j = 0; $j < count($lineArray); $j++) {
    $arr[$i][$j] = $lineArray[$j];
    }
    $i++;
    }
    fclose($handle);
    }
    return $arr;
    }

    // menjalankan fungsi dan memasukan data ke variabel $data
    $data = csvToArray($feed, ‘,’);

    $count = count($data) – 1;

    //row pertama digunakan untuk nama/header
    $labels = array_shift($data);

    //membuat nama-nama key dari header
    foreach ($labels as $label) {
    $keys[] = $label;
    }

    //menggabungkan key dan value
    for ($j = 0; $j < $count; $j++) {
    $d = array_combine($keys, $data[$j]);
    $newArray[$j] = $d;
    }
    ?>

  8. Buat file similarity.php berikut ini yang berisi algoritma Jaccard untuk membandingkan 2 set data

    <?php
    function jaccardSimilarity($string1, $string2) {

    // Preprocessing
    $string1 = strtolower(trim($string1));
    $string2 = strtolower(trim($string2));

    $string1 = preg_replace(‘/[^a-z0-9\s]+/’, ”, $string1);
    $string2 = preg_replace(‘/[^a-z0-9\s]+/’, ”, $string2);

    $string1 = preg_replace(‘/\s+/’, ‘ ‘, $string1);
    $string2 = preg_replace(‘/\s+/’, ‘ ‘, $string2);

    $string1 = explode(‘ ‘, $string1);
    $string2 = explode(‘ ‘, $string2);

    // Creating sets for each string
    $set1 = array_unique($string1);
    $set2 = array_unique($string2);

    // Calculating Jaccard similarity
    $intersection = count(array_intersect($set1, $set2));
    $union = count($set1) + count($set2) – $intersection;
    $jaccardSimilarity = $intersection / $union;

    // Converting to percentage
    $percentageSimilarity = round($jaccardSimilarity * 100, 2);

    return $percentageSimilarity;
    }
    ?>

  9. Sebagai contoh, sebagaimana soal 1 s/d soal 5 yang ditulis di Google forms, buatlah file index.php seperti berikut:
    Catatan: $string1 adalah jawaban soal yang sebenarnya, sedangkan $string2 adalah jawaban soal dari pengguna (user).
    ==
    Data $string1 sebaiknya disimpan dalam database Mysql supaya lebih ringkas programnya. Cara berikut hanya contoh untuk menghitung similarity $string1 dan $string2 secara sederhana supaya mudah dipraktekkan.
    ==
    Perhatikan kode berikut yang diambil dari kode Google sheets:
    integrity=”2PACX-xxxxxo7ZOyYxyZuPNOzsYPUUKnxXvHs-ma9aDuAuY56-4pC0p1KKV4BuL000h9uV2RUlDs3Ih1ThTzDl

    <!DOCTYPE html>
    <html lang=”en”>
    <head>
    <meta charset=”UTF-8″ /><meta name=”viewport” content=”width=device-width, initial-scale=1.0″ /><title>PENGOLAHAN JAWABAN</title><link rel=”stylesheet” href=”https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css” integrity=”2PACX-xxxxxo7ZOyYxyZuPNOzsYPUUKnxXvHs-ma9aDuAuY56-4pC0p1KKV4BuL000h9uV2RUlDs3Ih1ThTzDl” crossorigin=”anonymous” /><link href=”https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css” rel=”stylesheet”  integrity=”sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3″ crossorigin=”anonymous”>
    <script src=”https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js” integrity=”sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p” crossorigin=”anonymous”></script>
    <!– Add icon library –>
    <link rel=”stylesheet” href=”https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css”>
    <style>
    table, td, th {
    border: 0px solid #eeeeee;
    }

    table {
    border-collapse: collapse;
    width: 100%;
    }
    </style>
    </head>
    <body>
    <center>
    <h5>Penilaian Otomatis Menggunakan Algoritma “Jaccard similarity”</h5>
    <small>Algoritma Jaccard similarity digunakan untuk mengukur kemiripan antara dua set data atau himpunan data. Nilai kemiripan antara dua set dinyatakan dalam rentang 0 hingga 1, di mana nilai 1 menunjukkan kesamaan sempurna antara dua set, dan nilai 0 menunjukkan tidak adanya kesamaan antara dua set.</small>
    </center>
    <br/>
    <table class=”table table-striped table-hover”>
    <thead class=”table-success”>
    <tr>
    <td style=”color: blue;”>No</td>
    <td style=”color: blue;”>Waktu</td>
    <td style=”color: blue;”>Email</td>
    <td style=”color: blue;”>Jawaban 1</td>
    <td style=”color: blue;”>Jawaban 2</td>
    <td style=”color: blue;”>Jawaban 3</td>
    <td style=”color: blue;”>Jawaban 4</td>
    <td style=”color: blue;”>Jawaban 5</td>
    </tr>
    </thead>
    <?php
    $no = 1;
    include “data.php”;
    include “similarity.php”;
    ?>
    <!– $newArray adalah variabel yang didapatkan dari data.php –>
    <?php foreach ($newArray as $value) {
    ?>
    <tr>
    <td style=”text-align: center;”> <?php echo $no++; ?> </td>
    <td> <?php echo $value[“Timestamp”]; ?> </td>
    <td> <?php echo $value[“Email Address”]; ?> </td>
    <td> <?php
    $string1 = “Menurut teori Bronsted-Lowry, asam adalah zat yang dapat mengalami ionisasi untuk melepaskan ion hidrogen (H+) ketika direaksikan dengan basa. Sedangkan basa adalah zat yang dapat menerima ion hidrogen (H+) dari asam melalui reaksi transfer proton. Dalam reaksi asam dan basa menurut teori Bronsted-Lowry, asam berperan sebagai donor proton (H+) dan basa berperan sebagai akseptor proton (H+). Dalam reaksi tersebut, asam akan melepaskan proton (H+) ke basa, sehingga membentuk ion konjugat dari asam tersebut. Sebaliknya, basa akan menerima proton (H+) dari asam, sehingga membentuk ion konjugat dari basa tersebut.”;

    $string2 = $value[“Soal 1: Jelaskan apa yang dimaksud dengan asam dan basa menurut teori Bronsted-Lowry.”];
    echo “<small>”.$string2.”</small>”;
    echo “<br/><br/>”;

    $similarity = jaccardSimilarity($string1, $string2);
    echo “<strong>Nilai = “.$similarity.”</strong>”;
    ?>
    </td>
    <td> <?php
    $string1 = “Perbedaan antara ikatan ionik dan ikatan kovalen adalah 1) Ikatan ionik terbentuk karena gaya tarik-menarik elektrostatik antara ion-ion positif dan negatif, sedangkan ikatan kovalen terbentuk karena gaya tarik-menarik antara pasangan elektron yang dibagikan oleh dua atom.
    2) Ikatan ionik lebih kuat daripada ikatan kovalen. Ikatan ionik biasanya membentuk kristal padat dan rapuh, sementara ikatan kovalen dapat membentuk padatan, cairan, atau gas.
    3) Ikatan ionik terutama terjadi antara logam dan non-logam, sedangkan ikatan kovalen terjadi antara non-logam.
    4) Padatan ionik umumnya tidak menghantarkan listrik, tetapi larutan ionik dan cairan dapat menghantarkan listrik. Ikatan kovalen yang tidak larut dalam air biasanya tidak menghantarkan listrik.
    5) Ikatan ionik memiliki karakteristik anion dan kation yang terbentuk dari transfer elektron, sedangkan ikatan kovalen memiliki karakteristik orbital molekul yang terbentuk dari pembagian elektron.
    6) Ikatan ionik melibatkan transfer elektron dari satu atom ke atom lain, sementara ikatan kovalen melibatkan pembagian elektron antara atom-atom yang terlibat.”;
    $string2 = $value[“Soal 2: Jelaskan perbedaan antara ikatan ionik dan ikatan kovalen.”];
    echo “<small>”.$string2.”</small>”;
    echo “<br/><br/>”;

    $similarity = jaccardSimilarity($string1, $string2);
    echo “<strong>Nilai = “.$similarity.”</strong>”;
    ?>
    </td>
    <td>
    <?php
    $string1 = “Pada umumnya, semakin besar energi ikatan suatu molekul, semakin sulit molekul tersebut terionisasi atau mengalami polarisasi, sehingga molekul tersebut cenderung tidak polar. Sebaliknya, semakin rendah energi ikatan suatu molekul, semakin mudah molekul tersebut terionisasi atau mengalami polarisasi, sehingga molekul tersebut cenderung polar.”;
    $string2 = $value[“Soal 3: Bagaimana energi ikatan mempengaruhi sifat-sifat kepolaran molekul?”];
    echo “<small>”.$string2.”</small>”;
    echo “<br/><br/>”;
    $similarity = jaccardSimilarity($string1, $string2);
    echo “<strong>Nilai = “.$similarity.”</strong>”;
    ?>

    </td>
    <td>
    <?php
    $string1 = “Ikatan hidrogen dapat mempengaruhi kelarutan molekul dalam air karena sifat polar dari air dan kemampuan ikatan hidrogen dalam membentuk ikatan antara molekul air dan molekul-molekul polar lainnya. Secara umum, semakin banyak ikatan hidrogen yang dapat dibentuk oleh molekul polar, semakin besar kemungkinan molekul tersebut larut dalam air. Sebaliknya, molekul yang tidak memiliki kemampuan membentuk ikatan hidrogen cenderung kurang larut dalam air.”;
    $string2 = $value[“Soal 4: Mengapa ikatan hidrogen mempengaruhi kelarutan molekul dalam air?”];
    echo “<small>”.$string2.”</small>”;
    echo “<br/><br/>”;
    $similarity = jaccardSimilarity($string1, $string2);
    echo “<strong>Nilai = “.$similarity.”</strong>”;
    ?>;

    </td>
    <td>
    <?php
    $string1 = “Air adalah zat yang dapat menghantarkan listrik dengan baik, sementara minyak adalah isolator listrik yang buruk. Air adalah senyawa polar dan memiliki struktur molekul yang membentuk ikatan hidrogen, yang memungkinkan muatan listrik berpindah dari satu molekul ke molekul lain. Oleh karena itu, air dapat menghantarkan listrik dengan baik. Minyak adalah senyawa nonpolar yang tidak memiliki muatan listrik yang signifikan pada molekulnya. Oleh karena itu, minyak adalah isolator listrik yang buruk dan tidak dapat menghantarkan listrik.”;
    $string2 = $value[“Soal 5: Bandingkan sifat konduktivitas listrik air dan minyak.”];
    echo “<small>”.$string2.”</small>”;
    echo “<br/><br/>”;
    $similarity = jaccardSimilarity($string1, $string2);
    echo “<strong>Nilai = “.$similarity.”</strong>”;
    ?>
    </td>
    </tr>
    <?php } ?>
    <tr><td colspan=”8″ style=”background-color:#eeeeee;”></td></tr>
    </table>

    </body>
    </html>

  10. Tempatkan 3 file di atas di dalam satu folder di website
  11. Pengguna menjawab soal melalui Google forms dan melihat hasilnya melalui file index.php, misal https://namadomain.com/namafolder/index.php 

    Untuk contoh soal ini dapat diakses melalui link Google forms berikut: SOAL

  12. Selesai

Selamat mencoba, selalu harus ada usaha untuk mendapatkan program yang tidak error. Jangan putus asa!

Leave a Reply

Your email address will not be published. Required fields are marked *