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
ShowHideComments