Membuat Typo Correction Sederhana dengan Python

Apakah kalian termasuk bangsa yang geli ketika melihat typo? Yap… Sama. Saya terkadang tertawa terbahak-bahak saat typo mengubah situasi menjadi semakin sulit.

Semakin sulit bukan?

Oke, sekarang saya akan sedikit bagikan teknik typo correction dalam pembelajaran machine learning.

Saya menggunakan bahasa python untuk mencoba menerapkan teknik pengenalan typo yang sederhana dengan menggunakan teori bayes.

Modul yang digunakan

Kita akan menggunakan regex untuk memisahkan tiap kata dalam kalimat, dan menggunakan Counter untuk menghitung model bahasa yang kita gunakan.

import re 
from collections import Counter

Dua modul diatas digunakan untuk menggunakan regex dan menghitung model bahasa.

Pemisahan kata dan pembentukan model bahasa

Pemisahan kata dapat dilakukan dengan regex dengan whitespace sebagai pemisahnya sehingga tinggal dicari match ‘\w+’

Model bahasa adalah kumpulan kata yang digunakan beserta frekuensinya. Setiap modul typo correction memiliki hal ini. Gboard selalu merekam kata apa yang kalian ketik untuk membangun model bahasa mereka sekaligus merekam kata orang lain. Untuk saat ini saya menggunakan beberapa artikel wikihow untuk membangun model bahasa Indonesia sederhana.

def words(text): return re.findall(r'\w+', text.lower()) 
WORDS = Counter(words(open('big.txt').read()))

Pembetulan kata

Typo dapat dicari sebabnya, dan secara umum memang kita mengalami salah edit seperti kurang satu huruf, hurufnya terbalik, huruf sebelahnya kepencet dan lain-lain. Secara umum kesalahannya adalah sebagai berikut:

  1. Spasinya kepencet yang bisa berarti split. Contohnya ‘kemaren’ menjadi ‘ke maren’
  2. Ada huruf yang kurang biasa disebut deletion. Contohnya ‘kemaren’ menjadi ‘kmaren’
  3. Ada huruf yang salah posisi biasa disebut transpose. Contohnya ‘kemaren’ menjadi ‘keamren’
  4. Ada huruf yang kepencet biasa disebut insertion. Contohnya ‘kemaren’ menjadi ‘kemarean’
  5. Ada hurud yang salah pencet biasa disebut replace. Contohnya ‘kemaren’ menjadi ‘kemaran’

Kita ambil kata kita dan kemudian memproses segala kemungkinan pembetulan kata yang ada.

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)]
deletes = [L + R[1:] for L, R in splits if R]
transposes = [L + R[1] + R[0] + R[2:] for L, R in splits if len(R)>1]
replaces = [L + c + R[1:] for L, R in splits if R for c in letters]
inserts = [L + c + R for L, R in splits for c in letters]
return set(deletes + transposes + replaces + inserts)

Setelah itu kita bandingkan dengan semua kata yang ada pada model sehingga kata-kata yang tidak berarti bisa kita hilangkan.

def known(words): return set(w for w in words if w in WORDS)

Penghitungan peluang kata

Setiap kata dalam bahasa memiliki peluang dan peluang didefinisikan sebagai perbandingan antara jumlah kata tersebut dengan jumlah seluruh kata. Misalkan kata ‘apa’ muncul di dokumen sebanyak 10 kali dan dokumen tersebut berjumlah 1000 kata, maka peluang munculnya kata apa adalah 1%.

def P(word, N=sum(WORDS.values())): return WORDS[word] / N

Pemilihan kandidat

Kandidat dalam typo correction juga memiliki urutan. Urutan pertama yang diprioritaskan adalah urutan kata yang diketik, lalu kata yang dibenarkan. Ini diurutkan dengan peluang paling maksmal

def correction(word): return max(candidates(word), key=P) 

def candidates(word):
return known([word]) or known(edits1(word)) or known(edits2(word)) or [word]

Selesai deh program sederhananya.

Final Program

import re
from collections import Counter

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

WORDS = Counter(words(open('big.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)]
    deletes    = [L + R[1:]               for L, R in splits if R]
    transposes = [L + R[1] + R[0] + R[2:] for L, R in splits if len(R)>1]
    replaces   = [L + c + R[1:]           for L, R in splits if R for c in letters]
    inserts    = [L + c + R               for L, R in splits for c in letters]
    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))

Penjelasan lebih gamblangnya bisa di lihat di blognya bang norvig.

Pembuatannya memang cukup sederhana sehingga saat bang norvig menghitung ketelitian typo correction ini dengan banyak kata dari buku, dia hanya mencapai akurasi sebesar 75%. Untuk membuat pengembangannya lagi mungkin bisa juga dibuat perekaman kata yang ada dengan relevance feedback sehingga bisa lebih mengerti lagi tentang kebiasaan mengetik kalian.

Oke, sekian saja postingan sederhana dari saya, semoga bisa sedikit membantu.

Membuat Typo Correction Sederhana dengan Python

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *

Kembali ke Atas
www.000webhost.com