ghiyatsa— Software Developer

Stemming bahasa Indonesia dan kenapa hasilnya masih salah

10 June 2026·5 min read·#nlp#php#text-processing

Saat membangun Leksika — sistem pengecekan kemiripan judul skripsi — saya menghabiskan lebih banyak waktu pada preprocessing teks daripada pada algoritma similarity itu sendiri. Sastrawi adalah pilihan standar untuk stemming Indonesia, dan ia bekerja dengan baik untuk sebagian besar kasus. Tapi ada kelas kata yang konsisten ia gagalkan.

Masalah yang saya temukan

Judul skripsi penuh dengan istilah teknis dan akronim:

  • “LSTM” di-stem menjadi “lst” ❌
  • “e-commerce” menjadi “commerc” ❌
  • “IoT” menjadi “iot” (masih OK untuk matching) ✓
  • “mengoptimalkan” menjadi “optimal” ✓
  • “pembelajaran” menjadi “ajar” ✓

Akronim dan istilah asing adalah titik lemah Sastrawi. Ia menerapkan aturan morfologi Indonesia pada string yang bukan kata Indonesia.

Solusi: protected word list

Pendekatan yang paling pragmatis: daftar kata yang tidak boleh di-stem.

php
use Sastrawi\Stemmer\StemmerFactory;

class ThesisTitleProcessor
{
    private array $protected = [
        'lstm', 'cnn', 'rnn', 'bert', 'svm', 'knn',
        'iot', 'api', 'sql', 'php', 'web', 'app',
    ];

    public function stem(string $title): string
    {
        $factory = new StemmerFactory();
        $stemmer = $factory->createStemmer();

        $words = explode(' ', strtolower($title));

        return implode(' ', array_map(function (string $word) use ($stemmer) {
            // Jangan stem kata yang dilindungi atau akronim (semua huruf kapital)
            if (in_array($word, $this->protected) || ctype_upper($word)) {
                return $word;
            }
            return $stemmer->stem($word);
        }, $words));
    }
}

Apakah penting?

Untuk judul skripsi di bidang teknologi, sangat penting. Dua judul:

  • “Implementasi LSTM untuk klasifikasi teks”
  • “Penerapan LSTM pada pengelompokan dokumen”

Tanpa proteksi “LSTM”, keduanya bisa menjadi string yang sangat berbeda setelah stemming, menurunkan skor similarity padahal topiknya sama.

Pelajaran

Preprocessing text mining bukan langkah yang bisa diselesaikan sekali lalu dilupakan. Untuk domain spesifik — akademik, hukum, medis — selalu ada kelas kata khusus yang membutuhkan penanganan berbeda. Mulai dari yang umum, ukur hasilnya, lalu tambahkan exception sesuai kebutuhan.