Pemenggalan suku kata dengan python

Kode berikut mencoba memperbaiki algoritma sebelumnya yang masih gagal di beberapa kasus. Algoritma yang baru pun masih punya kekurangan. Kemarin sempat diminta oleh rekan untuk penganalisis morfologi di pemrosesan bahasa alami. Supaya ada acuan penggunaan, jadinya saya publikasikan di sini saja. Sumber yang digunakan sebagai acuan dalam algoritma ini adalah buku EYD (saya lupa judul lengkapnya, nanti deh dilengkapi).

cara menggunakannya bisa langsung dari command-line.
>python suku.py berkebun
['ber', 'ke', 'bun']

#file : suku.py
#auth : Peb Ruswono Aryan
#desc : pemenggalan suku kata bahasa indonesia
import os, sys

vokal = ['a', 'i', 'u', 'e', 'o']
awalan = ["be", "me", "pe"]

def replacer(kata, pola):
	result = kata
	for p,r in pola.items():
		result = result.replace(p, r)
	return result
	
def unreplacer(kata, pola):
	result = kata
	for p,r in pola.items():
		result = result.replace(r, p)
	return result
	
def praproses(kata):
	result = []
	tmp = ""
	i=0
	inkonsonan = False
	numkonsonan = 0
	for karakter in kata:
		iskonsonan = (karakter not in vokal)
		if iskonsonan:
			if not inkonsonan:
				inkonsonan = True
			numkonsonan += 1
			tmp += karakter
		else:
			if inkonsonan:
				inkonsonan = False
				
				if len(tmp)==1:
					result += [tmp+karakter]
				else:
					result += [tmp[0], tmp[1:]+karakter]
				tmp = ""
			else:
				result += [karakter]
	if len(tmp)>0:
		result += [tmp]
	return result
	
def kaidah1(listsuku):
	global vokal
	result = []
	last = ""
	i = 0
	for suku in listsuku:
		if len(suku)==1 and i>0:
			if suku in vokal:
				result += [suku]
			elif listsuku[i-1][-1] in vokal:
				if i<len(listsuku)-1 and len(listsuku[i+1])==1 and listsuku[i+1][0] in vokal:
					result += [suku]
				else:
					result[-1] = result[-1] + suku
		else:
			result += [suku]
		i += 1
		last = suku
	return result
	
def kaidah2(listsuku):
	global vokal, awalan
	dift = ["$", "%", "^", "&", "*", "("]
	if len(listsuku)>1:
		if listsuku[0] in awalan and listsuku[1][0] not in vokal and listsuku[1][0] not in dift and len(listsuku[1])>2:
			listsuku[0] += listsuku[1][0]
			listsuku[1] = listsuku[1][1:]
		if len(listsuku[0])==1:
			listsuku = [listsuku[0]+listsuku[1]] + listsuku[2:]
	return listsuku
	
def kaidah3(listsuku):
	global vokal
	result = []
	last = ""
	i = 0
	for suku in listsuku:
		if len(suku)==1 and i>0:
			if listsuku[i-1][-1] in vokal:
				result[-1] = result[-1] + suku
			else:
				result += [suku]
		else:
			result += [suku]
		i += 1
		last = suku
	return result
	
def pecah(kata):
	kdift = {"kh":"$", "ng":"%", "ny":"^", "sy":"&", "tr":"*", "gr":"("}
	
	suku = praproses(replacer(kata, kdift))
	print suku
	suku = kaidah1(suku)
	print "1 ", suku
	suku = kaidah2(suku)
	print "2 ", suku
	suku = kaidah3(suku)
	print "3 ", suku
	return [unreplacer(s, kdift) for s in suku]
	
	#return [unreplacer(s, kdift) for s in kaidah3(kaidah2(kaidah1(praproses(replacer(kata, kdift)))))]

if __name__=='__main__':
	if len(sys.argv)>1:
		kata = sys.argv[1]
		print pecah(kata)

10 comments

  1. Rifki Susetyo · Agustus 31, 2010

    siang mas, btw bagus tulisannya tapi saat saya coba ko error ya source yg diberikan disini. saya sedang butuh mas..hehe🙂 maklum pemula python terus cara manggil fungsinya yg mana ya? thanks before

  2. Rifki Susetyo · Agustus 31, 2010

    thanks mas berjalan ternyata error di > hehe sukses selalu

  3. yudhi satrio · September 17, 2010

    source yang ada disini kok eror ya mas?

    begitu liat komen sebelumnya saya pikir juga akan menemukan hal yang sama, tapi eror yang muncul seperti ini

    python/suku.py”, line 45
    if len(tmp)>0:
    ^
    SyntaxError: invalid syntax

    mohon bantuannya mas…

  4. yudhi satrio · September 17, 2010

    if len(tmp)>0:
    ^
    maaf ada bagian yang gak keluar. mungkin masalah html. jika tidak keluar lagi berikut bagian erornya

    if len(tmp) “&” “gt”;0:
    ^

  5. yudhi satrio · September 17, 2010

    yup, ternyata errornya sama. tapi ada satu lagi masalah. di source itu ada “kaidah2” di baris 86. tapi kok gak ada function “kaedah2” itu sendiri

  6. pebbie · September 18, 2010

    updated. kyknya kmaren ada yang kebuang.

  7. Sriyono Semarang · November 11, 2010

    Bingung, lama banget nggak utak atik ginian…🙂

  8. n03y3 · Oktober 14, 2011

    lanjutkan dong Tulisan belajar pythonnya..

  9. rzq prtm · Maret 18, 2013

    ijin porting ke java mas..:D

  10. Muhammad IqBal Meslilesi · November 18, 2015

    kira2 kalau hasilnya mau dicetak ke txt gimana ya?

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s