PHP Stemmer Bahasa Indonesia

Stemming dalam Bahasa Indonesia: Panduan Lengkap untuk Information Retrieval

Pada kesempatan kali ini, kita akan membahas tentang stemming dalam konteks Information Retrieval (IR) untuk Bahasa Indonesia. Artikel ini merupakan bagian dari tugas dalam mata kuliah “Sistem Temu Kembali Informasi,” yang dalam bahasa Inggris dikenal sebagai “Information Retrieval System” atau disingkat “IR.”

Apa Itu Stemming dan Hubungannya dengan IR?

Stemming adalah proses untuk menemukan bentuk dasar dari sebuah kata dengan menghilangkan semua imbuhan, baik awalan, sisipan, akhiran, maupun kombinasi dari awalan dan akhiran. Tujuan utama dari stemming adalah menyederhanakan variasi bentuk kata menjadi bentuk dasar yang sesuai dengan struktur morfologi bahasa Indonesia.

Peran Stemming dalam Information Retrieval

Dalam Information Retrieval, ada dua proses utama: Indexing dan Searching. Proses Indexing terdiri dari beberapa subproses, termasuk:

  1. Word Tokenization: Mengubah dokumen menjadi kumpulan term dengan menghapus tanda baca dan mengubah term menjadi huruf kecil.
  2. StopWord Removal: Menghapus kata-kata umum yang sering muncul seperti “dan,” “atau,” “tidak,” dan sebagainya.
  3. Stemming: Mengubah kata-kata turunan menjadi kata dasar.
  4. Word Weighting: Menetapkan bobot pada setiap term dalam dokumen.

Stemming adalah bagian penting dari subproses Indexing, dan akan dibahas lebih detail dalam tutorial ini.

Algoritma Stemming untuk Bahasa Indonesia

Beberapa algoritma yang digunakan untuk stemming Bahasa Indonesia termasuk:

  • Algoritma Nazief dan Andriani
  • Algoritma Arifin dan Setiono
  • Algoritma Idris dan Mustofa
  • Algoritma Vega
  • Algoritma Ahmad, Yussof, dan Sembok
  • Algoritma Porter

Tutorial ini akan fokus pada Algoritma Porter. Algoritma ini awalnya dikembangkan oleh Martin Porter pada tahun 1980 untuk bahasa Inggris. Namun, karena perbedaan morfologi antara bahasa Inggris dan Bahasa Indonesia, algoritma ini kemudian dikembangkan khusus untuk Bahasa Indonesia oleh W.B. Frakes pada tahun 1992.

Proses Stemming dengan Algoritma Porter

Proses stemming menggunakan algoritma Porter untuk Bahasa Indonesia melibatkan beberapa tahapan sebagai berikut (Agusta, Ledy, 2009):

  1. Menghapus partikel
  2. Menghapus kata ganti milik (Possessive Pronoun)
  3. Menghapus awalan pertama
  4. a. Menghapus awalan kedua b. Menghapus akhiran
  5. a. Menghapus akhiran b. Menghapus awalan kedua

Tingkat Kerumitan dan Kesulitan dalam Stemming

Struktur morfologi Bahasa Indonesia cenderung lebih kompleks dibandingkan dengan bahasa Inggris. Tantangan utama termasuk membedakan antara prefiks dan sufiks, terutama ketika salah satu suku kata merupakan bagian dari imbuhan dan kata dasar memiliki lebih dari dua suku kata (Musthafa, Aziz, 2009).

Kamus Kecil untuk Mendukung Proses Stemming

Beberapa kamus kecil dapat digunakan untuk mempermudah proses stemming:

  1. Kamus kata dasar dengan partikel (e.g., "masalah")
  2. Kamus kata dasar dengan partikel berprefiks (e.g., "menikah")
  3. Kamus kata dasar dengan kata ganti milik (e.g., "bangku")
  4. Kamus kata dasar dengan kata ganti milik berprefiks (e.g., "bersuku")
  5. Kamus kata dasar dengan prefiks pertama (e.g., "median")
  6. Kamus kata dasar dengan prefiks pertama dan sufiks (e.g., "terapan")
  7. Kamus kata dasar dengan prefiks kedua (e.g., "percaya")
  8. Kamus kata dasar dengan prefiks kedua dan sufiks (e.g., "perasaan")
  9. Kamus kata dasar dengan sufiks (e.g., "pantai")

Kesimpulan

Stemming adalah komponen penting dalam Information Retrieval yang membantu dalam proses indexing dokumen dengan menyederhanakan bentuk kata. Dengan memahami dan menerapkan algoritma seperti Porter, kita dapat meningkatkan efisiensi pencarian dan relevansi hasil dalam sistem Information Retrieval.


Image

Untuk lebih jelasnya mengenai proses stemming porter untuk bahasa indonesia ini akan di sajikan source code dan printscreen nya dalam bahasa php dan html, serta menggunakan database mysql.

SOURCE CODE:

index.html

<!DOCTYPE html>
<html>
<head>
    <title>Porter Indonesia</title>
</head>
<body>
    <form action="stem_indonesia.php" method="POST">
        Masukkan Kata : <input type="text" name="word">
        <input type="submit" value="Cek">
    </form>
</body>
</html>


stem_indonesia.php

<?php

$dbServer = "localhost";
$dbUser = "root";
$dbPass = "";
$dbName = "db_kamus";

// Koneksi ke database
$conn = new mysqli($dbServer, $dbUser, $dbPass, $dbName);

// Cek koneksi
if ($conn->connect_error) {
    die("Koneksi gagal: " . $conn->connect_error);
}

$word = $_POST['word'];

// Fungsi untuk menjalankan query dan mengembalikan hasil
function runQuery($conn, $query) {
    $result = $conn->query($query);
    if ($result->num_rows > 0) {
        return true;
    }
    return false;
}

// STEP 1 (Cek Kamus partikel & partikel berprefiks)
$partikelQuery = "SELECT * FROM dsr_partikel WHERE name ='$word'";
if (runQuery($conn, $partikelQuery)) {
    echo $word;
    exit;
} else {
    $partikelPrefiksQuery = "SELECT * FROM dsr_partikel_prefiks WHERE name='$word'";
    if (runQuery($conn, $partikelPrefiksQuery) && strlen($word) > 4) {
        // Hapus prefiks
        if (substr($word, 0, 4) == "meng" || substr($word, 0, 4) == "peng") {
            echo substr($word, 4);
        } else if (substr($word, 0, 4) == "meny" || substr($word, 0, 4) == "peny") {
            echo "s" . substr($word, 4);
        } else if (substr($word, 0, 3) == "mel" || substr($word, 0, 3) == "mer" || substr($word, 0, 3) == "mew" || substr($word, 0, 3) == "mey") {
            echo substr($word, 3);
        } else if (substr($word, 0, 2) == "di") {
            echo substr($word, 2);
        } else if (substr($word, 0, 3) == "mem" || substr($word, 0, 3) == "pem") {
            if (in_array(substr($word, 3, 1), ["a", "i", "u", "e", "o"])) {
                echo "p" . substr($word, 3);
            } else {
                echo substr($word, 3);
            }
        } else if (substr($word, 0, 3) == "pel") {
            echo substr($word, 4);
        } else if (substr($word, 0, 3) == "men" || substr($word, 0, 3) == "pen") {
            echo "t" . substr($word, 3);
        }
        exit;
    } else {
        // Hapus partikel
        if (in_array(substr($word, -3), ['kah', 'lah', 'pun', 'tah'])) {
            $word2 = substr($word, 0, -3);
        } else {
            $word2 = $word;
        }
        echo "Penghapusan partikel = " . $word2 . "<br>";
    }
}

// STEP 2 (Cek Kamus milik & milik berprefiks)
$milikQuery = "SELECT * FROM dsr_milik WHERE name='$word2'";
if (runQuery($conn, $milikQuery)) {
    echo $word2;
    exit;
} else {
    $milikPrefiksQuery = "SELECT * FROM dsr_milik_prefiks WHERE name='$word2'";
    if (runQuery($conn, $milikPrefiksQuery) && strlen($word2) > 4) {
        // Hapus prefiks
        if (substr($word2, 0, 4) == "meng" || substr($word2, 0, 4) == "peng") {
            echo substr($word2, 4);
        } else if (substr($word2, 0, 4) == "meny" || substr($word2, 0, 4) == "peny") {
            echo "s" . substr($word2, 4);
        } else if (substr($word2, 0, 3) == "mel" || substr($word2, 0, 3) == "mew" || substr($word2, 0, 3) == "mer" || substr($word2, 0, 3) == "mey") {
            echo substr($word2, 3);
        } else if (substr($word2, 0, 2) == "di") {
            echo substr($word2, 2);
        } else if (substr($word2, 0, 3) == "mem" || substr($word2, 0, 3) == "pem") {
            if (in_array(substr($word2, 3, 1), ["a", "i", "u", "e", "o"])) {
                echo "p" . substr($word2, 3);
            } else {
                echo substr($word2, 3);
            }
        } else if (substr($word2, 0, 3) == "pel") {
            echo substr($word2, 4);
        } else if (substr($word2, 0, 3) == "men" || substr($word2, 0, 3) == "pen") {
            echo "t" . substr($word2, 3);
        }
        exit;
    } else {
        // Hapus milik
        if (in_array(substr($word2, -2), ['ku', 'mu'])) {
            $word3 = substr($word2, 0, -2);
        } else if (substr($word2, -3) == 'nya') {
            $word3 = substr($word2, 0, -3);
        } else {
            $word3 = $word2;
        }
        echo "Penghapusan milik = " . $word3 . "<br>";
    }
}

// STEP 3 (Cek Kamus prefiks1 & prefiks1 bersufiks)
$prefiks1Query = "SELECT * FROM dsr_prefiks1 WHERE name='$word3'";
if (runQuery($conn, $prefiks1Query)) {
    echo $word3;
    exit;
} else {
    $prefiks1SufiksQuery = "SELECT * FROM dsr_prefiks1_sufiks WHERE name='$word3'";
    if (runQuery($conn, $prefiks1SufiksQuery) && strlen($word3) > 4) {
        // Hapus sufiks
        if (substr($word3, -3) == 'kan') {
            echo substr($word3, 0, -3);
        } else if (substr($word3, -1) == 'i') {
            echo substr($word3, 0, -1);
        } else if (substr($word3, -2) == 'an') {
            echo substr($word3, 0, -2);
        }
        exit;
    } else {
        // Hapus prefiks1
        if (substr($word3, 0, 4) == "meng" || substr($word3, 0, 4) == "peng") {
            $word4 = substr($word3, 4);
        } else if (substr($word3, 0, 4) == "meny" || substr($word3, 0, 4) == "peny") {
            $word4 = "s" . substr($word3, 4);
        } else if (substr($word3, 0, 3) == "mel" || substr($word3, 0, 3) == "mew" || substr($word3, 0, 3) == "mer" || substr($word3, 0, 3) == "mey") {
            $word4 = substr($word3, 3);
        } else if (substr($word3, 0, 2) == "di") {
            $word4 = substr($word3, 2);
        } else if (substr($word3, 0, 3) == "mem" || substr($word3, 0, 3) == "pem") {
            if (in_array(substr($word3, 3, 1), ["a", "i", "u", "e", "o"])) {
                $word4 = "p" . substr($word3, 3);
            } else {
                $word4 = substr($word3, 3);
            }
        } else if (substr($word3, 0, 3) == "pel") {
            $word4 = substr($word3, 4);
        } else if (substr($word3, 0, 3) == "men" || substr($word3, 0, 3) == "pen") {
            $word4 = "t" . substr($word3, 3);
        } else {
            $word4 = $word3;
        }
        echo "Penghapusan prefiks1 = " . $word4 . "<br>";
    }
}

// STEP 4 (Cek Kamus prefiks2 & prefiks2 bersufiks)
$prefiks2Query = "SELECT * FROM dsr_prefiks2 WHERE name='$word4'";
if (runQuery($conn, $prefiks2Query)) {
    echo $word4;
    exit;
} else {
    $prefiks2SufiksQuery = "SELECT * FROM dsr_prefiks2_sufiks WHERE name='$word4'";
    if (runQuery($conn, $prefiks2SufiksQuery) && strlen($word4) > 4) {
        // Hapus sufiks
        if (substr($word4, -3) == 'kan') {
            echo substr($word4, 0, -3);
        } else if (substr($word4, -1) == 'i') {
            echo substr($word4, 0, -1);
        } else if (substr($word4, -2) == 'an') {
            echo substr($word4, 0, -2);
        }
        exit;
    } else {
        // Hapus prefiks2
        if (substr($word4, 0, 4) == "meng" || substr($word4, 0, 4) == "peng") {
            $word5 = substr($word4, 4);
        } else if (substr($word4, 0, 4) == "meny" || substr($word4, 0, 4) == "peny") {
            $word5 = "s" . substr($word4, 4);
        } else if (substr($word4, 0, 3) == "mel" || substr($word4, 0, 3) == "mew" || substr($word4, 0, 3) == "mer" || substr($word4, 0, 3) == "mey") {
            $word5 = substr($word4, 3);
        } else if (substr($word4, 0, 2) == "di") {
            $word5 = substr($word4, 2);
        } else if (substr($word4, 0, 3) == "mem" || substr($word4, 0, 3) == "pem") {
            if (in_array(substr($word4, 3, 1), ["a", "i", "u", "e", "o"])) {
                $word5 = "p" . substr($word4, 3);
            } else {
                $word5 = substr($word4, 3);
            }
        } else if (substr($word4, 0, 3) == "pel") {
            $word5 = substr($word4, 4);
        } else if (substr($word4, 0, 3) == "men" || substr($word4, 0, 3) == "pen") {
            $word5 = "t" . substr($word4, 3);
        } else {
            $word5 = $word4;
        }
        echo "Penghapusan prefiks2 = " . $word5 . "<br>";
    }
}

// STEP 5 (Cek Kamus sufiks)
$sufiksQuery = "SELECT * FROM dsr_sufiks WHERE name='$word5'";
if (runQuery($conn, $sufiksQuery)) {
    echo $word5;
    exit;
} else {
    if (strlen($word5) > 4) {
        // Hapus sufiks
        if (substr($word5, -3) == 'kan') {
            $word6 = substr($word5, 0, -3);
        } else if (substr($word5, -1) == 'i') {
            $word6 = substr($word5, 0, -1);
        } else if (substr($word5, -2) == 'an') {
            $word6 = substr($word5, 0, -2);
        } else {
            $word6 = $word5;
        }
        echo "Penghapusan sufiks = " . $word6 . "<br>";
    } else {
        $word6 = $word5;
    }
}

// STEP 6 (Cek Kamus dasar)
$dasarQuery = "SELECT * FROM dsr_dasar WHERE name='$word6'";
if (runQuery($conn, $dasarQuery)) {
    echo $word6;
} else {
    echo "Kata tidak ditemukan di kamus";
}

$conn->close();
?>


PRINTSCREEN:

berikut ini merupakan tampilan dari index.html

Image
kemudian user mencoba menginputkan kata melangkah

Image

setelah menekan tombol cek, maka didapatkan hasil stemming dari kata melangkah adalah langkah

Image

untuk lebih jelasnya, source code beserta dengan database nya bisa di download disini. 
script yang lain :

http://www.mediafire.com/?0k413yd1598vez4
ShowHideComments