3/08/2017

Deteksi Kemiripan Teks (Text Similarity) dengan Php dan Jquery

Hello.. Bertemu lagi ditutorial php dan jquery, kali ini yang mau saya bahas dan berikan tutorialnya adalah mengenai cara mendeteksi tingkat kemiripan teks atau similar text ataupun text similarity dengan menggunakan html, css, php dan jquery. 
Ini berguna apabila kita akan copy paste artikel dari website orang lain kemudian kita ingin merubah agar tidak dianggap sebagai plagiat (plagiarism) oleh penulis asli dari website yang kita copy tersebut. Walaupun pada dasarnya copy paste karya orang lain tidak diperbolehkan, namun jika kita ingin improvisasi lebih saya rasa sah-sah saja selama itu tidak benar-benar mirip dengan aslinya dan melanggar UU ITE.

Aplikasi ini mengadopsi function yang dibuat oleh Rochak Chauhan (thanks to Rochak Chauhan). tapi sebelum saya menemukan function ini, php sendiri telah menyediakan function similar_text untuk mendeteksi tingkat kemiripan kata/text, hanya saja kita tidak bisa mengetahui berapa tingkat perbedaan dari text tersebut? Maka dari itu secara tidak sengaja juga saya menemukan function Rochak Chauhan. Nanti akan saya coba bagaimana pemakaian function similar_text tersebut dibagian akhir artikel ini.

Oh ya, tutorial kali ini masih berhubungan dengan tutorial saya yang membahas Penghitung Jumlah Kata (Word Counter) Dengan PHP dan jQuery karena pada tutorial kali ini saya menggabungkan penghitung kata dengan pendeteksi kemiripan kata. Jadi nanti sintaksnya akan terlihat panjang, saya sarankan untuk membaca artikel Penghitung Jumlah Kata (Word Counter) Dengan PHP dan jQuery terlebih dahulu agar nanti tidak terlalu bingung. kita mulai tutorialnya~

Menggunakan function Rochak Chauhan : 

Pertama, seperti biasa buat project baru, karena kita menggunakan jquery juga maka sediakan file jquery nya. Saya tidak akan menjelaskan bagaimana melakukan proses ini karena pasti kalian sudah tahu.

Kedua, buat file index.php, ketik code berikut ini
<!DOCTYPE html>
<!--
Creator : Indra Ahmad Iskandar
Email : indraiskandar10@gmail.com
Visit : http://indra92.blogspot.co.id
-->
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style>
            body{background: gainsboro;}
            .tabel-input{margin:0 auto;}
            #info{text-align: center; margin-top: 20px;}
            #info p{font-size: 1.3em; font-weight: bold; color: gray}
            .center{text-align: center;}
            .center .text {width: 99%; height: 400px;}
            .button {width: 100px;height: 40px; background: cornflowerblue; color: #fff; cursor: pointer; border-radius: 5px; font-weight: bold}
            .button:hover{opacity: 0.8;}
            .kalimat1 {background: cornflowerblue;}
            .kalimat2 {background: cornflowerblue;}
            .kalimat1, .kalimat2{color: #eee;}
            .ta1:hover{border-color: cornflowerblue;}
            .ta2:hover{border-color: cornflowerblue;}
            .logo {position: absolute; z-index: 1; left: 620px; top: 250px; margin: 0 auto;}
            .logo img{width: 100px; opacity: 0.5;}
            #display_count1, #display_count2, #info1, #info2, .gray{color: gray; font-weight: bold;}
        </style>
        <script src="jquery-2.2.3.min.js"></script>
    </head>
    <body>
        <form id="formInput">
            <table border="0" width="90%" class="tabel-input">
                <div class="logo"><img src="indra92-logo.png"></div>
                <tr>
                    <td class="center kalimat1"><h3>Kalimat ke-1 (Artikel Asli)</h3></td>
                    <td class="center kalimat2"><h3>Kalimat ke-2 (Artikel Baru)</h3></td>
                </tr>
                <tr>
                    <td class="center"><textarea class="text ta1" name="ta1" placeholder="ketikkan satu atau lebih kalimat.."></textarea></td>
                    <td class="center"><textarea class="text ta2" name="ta2" placeholder="ketikkan satu atau lebih kalimat.."></textarea></td>
                </tr>
                <tr>
                    <td class="center gray"> Total Kata : <span id="display_count1">0</span> kata. 
                        <div id="info1">Tidak ada info</span></div></td>
                    <td class="center gray"> Total Kata : <span id="display_count2">0</span> kata. 
                        <div id="info2">Tidak ada info</span></div></td>
                </tr>
                <tr>
                    <td colspan="2" class="center">
                        <input type="button" name="process" id="process" class="button" value="Proses">
                    </td>
                </tr>
            </table>
            <div id="info"><p>.:: Hasil kemiripan kalimat akan muncul setelah anda mengisi kolom diatas ::.</p></div>
        </form>
        <script>
            $(".ta1").on('keydown', function (e) {
                var words = $.trim(this.value).length ? this.value.match(/\S+/g).length : 0;
                if (words == 0) {
                    $('#display_count1').text(words);
                    $('#info1').text('Tidak ada info').css('color', '');
                } else if (words <= 300) {
                    $('#display_count1').text(words);
                    $('#info1').text('Masih Kurang ke 300 kata').css('color', 'red');
                } else {
                    $('#display_count1').text(words);
                    $('#info1').text('Telah Mencapai 300 kata').css('color', 'green');
                }
            });
            $(".ta2").on('keydown', function (e) {
                var words = $.trim(this.value).length ? this.value.match(/\S+/g).length : 0;
                if (words == 0) {
                    $('#display_count2').text(words);
                    $('#info2').text('Tidak ada info').css('color', '');
                } else if (words <= 300) {
                    $('#display_count2').text(words);
                    $('#info2').text('Masih Kurang ke 300 kata').css('color', 'red');
                } else {
                    $('#display_count2').text(words);
                    $('#info2').text('Telah Mencapai 300 kata').css('color', 'green');
                }
            });
            $('#process').click(function (e) {
                e.preventDefault();
                var kalimat1 = $('.ta1').val();
                var kalimat2 = $('.ta2').val();
                if (kalimat1 == '' || kalimat2 == '') {
                    $('#info').html('<p>Kalimat ke-1 dan(atau) ke-2 tidak boleh kosong!!</p>');
                } else {
                    $.ajax({
                        type: "POST",
                        url: "action.php",
                        data: $("#formInput").serialize(), // serializes the form's elements.
                        success: function (data)
                        {
                            //console.log(data);
                            $('#info').html(data);
                        }
                    });
                }
            });
        </script>
    </body>
</html>


Ketiga, buat file phpCompareStrings.inc.php (hati-hati dengan penamaan file nya), lalu ketik code ini 
<?php

/**
 * This class compares two strings and outputs the similarities  as percentage
 *
 * @author Rochak Chauhan <rochak@dmwtechnologies.com>
 */
class PhpCompareStrings {

    private $str1 = "";
    private $str2 = "";
    private $arr1 = array();
    private $arr2 = array();

    /**
     * Contructor fucntion
     *
     * @param string $str1
     * @param string $str2
     * @return string
     */
    function __construct($str1, $str2) {
        $str1 = trim($str1);
        $str2 = trim($str2);
        if ($str1 == "") {
            trigger_error("First parameter can not be left blank", E_USER_ERROR);
        } elseif ($str2 == "") {
            trigger_error("Second parameter can not be left blank", E_USER_ERROR);
        } else {
            $this->str1 = $str1;
            $this->str2 = $str2;
            $this->arr1 = explode(" ", $str1);
            $this->arr2 = explode(" ", $str2);
        }
    }

    /**
     * Function to compare two strings and return the similarity in percentage
     *
     * @access public
     * @return float
     */
    public function getSimilarityPercentage() {
        $str1 = $this->str1;
        $str2 = $this->str2;
        $tmp1 = $this->arr1;
        $c1 = count($tmp1);
        $tmp2 = $this->arr2;
        $c2 = count($tmp2);
        $count = $c1;
        $t1 = $tmp1;
        $t2 = $tmp2;
        if ($c2 > $c1) {
            $count = $c2;
            $t1 = $tmp1;
            $t2 = $tmp2;
        }
        $result = array();
        for ($i = 0; $i < $count; $i++) {
            if (@$t1[$i] == @$t2[$i]) {
                $result[] = 1;
                $resultSame[] = 0;
            } else {
                $result[] = 0;
                $resultSame[] = levenshtein(@$t1[$i], @$t2[$i]);
            }
        }
        $countArray = array_count_values($result);
        $one = 0;
        $zero = 0;
        if (isset($countArray[0])) {
            $zero = $countArray[0];
        }
        if (isset($countArray[1])) {
            $one = $countArray[1];
        }
        if ($one === 0) {
            $percent = number_format(0, 2);
        } elseif ($zero === 0) {
            $percent = number_format(100, 2);
        } else {
            $per = ($one / ($one + $zero)) * 100;
            $percent = number_format($per, 2);
        }
        if ($c1 === $c2) {
            $words1 = array_diff_assoc($tmp1, $tmp2);
            $words2 = array_diff_assoc($tmp2, $tmp1);
            $sum = array_sum($resultSame);
            $sum = ($sum / 100);
            $percent = ($percent - $sum);
        }
        return $percent;
    }

    /**
     * Function to compare two strings and return the difference in percentage
     *
     * @access public
     * @return float
     */
    public function getDifferencePercentage() {
        $per = $this->getSimilarityPercentage();
        return 100 - $per;
    }

}

?>


Keempat, buat file action.php, ketik code ini
<?php

if (isset($_POST['ta1'])) {
    $string1 = $_POST['ta1'];
    $string2 = $_POST['ta2'];
    require("phpCompareStrings.inc.php");
    $phpCompareStrings = new PhpCompareStrings($string2, $string1);
    $percent = $phpCompareStrings->getSimilarityPercentage();
    $percent2 = $phpCompareStrings->getDifferencePercentage();
    echo '<p>Kalimat ke-1 dan ke-2 memiliki kemiripan = ' . $percent . '% dan perbedaan ' . $percent2 . '%</p>';
}
?>

Kelima, save dan coba jalankan

Lalu, bagaimana cara menggunakan function similar_text bawaan dari php?, tidak sulit hanya tinggal merubah file action menjadi seperti ini :

Menggunakan function similar_text Php :
<?php

if (isset($_POST['ta1'])) {
    $string1 = $_POST['ta1'];
    $string2 = $_POST['ta2'];
    similar_text($string1, $string2, $persen);
    echo '<p>Kalimat ke-1 dan ke-2 memiliki kemiripan = ' . $persen . '%</p>';
}
?>

Penampakan Hasil Akhir :

Video Demo :

Download Project nya disini (Deteksi_plagiat.zip)

Terimakasih dan sampai bertemu lagi di tutorial berikutnya ...

Mulai menulis blog sejak tahun 2012. Saat ini sedang disibukkan dengan karir dibidang IT nya.

Komentar yang mengandung spam / link aktif akan secara otomatis disembunyikan. Mohon maaf atas ketidaknyamanan jika pertanyaan telat ataupun tidak terbalas karena keterbatasannya waktu. Silahkan hubungi kami di menu Contact Us. Terimakasih
EmoticonEmoticon