Spell Checker untuk Deteksi dan Perbaikan Typo Bahasa Indonesia

Pengolah data text dari social media merupakan pekerjaan yang membutuhkan tahap preprocessing data yang baik. Sebagaimana telah di jelaskan dalam artikel “Normalisasi Data Text (Text Preprocessing) dengan Python”, data text dari social media mengandung banyak kosa kata tidak baku yang dituliskan dengan berbagai macam cara oleh user.

Video Penjelasan Instalasi dan Cara Kerja Spell Checker Indonesia

Salah satu kebiasaan user dalam menuliskan sebuah kata, khususnya user dari Indonesia adalah menyingkat-nyingkat kata dan typo. Sebagai contoh: ‘mkan’ yang berarti makan, ‘cpt’ yang berarti cepat dan lain sebagainya. Belum lagi yang memang tidak sengaja salah ketik seperti: ‘bukam’ yang bisa berarti bukan, ‘tugsa’ yang berarti tugas dan lainnya.

Masalah

Jika dalam proses pengolahan kata, type penulisan singkatan dan typo tidak diperbaiki, ada kemungkinan besar dapat mempengaruhi hasil analisis akhirnya. Diperlukan sebuah tahap normalisasi dimana kesalahan type penulisan tidak baku dan kesalahan pengetikan dapat diminimalisir sebisa mungkin.

Solusi

Salah satu solusi untuk mengatasi masalah ini adalah dengan melakukan pengecekan ejaan kata (spell checker). Dalam bahasa pemograman Python sebenarnya telah terdapat library untuk melakukan tugas ini yang difasilitasi oleh NLTK, namun sayangnya library ini belum mendukung proses tersebut untuk bahasa Indonesia. Solusi lain adalah membuat sendiri proses spell checker ini. Untungnya, banyak referensi yang dapat digunkan untuk mengatasi masalah ini. Salah satu solusi paling sederhana dijabarkan oleh Peter Norvic dalam lamannya http://norvig.com/spell-correct.html.

Peter Norvic yang seorang ahli bidang ilmu komputer dari America (USA), membuat sebuah fungsi spell checker yang dapat digunakan untuk berbagai bahasa yang ada di dunia, termasuk Bahasa Indonesia. Salah satu kelebihan dari fungsi ini adalah code yang sangat sederhana sehingga mudah dipahami, dengan dataset yang dapat diubah-ubah sesuai keinginan.

Kode

Terdapat setidaknya 2 file yang dibutuhkan untuk membuat spell checker ini, yaitu file untuk eksekusi dalam format Python, dan satu lagi file yang mengandung kata-kata baku berbahasa indonesia.

spellchecker.py

import re
from collections import Counter

def words(text): return re.findall(r'\w+', text.lower())

WORDS = Counter(words(open('katadasar.txt').read()))

def P(word, N=sum(WORDS.values())):
    # "Probability of `word`."
    return WORDS[word] / N

def correction(word):
    # "Most probable spelling correction for word."
    return max(candidates(word), key=P)

def candidates(word):
    # "Generate possible spelling corrections for word."
    return (known([word]) or known(edits1(word)) or known(edits2(word)) or [word])

def known(words):
    # "The subset of `words` that appear in the dictionary of WORDS."
    return set(w for w in words if w in WORDS)

def edits1(word):
    # "All edits that are one edit away from `word`."
    letters    = 'abcdefghijklmnopqrstuvwxyz'
    splits     = [(word[:i], word[i:])    for i in range(len(word) + 1)] # [('', 'kemarin'), ('k', 'emarin'), ('ke', 'marin'), dst]
    deletes    = [L + R[1:]               for L, R in splits if R] # ['emarin', 'kmarin', 'kearin', dst]
    transposes = [L + R[1] + R[0] + R[2:] for L, R in splits if len(R)>1] # ['ekmarin', 'kmearin', 'keamrin', dst]
    replaces   = [L + c + R[1:]           for L, R in splits if R for c in letters] # ['aemarin', 'bemarin', 'cemarin', dst]
    inserts    = [L + c + R               for L, R in splits for c in letters] # ['akemarin', 'bkemarin', 'ckemarin', dst]
    return set(deletes + transposes + replaces + inserts)

def edits2(word):
    # "All edits that are two edits away from `word`."
    return (e2 for e1 in edits1(word) for e2 in edits1(e1))

kata = 'mkan'
print('kata typo : ', kata)
print('koreksi : ', correction(kata))

katadasar.txt

makan
cepat
dengan
bagaimana
itu
dia
saya
lagi
kamu

Cara Kerja

Spell Checker ini bekerja dengan memanfaatkan perhitungan probabilitas Teorema Bayes (bagi yang belum familiar dapat mencari informasi dari berbagai sumber). Untuk bagian-bagian dari spell checker ini hingga mengeluarkan rekomendasi kata dapat dijabarkan secara sederhana sebagai berikut:

1. Selection Mechanism

Mekanisme pemilihan kata yang benar dilakukan dengan memilih kandidat yang memiliki nilai kombinasi probabilitas tertinggi.

2. Candidate Model

Untuk mencari kandidat kata-kata yang mungkin merupakan kata yang benar dari sebuah kata sinkat atau typo. Proses ini dilakukan dengan mengeksplorasi kata, penghapusan huruf, pemindahan huruf, penambahan huruf, dan penggantian huruf pada objek kata dilakukan. Proses ini dilakukan oleh function edits1 pada file spellchecker.py.

3. Language Model

Language Model adalah probabilitas sebuah kata muncul pada dataset yang digunakan. Dalam hal ini adalah dataset katadasar.txt.

4. Error Model

Error model meruapakan probabilitas sebuah kata yang dipresiksi meleset dari maksud asli penulisnya. Tugas ini dihandle oleh function edits2 pada file spellchecker.py

Ouput dari spell checker ini berupa rekomendasi kata yang mungkin benar dari sebuah kata singkat atau kata typo seperti terlihat pada gambar.

Leave a Reply