Skip to main content

PHP Stemmer Bahasa Indonesia

Information Retrieval : Stemming untuk Bahasa Indonesia

Kali ini saya akan membahas tentang Stemming. Tutorial ini sebenarnya merupakan bagian dari tugas yang diberikan pada matakuliah “Sistem Temu Kembali Informasi” atau kalau dalam bahasa inggris disebut juga “Information Retrieval System” atau kalau dalam istilah ilmu komputer sering disebut “Information Retrieval” atau biasa disingkat “IR”.

Lalu apa sih hubungannya IR dengan Stemming, kenapa harus ada stemming dan bagaimana proses stemming itu sendiri? Ok. sebelum kita bahas tutorialnya kita bahas dulu apa itu stemming.

Oke, jadi Stemming merupakan suatu proses untuk menemukan kata dasar dari sebuah kata. Proses stemming dilakukan dengan menghilangkan semua imbuhan (afiks) baik yang terdiri dari awalan (prefiks) sisipan (infiks) maupun akhiran (sufiks) dan kombinasi dari awalan dan akhiran (konfiks). Stemming ini digunakan untuk mengganti bentuk dari suatu kata menjadi kata dasar sesuai dengan struktur morfologi bahasa indonesia yang baik dan benar.

Nah, lalu apa hubungan IR dengan stemming? Ok. Jadi stemming merupakan bagian dari proses Information Retrieval. Secara umum ada dua proses utama dalam IR, yaituIndexing dan Searching. Proses Indexing terdiri dari 4 subproses antara lain : Word Token (mengubah dokumen menjadi kumpulan term dengan cara menghapus semua karakter dalam tanda baca yang terdapat pada dokumen dan mengubah kumpulan term menjadi lowercase), StopWord Removal (Proses penghapusan kata-kata yang sering ditampilkan dalam dokumen seperti:and, or, not dan sebagainya),Stemming (Proses mengubah suatu kata bentukan menjadi kata dasar) dan Word Weighting (Proses pembobotan setiap term di dalam dokumen). Nah, Stemming ini masuk dalam subproses indexing yang akan kita bahas tutorialnya.

Ada banyak algoritma yang digunakan untuk melakukan proses stemming, khususnya stemming bahasa indonesia. Algoritma-algoritma tersebut antara lain : Algoritma Nazief dan Andriani, algoritma Arifin dan Setiono, algoritma Idris dan Mustofa, algoritma Vega, algoritma Ahmad, Yussof dan Sembok, Porter dsb. Algoritma yang diimplementasikan dalam tutorial ini menggunakan algoritma Porter.  Algoritma Porter ditemukan oleh Martin Porter 1980. Algoritma tersebut digunakan untuk stemming bahasa inggris, kemudian karena proses stemming bahasa inggris berbeda dengan bahasa indonesia maka, dikembangkan algoritma porter khusus untuk bahasa indonesia (Porter Stemmer for Bahasa Indonesia) oleh W.B. Frakes pada tahun 1992. Berikut Flowchart untuk algoritma Porter untuk bahasa Indonesia:



Untuk lebih jelasnya mengenai proses stemming porter untuk bahasa indonesia ini adalah sebagai berikut:

Tahapan dan Aturan dalam proses Stemming (Agusta, Ledy. 2009)
1. Menghapus partikel
2. Mengapus kata ganti (Possesive Pronoun)
3. Mengapus awalan pertama.
4. a. Menghapus awalan kedua
b. Menghapus akhiran
5. a. Menghapus akhiran
b. Menghapus awalan kedua

Image

Image

Image

Tingkat Kerumitan
Struktur morfologi dalam bahasa Indonesia memiliki tingkat kerumitan yang lebih tinggi daripada bahasa Inggris

Membedakan Prefiks dan Sufiks
kesulitan dalam membedakan suatu kata yang mengandung imbuhan baik prefiks maupun sufiks dengan suatu kata dasar yang salah satu suku katanya merupakan bagian dari imbuhan, terutama dengan kata dasar yang mempunyai suku kata lebih besar dari dua (Musthafa, Aziz. 2009)

Kamus Kecil
Untuk mempermudah proses stem maka dibuatlah beberapa kamus kecil, antara lain sebagai berikut :
1. Kamus kata dasar yang dilekati partikel, untuk menyimpan kata dasar yang memiliki suku kata terakhir (partikel infleksional) serta kata tersebut tidak mendapat imbuhan apapun. Seperti : masalah
2. Kamus kata dasar yang dilekati partikel berprefiks untuk menyimpan kata dasar yang memiliki suku kata terakhir (partikel infleksional) dan mempunyai prefiks. Seperti : menikah
3. Kamus kata dasar yang dilekati kata ganti milik, untuk menyimpan kata dasar yang memiliki suku kata terakhir (kata ganti infleksional) serta kata dasar tersebut tidak mendapatkan imbuhan apapun. Seperti : bangku.
4. Kamus kata dasar yang dilekati kata ganti milik berprefiks, untuk menyimpan kata dasar yang memiliki suku kata terakhir (kata ganti infleksional) dan mempunyai prefiks. Seperti : bersuku.
5. Kamus kata dasar yang dilekati prefiks pertama, untuk menyimpan kata dasar yang memiliki suku kata pertama (prefiks derivasional pertama) serta kata dasar tersebut tidak mendapatkan imbuhan apapun. Seperti : median.
6. Kamus kata dasar yang dilekati prefiks pertama bersufiks, untuk menyimpan kata dasar yang memiliki suku kata pertama (prefiks derivasional pertama) dan mempunyai sufiks derivasional. Seperti : terapan.
7. Kamus kata dasar yang dilekati prefiks kedua, untuk menyimpan kata dasar yang memiliki suku kata pertama (prefiks derivasional kedua) serta kata dasar tersebut tidak mendapatkan imbuhan apapun. Seperti : percaya.
8. Kamus kata dasar yang dilekati prefiks kedua bersufiks, untuk menyimpan kata dasar yang memiliki suku kata pertama (prefiks derivasional) dan mempunyai sufiks derivasional. Seperti : perasaan.
9. Kamus kata dasar yang dilekati sufiks, untuk menyimpan kata dasar yang memiliki suku kata terakhir (sufiks derivasional). Seperti : pantai.

Image

Untuk lebih jelasnya mengenai proses stemming porter untuk bahasa indonesia ini akan di sajikan source code dan printscreen nya dalam bahasa php dan html, serta menggunakan database mysql.

SOURCE CODE:

index.html

<html>
<head><title>Porter Indonesia</title>
</head>
<body>
<form action=”stem_indonesia.php” method=”POST”>
Masukkan Kata : <input type=”text” name=”word”>
<input type=”submit” value=”Cek”>
</form>

</body>
</html>

stem_indonesia.php

<?php

$dbServer = “localhost”;
$dbUser = “root”;
$dbPass = “”;
$dbKoneksi = mysql_connect($dbServer, $dbUser, $dbPass);
$dbName = “db_kamus”;
mysql_select_db($dbName);

$word = $_POST['word'];

//STEP 1 (Cek Kamus partikel & partikel berprefiks)
$partikel = mysql_query(“SELECT * FROM dsr_partikel WHERE name =’$word’”);
if(mysql_num_rows($partikel)==1){
//langsung tulis
$dasar =$word;
echo $dasar;
exit;
}else {
$partikel_berprefiks=mysql_query(“SELECT * FROM dsr_partikel_prefiks WHERE name=’$word’”);
if(mysql_num_rows($partikel_berprefiks)==1 && strlen($word) > 4){
//hapus prefiks
if(substr($word,0,4)==”meng” or substr($word,0,4)==”peng”){
echo substr($word,4);
}else if(substr($word,0,4)==”meny” or substr($word,0,4)==”peny”){
$dasar =substr($word,4);
echo “s”.$dasar;
}else if(substr($word,0,3)==”mel” or substr($word,0,3)==”mer” or substr($word,0,3)==”mew” or substr($word,0,3)==”mey”){
echo substr($word,2);
}else if(substr($word,0,2)==”di”){
echo substr($word,2);
}else if(substr($word,0,3)==”mem” or substr($word,0,3)==”pem”){
if(substr($word,3,1)==”a” or substr($word,3,1)==”i” or substr($word,3,1)==”u” or substr($word,3,1)==”e” or substr($word,3,1)==”o”){
$dasar =substr($word,3);
echo “p”.$dasar;
}else{
$dasar =substr($word,3);
echo $dasar;}
}else if(substr($word,0,3 == “pel”)){
$dasar =substr($word,4);
echo $dasar;
}
else if(substr($word,0,3)==”men” or substr($word,0,3)==”pen” ){
$dasar =substr($word,3);
echo “t”.$dasar;
}
exit;
} else{
//hapus partikel
if((substr($word, -3) == ‘kah’ )||( substr($word, -3) == ‘lah’ )||( substr($word, -3) == ‘pun’ )||( substr($word, -3) == ‘tah’ )){
$word2 = substr($word, 0, -3);}
else{
$word2 = $word;

}
echo “Penghapusan partikel = “.$word2.”<br>”;
}
}
//STEP 2 (Cek Kamus milik & milik berprefiks)
$milik = mysql_query(“SELECT * FROM dsr_milik WHERE name=’$word2′”);
if(mysql_num_rows($milik)==1){
//langsung tulis
$dasar =$word2;
echo $dasar;
exit;
}else {
$milik_berprefiks = mysql_query(“SELECT * FROM dsr_milik_prefiks WHERE name=’$word2′”);
if(mysql_num_rows($milik_berprefiks)==1 && strlen($word2) > 4){
//hapus prefiks
if(substr($word2,0,4)==”meng” or substr($word2,0,4)==”peng”){
echo substr($word2,4);
}else if(substr($word2,0,4)==”meny” or substr($word2,0,4)==”peny”){
$dasar =substr($word2,4);
echo “s”.$dasar;
}else if(substr($word2,0,3)==”mel” or substr($word2,0,3)==”mew” or substr($word2,0,3)==”mer” or substr($word2,0,3)==”mey”){
echo substr($word2,2);
}else if(substr($word2,0,2)==”di”){
echo substr($word2,2);
}else if(substr($word2,0,3)==”mem” or substr($word2,0,3)==”pem” ){
if(substr($word2,3,1)==”a” or substr($word2,3,1)==”i” or substr($word2,3,1)==”u” or substr($word2,3,1)==”e” or substr($word2,3,1)==”o”){
$dasar =substr($word2,3);
echo “p”.$dasar;
}else{
$dasar =substr($word2,3);
echo $dasar;}
}else if(substr($word2,0,3 == “pel”)){
$dasar =substr($word2,4);
echo $dasar;

}else if(substr($word2,0,3)==”men” or substr($word2,0,3)==”pen” ){
$dasar =substr($word2,3);
echo “t”.$dasar;
}
exit;
} else{
//hapus milik
if((substr($word2, -2)== ‘ku’)||(substr($word2, -2)== ‘mu’)){
$word3 = substr($word2, 0, -2);
}else if((substr($word2, -3)== ‘nya’)){
$word3 = substr($word2,0, -3);
}
else{
$word3 = $word2;
}
echo “Penghapusan milik = “.$word3.”<br>”;
}
}
//STEP 3 (Cek Kamus prefiks1 & perfiks1 bersufiks)
$prefiks1 = mysql_query(“SELECT * FROM dsr_prefiks1 WHERE name=’$word3′”);

if(mysql_num_rows($prefiks1)==1){
//langsung tulis
$dasar =$word3;
echo $dasar;
exit;
}else {
$prefiks1_sufiks = mysql_query(“SELECT * FROM dsr_prefiks1_sufiks WHERE name=’$word3′”);
if(mysql_num_rows($prefiks1_sufiks)==1 && strlen($word3) > 4){
//hapus sufiks
if (substr($word4, -3)== ‘kan’){
$dasar = substr($word4, 0, -3);
echo $dasar;}
elseif (substr($word4, -1)== ‘i’){
$dasar = substr($word4, 0, -1);
echo $dasar;}
elseif (substr($word4, -2)== ‘an’){
$dasar = substr($word4, 0, -2);
echo $dasar;}
exit;
} else{
//hapus prefiks1
if(substr($word3,0,4)==”meng” or substr($word3,0,4)==”peng”){
$word4 = substr($word3,4);
}else if(substr($word3,0,4)==”meny” or substr($word3,0,4)==”peny”){
$dasar = substr($word3,4);
$word4 = “s”.$dasar;
}else if(substr($word3,0,3)==”mel” or substr($word3,0,3)==”mew” or substr($word3,0,3)==”mer” or substr($word3,0,3)==”mey”){
$word4 = substr($word3,2);
}else if(substr($word3,0,2)==”di”){
$word4 = substr($word3,2);
}else if(substr($word3,0,3)==”mem” or substr($word2,0,3)==”pem”){
if(substr($word3,3,1)==”a” or substr($word3,3,1)==”i” or substr($word3,3,1)==”u” or substr($word3,3,1)==”e” or substr($word3,3,1)==”o”){
$dasar =substr($word3,3);
$word4 = “p”.$dasar;
}else{
$dasar =substr($word3,3);
$word4 = $dasar;}
}else if(substr($word3,0,3 == “pel”)){
$dasar =substr($word3,4);
echo $dasar;

}else if(substr($word3,0,3)==”men” or substr($word3,0,3)==”pen”){
$dasar =substr($word3,3);
$word4 = “t”.$dasar;
}else{
$word4 = $word3;

}
echo “Penghapusan prefiks1= “.$word4.”<br>”;

}
}
//STEP 4 (Cek Kamus prefiks2 & perfiks2 bersufiks)
$prefiks2 = mysql_query(“SELECT * FROM dsr_prefiks2 WHERE name=’$word4′”);

if(mysql_num_rows($prefiks2)==1){
//langsung tulis
$dasar =$word4;
echo $dasar;
exit;
}else {
$prefiks2_sufiks = mysql_query(“SELECT * FROM dsr_prefiks2_sufiks WHERE name=’$word4′”);
if(mysql_num_rows($prefiks2_sufiks)==1 && strlen($word4) > 4){
//hapus sufiks
if (substr($word4, -3)== ‘kan’){
$dasar = substr($word4, 0, -3);
echo $dasar;}
elseif (substr($word4, -1)== ‘i’){
$dasar = substr($word4, 0, -1);
echo $dasar;}
elseif (substr($word4, -2)== ‘an’){
$dasar = substr($word4, 0, -2);
echo $dasar;}
exit;
} else{
//hapus prefiks2
if(substr($word4,0,3)==”ber” or substr($word4,0,3)==”per”){
$word5 = substr($word4,3);
}else if(substr($word4,0,2)==”be”){
if(substr($word4,3)==”ajar”){
$dasar =substr($word4,3);
$word5 = $dasar;
}else{
$dasar =substr($word4,2);
$word5 = $dasar;}
}else if(substr($word4,0,2)==”se” or substr($word4,0,2)==”ke”){
$word5 = substr($word4,2);
}else if(substr($word4,0,3) == “pel” or substr($word4,0,3) == “ter”){
$word5 =substr($word4,3);
}
else{
$word5 = $word4;
}
echo “Penghapusan prefiks2= “.$word5.”<br>”;

}
}
//STEP 5 (Cek Kamus prefiks2 & perfiks2 bersufiks)
$sufiks = mysql_query(“SELECT * FROM dsr_sufiks WHERE name=’$word5′”);
$prefiks2_sufiks = mysql_query(“SELECT * FROM dsr_prefiks2_sufiks WHERE name=’$word5′”);
if(mysql_num_rows($sufiks)==1){
//langsung tulis
$dasar =$word5;
echo $dasar;
exit;
}else{
//hapus sufiks
if (substr($word5, -3)== ‘kan’ && strlen($word5) > 4){
$dasar1 = substr($word5, 0, -3);
}
elseif (substr($word5, -1)== ‘i’){
$dasar1 = substr($word5, 0, -1);
}
elseif (substr($word5, -2)== ‘an’){
$dasar1 = substr($word5, 0, -2);
}
echo “Penghapusan sufiks= “.$dasar1.”<br>”;
exit;
}

?>

PRINTSCREEN:

berikut ini merupakan tampilan dari index.html

Image
kemudian user mencoba menginputkan kata melangkah

Image

setelah menekan tombol cek, maka didapatkan hasil stemming dari kata melangkah adalah langkah

Image

untuk lebih jelasnya, source code beserta dengan database nya bisa di download disini. http://www.mediafire.com/?v6widwi31029049
script yang lain :

http://www.mediafire.com/?0k413yd1598vez4

Comments

Post a Comment

Popular posts from this blog

Daftar Kata Dasar Bahasa Indonesia (+30000 kata)

DAFTAR 30000-an kata DASAR DALAM BAHASA INDONESIA update.

a
ab
aba
aba-aba
abad
abadi
abadiah
abah
abah-abah
abai
abaimana
abaka
abaktinal
abakus
abal-abal
aban
abang
abangan
abangga
abar
abatoar
abau
abdas
abdi
abdikasi
abdomen
abdominal
abdu
abduksi
abduktor
abece
aben
aberasi
abet
abian
abid
abidin
abilah
abing
abiogenesis
abiosfer
abiotik
abis
abisal
abiseka
abiturien
abjad
abjadiah
ablasi
ablaut
ablepsia
abnormal
abnormalitas
abnus
aboi
abolisi
abon
abonemen
abong-abong
aborsi
abortif
abortiva
abortus
abrak
abrakadabra
abrar
abras
abrasi
abreaksi
abrek
abreviasi
abrikos
abrit-abrit
abrosfer
absah
absen
absensi
absensia
absente
absenteisme
abses
absis
absolusi
absolut
absolutisme
absonan
absorb
absorben
absorbir
absorpsi
absorpsiometer
absorptif
abstain
abstinensi
abstrak
abstraksi
absurd
absurdisme
abtar
abu
abu-abu
abuan
abuh
abuk
abuk-abuk
abul
abulhayat
abulia
abun-abun
abur
abus
abyad
acah
acak
acak-acakan
acala
acan
acang
acang-acang
acap
acar
acara
acaram
acat
acau
acawi
ac…

Daftar Stop Words List Bahasa Indonesia Download Untuk Dunia Komputer dan Internet (1300 kata) update

DAFTAR STOP WORDS LIST DALAM BAHASA INDONESIA , YANG BANYAK DITEMUI DI INTERNET

1300-an kata dan terus di update.
Jangan Lupa Periksa Daftar Stop Word List dan Sumber Bahan Thesis/Skripsi/Disertasi/Jurnal Ilmiah Tentang Stemming dan Information Retrieval , Link Di Sebelah Kanan Halaman. Selamat Menikmati. Happy Researching!

a
abad
acara
aceh
ada
adalah
adanya
adapun
agak
agaknya
agama
agar
agustus
air
akan
akankah
akhir
akhiri
akhirnya
akibat
aku
akulah
alam
album
amat
amatlah
amerika
anak
and
anda
andalah
anggota
antar
antara
antarabangsa
antaranya
apa
apaan
apabila
apakah
apalagi
apatah
api
april
artikel
artinya
as
asal
asalkan
asas
asia
asing
atas
atau
ataukah
ataupun
australia
awal
awalnya
awam
b
badan
bagai
bagaikan
bagaimana
bagaimanakah
bagaimanapun
bagainamakah
bagi
bagian
bahagian
bahan
baharu
bahasa
bahawa
bahkan
bahwa
bahwasannya
bahwasanya
baik
baiknya
bakal
bakalan
balik
bandar
bangsa
bank
banyak
bapak
barang
barangan
barat
baru
baru-baru
bawah
beberapa
begini
beginian
begi…