Pemrosesan Kata dengan List (Word Processing with List)

Sebenarnya ini adalah tugas besar yang pernah saya berikan kepada mahasiswa saya. Karena batas pengumpulan sudah lama lewat maka rasanya tidak apa-apa jika saya publish solusinya.

Pada dasarnya kali ini saya akan membahas bagaimana membuat pemrosesan text di C++. Yang di maksud dengan  pemrosesan disini adalah menghitung banyak kata dari paragraf yang kita input dan menghitung ada berapa banyak sebuah kata muncul dalam satu paragraf. Binggung?? Baiklah saya berikan contoh :

Misal ada sebuah paragraf :

Pada hari minggu saya bersama keluarga akan berlibur ke sebuah pulau di kepualan Riau. 
Saya sudah menyiapkan semua kebutuhan sebelum kami pergi.

Dari paragraf di atas dapat kita hitung :

Jumlah kata : 22 kata
Pada : 1            hari : 1        minggu : 1        saya : 2

dan seterusnya akan dihitung untuk semua kata.

Saya rasa setelah melihat contoh diatas sudah lebih jelas gambaran aplikasi yang akan di banggun. Bahasa yang saya gunakan disini adalah bahasa C++, karena ini menggunakan Linked List. Kalau menggunakan bahasa pemrogram berorientasi objek tentu akan lebih mudah. Baiklah sebelum membuat aplikasi ini ada baiknya kita list terlebih dahulu apa yang harus dilakukan.
1. Tentu pertama adalah bagaimana kita bisa menginput sebuah paragraf di C++.
2. Kita salin semua paragraf ke dalam sebuah list.
3. Dari kalimat yang telah diinput, buang semua tanda baca.
4. Setelah dibuang semua tanda baca sekarang kita potong semua elemen list per kata simpan kedalam nested list dan hilangkan tanda spasi.
5. Menghitung kemunculan semua kata.
6. Tampilkan Jumlah semua kata dan masing-masing total.

Tahapan diatas memang terlalu berbelit, tapi kita harus menginggat kembali bahwa ini ditujukan untuk mahasiswa yang baru menggenal Senarai dan Struktur Data.

Baiklah mari kita mulai :
Langkah 1. Langkap pertama adalah input paragraf, pada dasarnya ini sanggat sederhana yaitu cukup membuat kode program yang bisa menerima inputan string.

string Tempparagraf;
cout<<"Input Paragraf :\n";getline(cin,Tempparagraf);

Langkah 2.
Kita sudah bisa menginput sebuah string yang berfungsi menampung paragraf kita. Sekarang saatnya untuk memotong string menjadi sekumpulan karakter. Sekaligus kita akan membuang semua tanda baca yang di masukkan kecuali spasi. Oh iya hampir lupa, angka juga akan dihapus karena kita hanya menghitung kemunculan suatu kata. Sebelum kita potong string menjadi sekumpulan karakter, kita sebaiknya menyiapkan sebuah list yang terlebih dahulu.

#define info(P) P->info
#define next(P) P->next
#define first(L) (L).first
typedef struct tElement *address;
typedef struct tElement{
    char info;
    address next;
}element;

typedef struct{
    address first;
}List;

Setalah list sudah siap sekarang kita salin isi string TempParagraf ke dalam list.

void CreateList(List *L){
    first(*L)=NULL;
}
address alokasi(char x){
    address P;
    P=(address)malloc(sizeof(element));
    if(P!=NULL){
        info(P)=x;
        next(P)=NULL;
    }
    return P;
}
void insertFirst(List *L, address Temp){
    Temp->next=first(*L);
    first(*L)=Temp;
}
void insertAfter(List *L,address prec, address x){
    x->next=prec->next;
    prec->next=x;
}
int IsEmpty(List L){
    if(first(L)==NULL)
        return 0;
    else
        return 1;
}
void insert(List *L, char x){
    address Temp;
    Temp=alokasi(x);
    if(IsEmpty(*L)==NULL)
        insertFirst(&(*L),Temp);
    else{
        address last=first(*L);
        while (last->next!=NULL){
            last=last->next;
        }
        insertAfter(&(*L),last,Temp);
    }
}

Sedangkan di void main kita cukup menulis :

List C;    
CreateList(&C);
address T=first(C);
for(int i=0; i<Tempparagraf.size(); i++){
        insert(&C,Tempparagraf[i]);
}
Tampil(C);

Jika telah kalian jalankan hasil dari potongan program ini adalah kita sudah berhasil menyalin semua huruf ke dalam sebuah list.

Langkah 3.

Setelah disalin sekarang saatnya kita menghapus tanda baca dan bilangan yang ada di dalam list. Untuk menghapus elemen list kita harus memiliki method untuk menghapus elemen baik elemen pertama, elemen di tenggah atau elemen yang terkahir. Tetapi untuk kasus masalah ini kita hanya membutuhkan delete after karena dalam bahasa indonesia yang benar tidak boleh ada tanda baca di awal paragraf. Untuk itu berikut kode untuk menghapus elemen list after adalah.

void DeleteAfter(address prev){
    address del=prev->next;
    prev->next=del->next;
    del->next=NULL;
}

Setelah method delete after sekarang saatnya membuat method untuk menghapus tanda baca.

void DeleteTandaBaca(List *L){
    if(first(*L)!=NULL){
        address temp=first(*L)->next;
        address prev=first(*L);
        do{
            if((temp->info<65 || temp->info>93 )&&( temp->info<97 || temp->info>125)&& (temp->info!=32)){
                prev->next=temp->next;
                temp->next=NULL;
                temp=NULL;
                temp=prev->next;
            }
            else{
                prev=temp;
                temp=temp->next;
            }
        }while(temp->next!=NULL);
        if((temp->info<65 || temp->info>93 )&&( temp->info<97 || temp->info>125)&& (temp->info!=32)){
                prev->next=temp->next;
                temp->next=NULL;
                temp=NULL;
                temp=prev->next;
        }
    }
}

Langkah 4.
Setelah dibuang semua tanda baca sekarang kita potong semua elemen list per kata simpan kedalam list dalam list dan hilangkan tanda spasi. untuk itu kita harus memiliki tipe data baru yaitu list dalam list.

typedef struct LList{
    List Info;
    LList *next;
};

LList *LinkList;

Pada dasarnya list dalam list adalah list biasa tetapi info dari list tersebut adalah sebuah. Binggung kan?? Kira-kira begitulah silahkan diperluas maknanya.. Nah sekarang bagaimana menyalin list yang sudah kita buat ke dalam list dalam list. Logikanya satu elemen list dalam list (yang saya beri nama Linklist) adalah sejumlah elemen dari list C. Contoh : isi list C :

S a y a p e r g i

Sekarang bagaimana menyalinnya kedalam Linklist menjadi seperti ini :

Dari gambar diatas pemotongan kata dilakukan jika kita menemukan spasi. Brikut cara memotong semua listnya.

void Salin(List L){
    LinkList=NULL;
    List temp;
    first(temp)=NULL;
    address elemenL=first(L);
    LList *LastLinkedList=new LList;
    LastLinkedList=NULL;
    LastLinkedList=LinkList;
    do{
        if(elemenL->info!=32)
            insert(&temp,elemenL->info);
        if(elemenL->info==32 ||elemenL->next->next==NULL){
            if(elemenL->next->next==NULL)
                insert(&temp,elemenL->next->info);
            LList *NewLList= new LList;
            NewLList->Info=temp;
            NewLList->next=NULL;
            first(temp)=NULL;
            Tampil(NewLList->Info);
            if(LastLinkedList==NULL){
                LinkList=NewLList;
                LinkList->next=NULL;
                LastLinkedList=LinkList;
            }else {
                NewLList->next=LastLinkedList->next;
                LastLinkedList->next=NewLList;
                LastLinkedList=LastLinkedList->next;
            }
        }
        elemenL=elemenL->next;
    }while(elemenL->next!=NULL);
}

Langkah 5 dan 6.

Menghitung kemunculan semua kata. untuk menghitung kemunculan kata tentu kita membutuhkan method untuk membandingkan 2 buah kata, apakah dua kata tersebut sama atau tidak. Berikut adalah method untuk pembandingan

int Kompare(List A, List B){
    address a=first(A);
    address b=first(B);
    int k=1;
    do{
        if(a->info!=b->info){
            k=0;
        }
        //cout<<"\na : "<<a->info<<" b:"<<b->info;
        a=a->next;b=b->next;
    }while(k!=0 && a->next!=NULL);
    return k;
}

Sesudah dibandingkan sekarang kita hitung kemunculan setiap kata dan sudah langsung menampilkan hasil dari perhitungan setiap kata.

void Hitung(){
    List A,B;
    first(A)=NULL;first(B)=NULL;
    LList *Temp=new LList;
    cout<<"\nCek:\n";
    CetakLL();
    LList *Temp2=new LList;
    Temp2=LinkList;
    do{
        cout<<"\nkata: ";
        Tampil(Temp2->Info);
        Temp=Temp2;
        A=Temp2->Info;
        int hasil=1;
        do{
            B=Temp->next->Info;
            int t=Kompare(A,B);
            hasil+=t;
            if(t==1){
                LList *Delete=NULL;
                Delete=Temp->next;
                Temp->next=Delete->next;
                Delete->next=NULL;
            }else
                Temp=Temp->next;
        }while(Temp->next!=NULL);
        Temp2=Temp2->next;
        cout<<"Hasil :"<<hasil;
        if(Temp2->next==NULL){
            Tampil(Temp2->Info);
            cout<<"Hasil :"<<1;
        }
    }while(Temp2->next!=NULL);
}

Selesai…
Semoga bisa menjadi bahan untuk anda yang sedang mendalami tentang list dan yang sedang belajar tentang struktur data. Semoga membantu.. 🙂