July 20, 2017

Spell Checker / Pengecekan Ejaan 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.

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 US, 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
Hasil
Ouput dari spell checker ini berupa rekomendasi kata yang mungkin benar dari sebuah kata singkat atau kata typo sebagaimana diperlihatkan oleh gambar berikut:


Sebagai penutup, beberapa kekurangan pada spell checker ini adalah hasil rekomendasi pengecekan kata tidak mengeluarkan hasil yang kurang baik jika dataset yang digunakan tidak pas. Sehingga penggunaan dataset yang pas untuk kasus-kasus tertentu mungkin dibutuhkan.

Artikel Terkait

Spell Checker / Pengecekan Ejaan untuk Deteksi dan Perbaikan Typo Bahasa Indonesia
4/ 5
Oleh

Berlangganan

Suka dengan artikel di atas? Silakan berlangganan gratis via email

Tambahkan Komentar Anda