String Matching) dalam Bahasa Inggris.
Prosiding Seminar Nasional: SNATI UII
Yogyakarta,
pp. 1-6.
Wibowo,T. 2012. Pembuatan Aplikasi Untuk Mendeteksi Kebenaran Perintah SQL Query
Menggunakan Metode
Knuth-Morris-Pratt
.
Jurnal Teknik Informatika
1: 1-9
LISTING PROGRAM
// Source Code MainActivity.java
package id.repa; import android.app.Activity; import android.content.res.Configuration; import android.os.Bundle; import android.support.v4.app.ActionBarDrawerToggle; import android.support.v4.widget.DrawerLayout; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.ListView; import android.widget.Toast; import android.widget.AdapterView.OnItemClickListener;
public class MainActivity extends Activity {
private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private ActionBarDrawerToggle mDrawerToggle;
private CharSequence mJudulDrawer;
private CharSequence mJudul;
private String[] mNamaPlanet; @Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.activity_content);
// inisialisasi
mJudul = mJudulDrawer = getTitle(); mNamaPlanet =
getResources().getStringArray(R.array.array_drawer); mDrawerLayout = (DrawerLayout)
findViewById(R.id.drawer_layout);
mDrawerList = (ListView) findViewById(R.id.drawer_kiri); mDrawerList.setAdapter(new
ArrayAdapter(this,R.layout.item_navdrawer, mNamaPlanet)); // memberi event klik item item daftar nama planet
mDrawerList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView arg0, View arg1, int
posisi,
long id) {
// memanggil metode pilihItem() pilihItem(posisi);
} });
// membuka-menutup jika disentuh
getActionBar().setDisplayHomeAsUpEnabled(true); getActionBar().setHomeButtonEnabled(true);
// merupakan metode untuk mengaktifkan drawer saat ikon ActionBar
// disentuh atau saat layar sebelah kiri digeser (sliding) ke kanan
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
R.drawable.ic_drawer, 0, 0) {
// metode saat drawer dalam kondisi tertutup
// judul pada ActionBar menampilkan item buah terpilih
public void onDrawerClosed(View view) { getActionBar().setTitle(mJudul);
invalidateOptionsMenu(); }
// metode saat drawer dalam kondisi terbuka
// judul pada ActionBar menampilkan nama aplikasi: // "Daftar Buah-buahan"
public void onDrawerOpened(View drawerView) { getActionBar().setTitle(mJudulDrawer);
invalidateOptionsMenu(); }
};
// mDrawerLayout diberi event mDrawerToggle mDrawerLayout.setDrawerListener(mDrawerToggle);
// dalam keadaan awal, saat aplikasi mulai dijalankan, item yang dipilih
// adalah indeks 0
if (savedInstanceState == null) { pilihItem(0);
}
//new Data(new DbHelper(this)).insertAllWords1(); }
@Override
public boolean onOptionsItemSelected(MenuItem item) { // event saat ikon ActionBar disentuh: drawer akan membuka/menutup
if (mDrawerToggle.onOptionsItemSelected(item)) { return true;
}
return super.onOptionsItemSelected(item); }
private void pilihItem(int position) {
// metode saat item planet dipilih; judul pada ActionBar akan // diperbarui kemudian drawer akan menutup
switch(position) { case 0:
getFragmentManager().begintransaction().replace(R.id.frame_kont en, new MainFragment(), "MainFragment").commit();
case 1:
getFragmentManager().begintransaction().replace(R.id.frame_kont en, new kosaKata(), "kosaKata").commit();
break; case 2:
getFragmentManager().begintransaction().replace(R.id.frame_kont en, new About(), "About").commit();
break; } mDrawerList.setItemChecked(position, true); setTitle(mNamaPlanet[position]); mDrawerLayout.closeDrawer(mDrawerList); } @Override
public void setTitle(CharSequence title) { // metode penggantian judul pada ActionBar mJudul = title;
getActionBar().setTitle(mJudul); }
// dua metode yang harus dipanggil saat menggunakan ActionBarDrawerToggle
// untuk penyesuaian dan konfigurasi kondisi drawer (item terpilih)
@Override
protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState);
mDrawerToggle.syncState(); }
@Override
public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig);
mDrawerToggle.onConfigurationChanged(newConfig); }
}
// Source Code MainFragment.java
package id.repa;
import java.text.DecimalFormat;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
public class MainFragment extends Fragment implements
android.text.TextWatcher,
android.widget.AdapterView.OnItemClickListener {
private ArrayList<Result> results;
private ListView result;
private DbHelper db; @Override
public View onCreateView (LayoutInflater inflater,ViewGroup root, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_main, root,false);
((EditText)
view.findViewById(R.id.editText1)).addTextChangedListener(this); result = (ListView) view.findViewById(R.id.result); result.setEmptyView(view.findViewById(R.id.empty)); result.setOnItemClickListener(this);
db = new DbHelper(getActivity()); return view;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int
count, int after) { } @Override
public void onTextChanged(CharSequence s, int start, int
before, int count) {
long first = System.nanoTime();
if(s.toString().equals("")) result.setAdapter(new
ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, new String[] { })); else {
String[] columns = { MyDictionaryContract.Word.COLUMN_ARTI, MyDictionaryContract.Word.COLUMN_ISTILAH };
Result[] R = {}; Cursor c =
db.getReadableDatabase().query(MyDictionaryContract.Word.TABLE_NAME, columns, null, null, null, null, null);
int i = 0, j = 0;
if(c.moveToFirst()) {
R = new Result[c.getCount()]; do {
R[i++] = new
Result(c.getString(c.getColumnIndex(columns[0])), c.getString(c.getColumnIndex(columns[1])));
} while(c.moveToNext()); }
c.close();
if(R.length > 0) { results = new
ArrayList<MainFragment.Result>();
SearchMethod search = new SearchMethod();
String pattern = R[i].word;
search.search(pattern.toUpperCase(), s.toString().toUpperCase());
if(search.getMatches().length > 0) results.add(new Result(pattern, R[i].mean));
} i = 0;
String[] contents = new
String[results.size()];
for(Result r : results)
contents[i++] = r.word; result.setAdapter(new
ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, contents)); }
}
long elapsed = System.nanoTime() - first; Toast.makeText(getActivity(), new
DecimalFormat("0.0000").format(elapsed / 1000000000.) + " s", Toast.LENGTH_SHORT).show();
}
@Override
public void afterTextChanged(Editable s) { } @Override
public void onItemClick(AdapterView<?> parent, View view, int
position, long id) {
Result r = results.get(position); AlertDialog.Builder dialog = new
AlertDialog.Builder(getActivity()).setTitle(r.word).setMessage(r.mean );
dialog.show(); }
private class Result {
private Result(String word, String mean) { this.word = word;
this.mean = mean; }
private String word, mean; }
}
// Source Code SearchMethod.java
package id.repa;
import java.util.ArrayList;
public class SearchMethod {
private char[] p, t; // pattern, text
private int m, n; // pattern length, text length
private String matches; // string of match positions
private char[] showmatches;// char array that shows matches
private int[] b; // used by the KMP algorithm /** searches the text tt for the pattern pp
*/
setPattern(pp); kmpSearch(); }
/** sets the text */
private void setText(String tt) {
n=tt.length(); t=tt.toCharArray(); initmatches(); }
/** sets the pattern */
private void setPattern(String pp) {
m=pp.length(); p=pp.toCharArray(); b=new int[m+1]; kmpPreprocess(); }
/** initializes match positions and the array showmatches */
private void initmatches() {
matches="";
showmatches=new char[n];
for (int i=0; i<n; i++) showmatches[i]=' '; }
/** preprocessing of the pattern */
private void kmpPreprocess() {
int i=0, j=-1; b[i]=j;
while (i<m) {
while (j>=0 && p[i]!=p[j]) j=b[j]; i++; j++; b[i]=j; } }
/** searches the text for all occurences of the pattern */
private void kmpSearch() {
int i=0, j=0; while (i<n) {
while (j>=0 && t[i]!=p[j]) j=b[j];
if (j==m) // a match is found { report(i-m); j=b[j]; } } }
/** reports a match */
private void report(int i) {
matches += i + " "; showmatches[i]='^'; }
/** returns the match positions after the search */
public int[] getMatches() {
int i = 0, j = 0, n = matches.length();
ArrayList<String> list = new ArrayList<String>();
for(; i < n; i++) {
if(matches.charAt(i) == ' ') {
list.add(matches.substring(j, i)); j = i + 1;
} }
int[] result = new int[list.size()]; i = 0;
for(String s : list)
result[i++] = Integer.valueOf(s); return result;
} }
// Source Code kosaKata.java
package id.repa;
import java.util.ArrayList;
import android.app.AlertDialog;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.database.Cursor; import android.os.Bundle; import android.view.MenuItem; import android.view.View; import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast;
public class kosaKata extends android.app.ListFragment implements
View.OnClickListener {
private DbHelper db;
private EditText istilah, arti;
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
reset(); }
public void onCreateOptionsMenu(android.view.Menu menu, android.view.MenuInflater inflater) {
menu.add(0, 0, 0,
R.string.add).setIcon(R.drawable.ic_add).setShowAsActionFlags(MenuIte m.SHOW_AS_ACTION_ALWAYS);
super.onCreateOptionsMenu(menu, inflater); }
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId() == 0) {
new
AlertDialog.Builder(getActivity()).setTitle("Tambah istilah baru").setView(createInputView()).setPositiveButton("Tambah", new
DialogInterface.OnClickListener() { @Override
public void onClick(DialogInterface dialog,
int which) {
ContentValues values = new
ContentValues(); values.put(MyDictionaryContract.Word.COLUMN_ARTI, istilah.getText().toString()); values.put(MyDictionaryContract.Word.COLUMN_ISTILAH, arti.getText().toString()); db.getWritableDatabase().insert(MyDictionaryContract.Word.TABLE _NAME, null, values);
android.widget.Toast.makeText(getActivity(), istilah.getText().toString() + " berhasil ditambah", android.widget.Toast.LENGTH_SHORT).show(); reset(); } }).show(); } return super.onOptionsItemSelected(item); }
public void onDestroy() { db.close();
super.onDestroy(); }
public void onClick(View v) {
final Result r = (Result) v.getTag(); switch(v.getId()) {
case R.id.delete:
new
AlertDialog.Builder(getActivity()).setMessage("Hapus kata: " + r.word + "?").setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
_NAME, MyDictionaryContract.Word._ID + "=?", new String[] { String.valueOf(r.id) });
Toast.makeText(getActivity(), "Kata: " + r.word + " berhasil dihapus", Toast.LENGTH_SHORT).show();
reset(); }
}).show();
break; case R.id.edit:
View view = createInputView(); Cursor c =
db.getReadableDatabase().query(MyDictionaryContract.Word.TABLE_NAME, null, MyDictionaryContract.Word._ID + "=?", new String[] {
String.valueOf(r.id) }, null, null, null);
if(c.moveToFirst()) {
arti.setText(c.getString(c.getColumnIndex(MyDictionaryContract. Word.COLUMN_ISTILAH))); istilah.setText(c.getString(c.getColumnIndex(MyDictionaryContra ct.Word.COLUMN_ARTI))); } c.close(); new
AlertDialog.Builder(getActivity()).setTitle("Ubah kata: " + r.word).setView(view).setPositiveButton("Ubah", new
DialogInterface.OnClickListener() { @Override
public void onClick(DialogInterface dialog,
int which) {
ContentValues values = new
ContentValues(); values.put(MyDictionaryContract.Word.COLUMN_ARTI, istilah.getText().toString()); values.put(MyDictionaryContract.Word.COLUMN_ISTILAH, arti.getText().toString()); db.getWritableDatabase().update(MyDictionaryContract.Word.TABLE _NAME, values, MyDictionaryContract.Word._ID + "=?", new String[] { String.valueOf(r.id) });
Toast.makeText(getActivity(), "Kata: " + r.word + " berhasil diubah", Toast.LENGTH_SHORT).show();
reset(); } }).show(); break; } }
private void reset() {
db = new DbHelper(getActivity()); android.database.Cursor c =
db.getWritableDatabase().query(MyDictionaryContract.Word.TABLE_NAME, null, null, null, null, null, MyDictionaryContract.Word.COLUMN_ARTI + " ASC");
ArrayList<Result> results = new
ArrayList<kosaKata.Result>();
do { results.add(new Result(c.getLong(c.getColumnIndex(MyDictionaryContract.Word._ID)), c.getString(c.getColumnIndex(MyDictionaryContract.Word.COLUMN_ARTI)), c.getString(c.getColumnIndex(MyDictionaryContract.Word.COLUMN_ISTILAH )))); } while(c.moveToNext()); } c.close();
setListAdapter(new Adapter(results)); }
private View createInputView() {
LinearLayout view = new LinearLayout(getActivity()); view.setOrientation(LinearLayout.VERTICAL);
istilah = new EditText(getActivity()); istilah.setHint("Istilah");
arti = new EditText(getActivity()); arti.setHint("Arti");
view.addView(istilah, -1, -2); view.addView(arti, -1, -2); return view;
}
private class Adapter extends
android.widget.ArrayAdapter<Result> {
private Adapter(ArrayList<Result> results) { super(getActivity(), 0, results); }
public View getView(int position, View convertView, android.view.ViewGroup root) {
if(convertView == null) { convertView =
android.view.LayoutInflater.from(getActivity()).inflate(R.layout.item _library, root, false);
((ImageView) convertView.findViewById(R.id.delete)).setOnClickListener(kosaKata.th is); ((ImageView) convertView.findViewById(R.id.edit)).setOnClickListener(kosaKata.this ); } ((TextView) convertView.findViewById(R.id.word)).setText(getItem(position).word); ((ImageView) convertView.findViewById(R.id.delete)).setTag(getItem(position)); ((ImageView) convertView.findViewById(R.id.edit)).setTag(getItem(position)); return convertView; } }
private class Result {
private Result(long id, String word, String mean) { this.id = id;
this.word = word; }
private String word; }
}
// Source Code DbHelper.java
package id.repa;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.provider.BaseColumns;
public class DbHelper extends
android.database.sqlite.SQLiteOpenHelper {
public DbHelper(android.content.Context context) {
super(context, MyDictionaryContract.DATABASE_NAME, null, MyDictionaryContract.DATABASE_VERSION);
}
public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE " +
MyDictionaryContract.Word.TABLE_NAME + "(" +
MyDictionaryContract.Word._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
MyDictionaryContract.Word.COLUMN_ISTILAH + " " + MyDictionaryContract.Word.COLUMN_TYPE_ISTILAH + "," +
MyDictionaryContract.Word.COLUMN_ARTI + " " + MyDictionaryContract.Word.COLUMN_TYPE_ARTI + ")");
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DELETE TABLE IF EXISTS " + MyDictionaryContract.Word.TABLE_NAME);
onCreate(db); }
public long insert(String tableName, Word word) { ContentValues values = new ContentValues(); values.put(MyDictionaryContract.Word.COLUMN_ISTILAH, word.getIST()); values.put(MyDictionaryContract.Word.COLUMN_ARTI, word.getAR()); return this.getWritableDatabase().insert(MyDictionaryContract.Word.TABLE_NAM E, null, values);
}
public Cursor getAllWords(String orderBy, String selection, String[] selectionArgs) {
return
this.getReadableDatabase().query(MyDictionaryContract.Word.TABLE_NAME , null, selection, selectionArgs, "", "", orderBy + " ASC");
public Word getWord(long ist) { Cursor c =
this.getReadableDatabase().query(MyDictionaryContract.Word.TABLE_NAME , null, MyDictionaryContract.Word._ID + " = ?", new String[] {
String.valueOf(ist) }, "", "", ""); Word word = null;
if(c.moveToFirst()) {
word = new Word(c.getString(1), c.getString(2)); word.set_ID(c.getLong(0));
}
return word; }
}
final class MyDictionaryContract {
public final static int DATABASE_VERSION = 1;
public final static String DATABASE_NAME = "DictMed.db";
public abstract static class Word implements BaseColumns {
public final static String TABLE_NAME = "Word",
COLUMN_ISTILAH = "Istilah", COLUMN_TYPE_ISTILAH = "VARCHAR(50) NOT NULL",
COLUMN_ARTI = "Arti", COLUMN_TYPE_ARTI = "VARCHAR(50) NOT NULL";
} }
final class Word {
private long _ID;
private String ist, ar;
public final static int LANG_IST = 0, LANG_AR = 1;
private int lang = 0;
public Word(String ist, String ar) { this.ist = ar;
this.ar = ist; }
public void set_ID(long _ID) { this._ID = _ID;
}
public long get_ID() { return _ID; }
public String getIST() { return ist; }
public String getAR() { return ar; }
public void setLang(int lang) { this.lang = lang; }
public int getLang() { return lang; }
public String toString() {
java.util.Locale locale = java.util.Locale.US; String temp = "";
temp =
String.valueOf(ist.charAt(0)).toUpperCase(locale);
return temp + ist.substring(1, ist.length()); case LANG_AR:
temp =
String.valueOf(ar.charAt(0)).toUpperCase(locale);
return temp + ar.substring(1, ar.length()); default: return null;
} }
}
// Source Code Data.java
package id.repa;
public class Data {
private DbHelper dbHelper;
public Data(DbHelper dbHelper) { this.dbHelper = dbHelper; }
public void insertAllWords1() {
dbHelper.insert(MyDictionaryContract.Word.TABLE_NAME, new
Word("ablasio retina","terpisahnya atau terlepasnya retina mata dari jaringan penyokong di bawahnya"));
dbHelper.insert(MyDictionaryContract.Word.TABLE_NAME, new
Word("abses","kantong nanah akibat terinfeksi bakteri"));
dbHelper.insert(MyDictionaryContract.Word.TABLE_NAME, new
Word("abses abdomen","abses perut")); }
}
// Source Code About.java package id.repa; import android.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup;
public class About extends Fragment { @Override
public View onCreateView (LayoutInflater inflater,ViewGroup root, Bundle savedInstanceState) {
<EditText
android:id="@+id/editText1"
android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_margintop="24dp"
android:ems="10"
android:hint="@string/masukkan_kata" android:inputType="text"
android:textColorLink="@color/black" android:textSize="20sp" />
<ListView
android:id="@+id/result"
android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/editText1" android:cacheColorHint="@color/redpa" /> <TextView
android:id="@+id/empty"
CURRICULUM VITAE
Nama
: Arief Try Hidayat
Alamat Sekarang
: Jl. Abdul Hakim Komplek Insan Cita Griya Blok AA-9
Kelurahan Tanjung Sari, Kecamatan Medan Selayang,
Kota Medan
Alamat Orang Tua
: Jl. Abdul Hakim Komplek Insan Cita Griya Blok AA-9
Kelurahan Tanjung Sari, Kecamatan Medan Selayang,
Kota Medan
Telp/Hp
: 061-8225623/ 081232052762
: arieftry@rocketmail.com
Riwayat Pendidikan
1998 – 2004
: SD Muhammadiyah 03 Medan
2004 – 2007
: SMP Negeri 1 Medan
2007 – 2010
: SMA Negeri 3 Medan
2010 –
: S1 Ilmu Komputer Universitas Sumatera Utara, Medan
Keahlian
Bütcher, S., dkk. 2010. Information Retrieval; Implementing and Evaluating Search Engines.
MIT Press: London.
Charras, C. & Lecroq, T. 1997.
Handbook of Exact String Matching Algorithms. Oxford
University Press: United Kingdom.
Dewanto, R.A., Aradea. 2007. Aplikasi SMS Gateway Dengan Koreksi Kesalahan Menggunakan
Fuzzy String Matching. Seminar Nasional Aplikasi Teknologi Informasi 2007 (SNATI
2007) C:35-38.
Fadillah,A.R. 2008. Pengenalan Pola Sidik Jari Menggunakan Algoritma Knuth Morris-Pratt
(KMP). Skripsi. Bandung. Universitas Komputer Indonesia.
Gata,W.,dkk. 2012. Pengimplementasian Android Dalam Perancangan Aplikasi Nusa Mandiri
Mobile Application (NUMA) Dengan Pemrograman Java.
BIT 9: 63-70.
Guntur,M. 2008. Aplikasi Search Engine Dengan Menggunakan Algoritma
Knuth-Morris-Pratt.
Skripsi. Bandung. Universitas Komputer Indonesia.
Husamah. 2012. Kamus Penyakit pada Manusia. ANDI. Yogyakarta.
Knuth D.E., Morris (Jr) J.H. & Pratt V.R. 1977. Fast pattern matching in strings. SIAM Journal
on Computing 6(1):323-350.
Lindung,Y.D. 2012. Implementasi Android SDK Dalam Pembuatan Aplikasi Mobile "Kalkulator
MIPA" Untuk Sekolah Menengah Pertama. Skripsi. Yogyakarta. Sekolah Tinggi
Manajemen Informatika dan Komputer.
Manning, Cristopher D., dkk. 2008. Introduction to Information Retrieval.
Cambridge.
University Press: New York.
Mufti,Y. 2013. Rancang Bangun Emergency Security Caller Berbasis Android Untuk Situasi
Perampokan. Skripsi. Yogyakarta. Universitas Islam Negeri Sunan Kalijaga.
Mulyana,F. 2014. Penerapan Algoritma
Knuth-Morris-Pratt
Pada Game Puzzle Untuk Mencari
Kecocokan Pola Warna. Skripsi. Bandung. Universitas Komputer Indonesia.
Parlin,J., & Saputra,K. 2011. Penerapan String Matching Pada Aplikasi Kamus Bahasa
Kedokteran Berbasis Java ME. Skripsi. Palembang. Sekolah Tinggi Manajemen
Informatika dan Komputer Global Informatika Multi Data Palembang.
Syaroni,M. & Munir,R. 2005. Pencocokan String Berdasarkan Kemiripan Ucapan (Phonetic
String Matching) dalam Bahasa Inggris.
Prosiding Seminar Nasional: SNATI UII
Yogyakarta, pp. 1-6.
Wibowo,T. 2012. Pembuatan Aplikasi Untuk Mendeteksi Kebenaran Perintah SQL Query
Menggunakan Metode Knuth-Morris-Pratt. Jurnal Teknik Informatika
1: 1-9
ANALISIS DAN PERANCANGAN SISTEM
3.1
Analisis Sistem
Analisis sistem dilakukan untuk dapat memahami kebutuhan sistem dan gambaran
tugas-tugas yang akan dikerjakan, sebelum membangun sistem terlebih dahulu
dilakukan beberapa tahap analisis untuk mengidentifikasi segala kebutuhan yang akan
diterapkan dalam sistem agar tidak terjadi kesalahan dan sistem yang dibangun akan
optimal.
3.1.1
Analisis Masalah
Dalam ilmu pengetahuan banyak sekali digunakan kata-kata yang mempunyai arti
yang khas dan kebanyakan istilah itu berasal dari bahasa asing. Ilmu kedokteran yang
terlebih banyak memakai istilah yang berasal dari bahasa asing. Bukan ahli
kedokteran saja yang harus bisa mempergunakannya, asistennya, dan orang awam pun
perlu mengetahui istilah bahasa kedokteran.
Istilah-istilah kedokteran ini telah dirangkum di dalam sebuah kamus kedokteran
yang banyak beredar. Tak banyak dari kamus tersebut mempunyai jumlah halaman
yang banyak dan membuat kamus tersebut menjadi tebal. Hal tersebut sering kali
membuat orang menjadi malas untuk membuka kamus untuk sekedar mencari istilah
yang ingin diketahuinya. Untuk meningkatkan mobilitas pengguna kamus kedokteran,
kepada peningkatan kerja dan rasa ingin tahu. Maka daripada itu penulis ingin
membuat sebuah aplikasi kamus yang berbasis android di smartphone.
Untuk mencari istilah-istilah kedokteran dalam kamus, pencarian dilakukan
dengan melibatkan data yang jumlahnya banyak dan mengakibatkan kesulitan jika
dilakukan dengan cara manual. Dengan adanya aplikasi kamus kedokteran berbasis
android ini, proses pencarian istilah-istilah kedokteran akan menjadi lebih mudah dan
dipastikan akan lebih cepat.
Untuk mengidentifikasi masalah yang dijelaskan di atas digunakan diagram
Ishikawa
(fishbone diagram)
. Diagram Ishikawa adalah sebuah alat visual untuk
mengidentifikasi, mengeksplorasi, dan secara grafik menggambarkan secara detail
semua penyebab yang berhubungan dengan suatu permasalahan.
Pencocokan String Terhadap Sebuah Teks dengan
Knuth-Morris Pratt Pengguna Sistem Mesin Metode Material Mempunyai Mobilitas Yang Tinggi Belum ada Aplikasinya Pencarian Kata Belum Dapat
Dilakukan Sulitnya Mendapatkan Informasi Data Dengan Cepat Masih Melakukan Pencarian Manual Proses Data Sangat Banyak Masih Berbentuk Buku Cetak Kesulitan Dalam Mendapatkan Perangkat Elektronik Tidak dapat diupdate
Setiap saat
Gambar 3.1 Diagram Ishikawa untuk Analisis Masalah Sistem
Permasalahan utama yang ditunjukkan pada gambar 3.1 adalah pada persegi
panjang di posisi paling kanan gambar (bagian kepala) diagram ishikawa. Kategori
ditunjukkan pada empat persegi panjang yang masing-masing terhubung ke garis
utama, sedangkan sebab-akibat ditunjukkan dalam bentuk tanda panah horizontal pada
3.1.2
Analisis Kebutuhan Sistem
Dalam analisis kebutuhan sistem terdapat dua bagian penting yang harus dipenuhi,
yaitu analisis kebutuhan fungsional sistem dan analisis kebutuhan non-fungsional
sistem.
3.1.2.1 Kebutuhan Fungsional Sistem
Kebutuhan fungsional yang harus dimiliki oleh sistem untuk mencapai tujuannya.
Berikut ini merupakan beberapa kebutuhan fungsional sistem yang akan dibangun,
antara lain:
1. Sistem dapat membaca
pattern
yang ingin dicari pada teks yang telah diinput.
2. Sistem dapat memanggil, menggunakan, dan menampilkan data ataupun informasi
yang berupa
string
yang berasal dari database
Android
(dalam sistem
menggunakan
SQLite
).
3. Sistem dapat menghasilkan arti kata dari
pattern
yang dicari dengan menggunakan
algoritma
Knuth-Morris-Pratt.
4. Sistem ini merupakan aplikasi pada
platform Android.
3.1.2.2 Kebutuhan Non-Fungsional Sistem
Untuk mendukung kinerja sistem, sistem sebaiknya dapat berfungsi sebagai berikut:
1. Interface sistem harus mudah digunakan sehingga dapat dioperasikan dengan baik
oleh pengguna.
2. Sistem dibangun dengan perangkat yang tidak mengeluarkan biaya yang besar dan
dapat berjalan dengan baik pada berbagai versi sistem operasi perangkat
Android
.
3.1.3
Pemodelan
Pemodelan sistem dilakukan untuk memperoleh gambaran yang lebih jelas tentang
dilakukan oleh sebuah sistem sehingga sistem dapat berfungsi dengan baik sesuai
dengan kegunaannya.
Pada penelitian ini digunakan
UML
(
Unified Modeling Language
) sebagai
bahasa pemodelan untuk mendesain merancang sistem yang akan dibangun.
UML
yang digunakan antara lain
use case diagram
,
activity diagram
dan
seqance diagram.
3.1.3.1
Use Case Diagram
Use case diagram adalah teknik yang digunakan untuk menampilkan
functional
requirements
dari sebuah sistem
. Use case diagram
menampilkan bagaimana
software
akan bekerja dari sudut pandang
user
(bukan Developer).
Use Case Diagram
akan
menjelaskan fungsi apa saja yang dikerjakan oleh sistem.
Use Case Diagram
dari
sistem yang akan dibangun dapat ditunjukkan pada Gambar 3.2 berikut.
Gambar 3.2 Use Case Diagram
Sistem
Pada proses Pencarian istilah kata dengan Algoritma
Knuth-Morris-Pratt
, dapat
Name
Pencarian istilah kata
Actors
Pengguna
Description
Use Case
ini mendeskripsikan proses menampilkan field untuk
melakukan pencarian
Basic Flow
Pengguna dapat memasukkan istilah kata yang akan dicari
Alternate Flow
Pengguna dapat melihat kosakata dan tentang yang sudah tersimpan
Pre Condition
-Post Condition
Sistem akan melakukan pencocokan terhadap kata yang dicari
Pada proses Hasil, dapat dinyatakan dalam tabel 3.2.
Tabel 3.2. Use Case
Proses Menginputkan Istilah Kata yang Dicari
Name
Proses
Actors
Pengguna
Description
Use Case
ini mendeskripsikan proses menginputkan istilah kata
Basic Flow
Pengguna menginputkan istilah kata yang akan dicari
Alternate Flow
Pengguna dapat kembali ke menu awal dan memilih untuk mencari
data baru, kosakata dan tentang
Pre Condition
Pengguna dapat melihat menu awal
Post Condition
Pengguna mengetahui hasil pencarian istilah kata tersebut
Pada proses Hasil, dapat dinyatakan dalam tabel 3.3.
Tabel 3.3.
Use Case
Proses Tampil Hasil Pencarian
Name
Proses Tampil Hasil Pencarian
Actors
Pengguna
Basic Flow
Pengguna memilih istilah kata yang telah ditemukan
Alternate Flow
Pengguna dapat kembali ke menu awal dan memilih untuk mecari
data baru, kosakata dan tentang
Pre Condition
Pengguna dapat melihat menu awal
Post Condition
Pengguna mengetahui hasil pencarian istilah kata tersebut
3.1.3.2 Activity Diagram
Activity Diagram
untuk Proses pencarian dengan Algoritma
Knuth-Morris-Pratt,
dapat dilihat pada gambar 3.3 berikut.
Pada proses ini untuk tahap awal, sistem menampilkan Kamus Kedokteran
kemudian pengguna dapat melakukan pencarian kata. Sistem merespon dengan
menampilkan kata-kata yang bersesuaian dengan yang diinput pengguna. Kemudian
pengguna dapat memilih istilah kata yang telah ditemukan untuk melihat arti dari kata
tersebut.
3.1.3.3
Sequence Diagram
Sequence diagram
menggambarkan bagaimana objek saling berinteraksi melalui
message
dalam eksekusi
operation
, untuk satu buah
use case
.
Sequence
membantu
untuk menggambarkan data yang masuk dan keluar sistem.
Sequence diagram
pada
gambar 3.4.
Gambar 3.4
Sequence Diagram
Pada
Sequence diagram
diatas yang dilakukan adalah meng-input istilah kata yang
akan dicari kemudian proses pencarian dan pencocokan dengan algoritma
Knuth-Morris-Pratt.
Kemudian menampilkan hasil pencarian istilah kata.
3.1.3.4 Flowchart
Sistem
urutan-urutan dari prosedur yang ada di dalam sistem. Gambar 3.5 berikut ini
merupakan
Flowchart
dari sistem yang akan dibangun.
Perancangan antarmuka (
interface)
merupakan salah satu bagian yang sangat penting
dalam sebuah perancangan sistem. Perancangan antarmuka dibuat agar mudah dalam
membangun sebuah sistem.
Sebuah antarmuka harus dirancang dengan
memperhatikan pengguna sehingga dapat memberikan kemudahan dan kenyamanan
untuk digunakan oleh pengguna.
3.2.1
Antarmuka Menu Utama
Perancangan Menu Utama dapat dilihat pada gambar 3.6
Gambar 3.6 Rancangan Antarmuka Menu Utama
Keterangan dari Gambar 3.6 sebagai berikut:
6.
Listview
data Istilah untuk menampilkan seluruh istilah yang bersesuaian dengan
pencarian
3.2.2
Antarmuka Menu Kosa Kata
Perancangan Menu Kosa Kata dapat dilihat pada gambar 3.7.
Gambar 3.7 Rancangan Antarmuka Menu Kosa Kata
Keterangan dari Gambar 3.7 sebagai berikut:
1.
Imagebutton
untuk menampilkan Menu Navigasi.
2.
Application Icon
untuk menampilkan ikon dari aplikasi.
3.
Textview
Judul untuk menampilkan judul menu kosa kata.
4. Button Actionbar Add
untuk menambah daftar istilah baru.
5.
Textview
data Istilah untuk menampilkan nama istilah kedokteran.
6.
Imageview Delete
untuk menghapus data istilah.
7.
Imageview Edit
untuk mengubah data istilah.
Perancangan Menu Tentang dapat dilihat pada gambar 3.8.
Gambar 3.8 Rancangan Antarmuka Menu Tentang
Keterangan dari Gambar 3.8 sebagai berikut:
1.
Imagebutton
untuk menampilkan Menu Navigasi.
2.
Application Icon
untuk menampilkan ikon dari aplikasi.
3.
Textview
Judul untuk menampilkan judul menu tentang.
4. Textview
untuk menampilkan judul skripsi.
5.
Textview
untuk menmpilkan nama dan nim.
6.
Imageview
untuk menampilkan logo USU.
7.
Textview
untuk menampilkan lokasi universitas, fakultas dan jurusan.
3.2.4
Antarmuka Menu Navigation
Gambar 3.9 Rancangan Antarmuka Menu
Navigation
Keterangan dari Gambar 3.9 sebagai berikut:
1.
Imagebutton
untuk menampilkan Menu Navigasi.
2.
Application Icon
untuk menampilkan ikon dari aplikasi.
3.
Textview
Judul untuk menampilkan judul menu
navigation
.
4.
Navigation
Pencarian untuk menampilkan Menu Utama yaitu Menu Pencarian.
5.
Navigation
Kosa Kata untuk menampilkan Menu Kosa Kata.
4.1
Implementasi
Implementasi sistem merupakan tahapan yang harus dilakukan dalam proses
pengembangan perangkat lunak. Setelah melakukan analisis masalah, setelah
melewati proses analisis dengan mempertimbangkan kemungkinan yang akan
diterapkan kedalam sistem maka langkah selanjutnya adalah mengimplementasikan
apa yang telah dianalisis sebelumnya. Sistem ini dibangun dengan menggunakan
Eclipse 4.2.0.
Pada sistem ini terdapat 3 menu, yaitu: Menu Utama, Menu Kosa Kata,
Menu Tentang.
4.1.1
Implementasi Algoritma Knuth-Morris-Pratt
Penerapan algoritma
Knuth-Morris-Pratt
dalam sistem yang dibangun adalah pada
proses pencarian dengan algoritma
Knuth-Morris-Pratt
dalam mencari data istilah
kedokteran yang ingin diketahui artinya. Adapun langkah yang dilakukan adalah
melakukan pencarian data yang telah tersimpan lebih dulu pada edittext
dalam menu
utama.
Contoh:
[image:32.596.131.522.99.424.2]Kata yang dicari: abses
Data yang telah tersimpan
Gambar 4.1 Contoh pencarian
Seperti yang telah dijelaskan sebelumnya bahwa algoritma mencocokkan karakter dari
kiri ke kanan.
Contoh pencarian algoritma Knuth-Morris-Pratt
Kata yang dicari: purpura
Kata yang telah disimpan: purulen purpurin purpura
Gambar 4.2 Pencarian Kata
Dalam algoritma
Knuth-Morris-Pratt, dimulai dengan mencari pencocokan di semua
posisi. Jika ketidakcocokan ditemukan di karakter pertama, dilanjutkan ke posisi
berikutnya. Dalam algoritma
Knuth-Morris-Pratt, kita menggeser selama beberapa
karakter, menghindari pencocokan berlebihan.
4.2
Antarmuka Sistem
Pada Aplikasi Kamus Kedokteran dalam pencarian menggunakan algoritma
Knuth-Morris-Pratt
ini terdapat tiga menu, yaitu:
1. Menu Utama
2. Menu Kosa Kata
3. Menu Tentang
4. Menu Navigation
4.2.1
Tampilan Menu Utama
[image:34.596.223.410.350.617.2]Pada menu utama, terdapat 1
button actionbar navigation
yang berfungsi untuk
mengarahkan pengguna menuju halaman lain, 1 edittext
yang berfungsi untuk mencari
data istilah yang ingin dicari artinya menggunakan algoritma
knuth-morris-pratt.
Menu utama dapat dilihat pada gambar 4.3.
Gambar 4.3 Tampilan Menu Utama
Pada menu ini akan ditampilkan 2 button actionbar
yaitu: button actionbar navigation
yang berfungsi untuk mengarahkan ke halaman lain, button actionbar add yang
berfungsi jika ingin menambahkan istilah baru dan ditampilkan 2
imageview
yaitu:
imageview delete
yang berfungsi jika kita ingin menghapus istilah yang telah
tersimpan, imageview edit
yang berfungsi jika kita ingin mengubah istilah ataupun arti
dari data yang telah tersimpan. Tampilan menu kosa kata akan ditampilkan dalam
gambar 4.4. sebagai berikut
Gambar 4.4 Tampilan Menu Kosa Kata
Pada menu kosa kata juga akan menampilkan keseluruhan data yang telah tersimpan
dalam listview.
4.2.3
Tampilan Menu Tentang
Gambar 4.5 Tampilan Menu Tentang
4.2.4
Tampilan Menu Navigation
Gambar 4.6 Tampilan Menu Navigation
4.3
Pengujian Sistem
Pengujian sistem dilakukan untuk mengetahui bagaimana kinerja sistem dalam
pencarian istilah kedokteran menggunakan algoritma
Knuth-Morris-Pratt. Dalam
pengujian yang akan dicari adalah istilah kedokteran sebagai
fieldnya. Semua hasil
pencarian ditampilkan sesuai dengan inputan yang match
pada pencarian.
4.3.1
Pengujian Pencarian Data Istilah Dengan Algoritma Knuth-Morris-Pratt
Pada Tabel 4.1 di bawah dapat dilihat hasil pencarian data istilah menggunakan
Knuth-Morris-Pratt.
.
Tabel 4.1 Hasil Pencarian Data Istilah dengan Algoritma Knuth-Morris-Pratt
Nama
Hasil
Pencarian
Waktu
Pencarian
A01
Match
0.33 sec
A02
Match
0.6 sec
A04
Match
0.05
A05
Mismatch
A06
Mismatch
4.3.2
Pengujian Waktu Pencarian Data Istilah Dengan Algoritma
Knuth-Morris-Pratt
Pada Tabel 4.2 di bawah dapat dilihat hasil waktu pencarian data istilah menggunakan
Knuth-Morris-Pratt.
Tabel 4.2 Hasil Waktu Pencarian Data Istilah dengan Algoritma
Knuth-Morris-Pratt
Nama
Waktu
[image:40.596.108.476.220.772.2]Pencarian
Gambar Hasil
A01
0.0588 secs
A03
0.0541 secs
A04
0.0567 secs
A05
Dari tabel 4.2 didapatkan rata-rata dari waktu pencarian satu karakter adalah selama
0.06 secs.
4.3.3
Pengujiann Proses Tambah Data
[image:42.596.219.414.240.559.2]Pada Gambar 4.7 terlihat hasil proses tambah data istilah. Data yang telah ditambah
akan disimpan di
database sqlite
dengan nama tabel
Word
dalam kolom
Column_Type_Istilah dan kolom Column_Type_Arti dan dapat dilihat pada
listview
menu kosa kata.
Gambar 4.7 Menambah Data
4.3.4
Pengujian Proses Edit Data
Gambar 4.8 Mengubah Data
4.3.5
Pengujian Proses Delete
Data
5.1 Kesimpulan
Berdasarkan hasil dari Implementasi Algoritma Pencocokan
String
Knuth-Morris-Pratt
Dalam Pembuatan Kamus Kedokteran Pada
Platform
Android, maka dapat
disimpulkan bahwa:
1. Sistem mengimplementasikan Algoritma Knuth-Morris-Pratt dalam pencarian
atau pencocokan data dengan field istilah sebagai inputan pencariannya.
2. Dalam Algoritma Knuth-Morris-Pratt dimungkinkan pergeseran sejauh mungkin
menurut tabel next
untuk menghindari pencarian berlebihan.
3. Hasil yang diperoleh dari pencarian menampilkan satu karakter yang cocok
dengan kecepatan 0.06 detik.
5.2 Saran
Adapun saran yang dapat diberikan untuk mengembangkan penelitian ini adalah
sebagai berikut:
1. Untuk pengembangan selanjutnya, diharapkan agar dapat menangani pergeseran
pattern
dari kanan ke kiri untuk proses pencarian yang lebih efisien.
2. Untuk pengembangan selanjutnya, diharapkan aplikasi ini menyediakan menu
pilihan algoritma pencarian string dalam proses pencarian seperti Boyer-Moore,
Rabin-Karp sehingga member pengetahuan tentang algoritma pencarian string.
3. Untuk pengembangan selanjutnya, diharapkan agar dapat menambahkan gambar
LANDASAN TEORI
2.1.
Information Retrieval System
2.1.1. Pengertian
Information Retrieval System
Information retrieval system
merupakan bagian dari bidang ilmu komputer yang
bertujuan untuk pengambilan informasi dari dokumen-dokumen yang didasarkan pada
isi dan konteks dari dokumen-dokumen itu sendiri. Definisi
Information Retrieval
System
menurut Gerald J. Kowalski adalah suatu sistem yang mampu melakukan
penyimpanan, pencarian, dan pemeliharaan informasi. Informasi dalam konteks yang
dibahas dalam buku ini dapat berupa informasi teks (termasuk data numerik dan
tanggal), gambar, audio, video, dan objek multimedia lainnya (J. Kowalski, G, 2000)
Definisi menurut Christoper Manning adalah proses menemukan suatu tema
utama (biasanya berupa dokumen) dari suatu data yang tidak terstruktur dalam koleksi
yang besar (tersimpan dalam komputer) untuk memenuhi kebutuhan informasi yang
relevan.
Data tidak terstruktur adalah data yang tidak memiliki susunan semantik, atau
dapat juga dikatakan data yang tidak memiliki struktur yang mudah dikenali oleh
komputer, data ini biasanya berupa teks. Walaupun dalam kenyataannya tidak ada
data yang benar-benar bersifat “tidak terstruktur”, termasuk teks, karena teks juga
memiliki struktur, seperti judul, paragraf, dan catatan kaki yang mana biasanya
struktur tersebut direpresentasikan dalam suatu dokumen dengan memberikan tanda
(markup)
yang jelas untuk masing-masing struktur tersebut. Selain memfasilitasi
penemuan kembali pada data yang tidak terstruktur, IR juga memfasilitasi pencarian
mengandung
kata
“Java”
dengan badan
teks
yang
mengandung
kata
“threading”(Manning, 2008).
Sebagai suatu bidang tersendiri dalam ilmu komputer, IR memiliki beberapa sub
bidang, yaitu sebagai berikut:
1.
Document routing
,
filtering
, dan
selective dissemination
. Tema ini berbalik
arah dengan proses IR pada umumnya. Jika proses IR yang umum adalah
membandingkan dokumen dengan
query
yang dimasukan
user
, sedangkan
pada
document routing
,
filtering
, dan
selective dissemination
sistem akan
membandingkan antar dokumen berdasarkan
query
untuk mendapatkan
dokumen yang dapat menarik minat pengguna.
Contoh pada tema ini adalah agregator berita, misalnya dengan menggunakan
proses
routing
untuk memisahkan berita berdasarkan tema tertentu (bisnis,
politik, olahraga, dan sebagainya).
2.
Text clustering and categorization system
, adalah sistem IR yang akan
mengelompokkan dokumen berdasarkan kunci tertentu.
3.
Summarization system
atau peringkas teks, sistem ini akan membuat ringkasan
dari teks yang diberikan.
Contohnya adalah
snippet
yang ditampilkan pada hasil pencarian
web
.
4.
Information extraction system
, topik IR ini berfungsi mengidentifikasi entitas
bernama, seperti nama tempat dan tanggal. Sistem ini juga dapat
menkombinasikan informasi-informasi ke dalam rekaman terstruktur yang
mendeskripsikan hubungan antara entitas-entitas tersebut.
Misalkan untuk membuat daftar buku dan pengarangnya dari
web
data,
ekstraksi informasi dari legal document (seperti undang-undang,
peraturan pemerintah, dan sebagainya).
5.
Topic detection and tracking system
(sistem pendeteksi dan pelacakan topik),
sistem ini berguna untuk mengidentifikasi topik peristiwa dalam berita dan
sumber-sumber informasi yang sama.
6.
Expert search system
(sistem pencari keahlian), sistem ini akan melakukan
pengidentifikasian keahlian dari seorang anggota organisasi.
7.
Question answering system
(sistem tanya jawab), adalah sistem yang
mengintegrasikan informasi dari berbagai sumber untuk memberikan jawaban
yang singkat dari pertanyaan tertentu. Sistem ini kadang juga digabungkan
kepada user berdasarkan query yang diinputkan, namun pada sistem tanya
jawab yang dikembalikan adalah berupa kalimat singkat untuk menjawab
pertanyaan user.
8.
Multimedia information retrieval system
, adalah tema IR yang
mengembangkan teknik-teknik IR pada data multimedia seperti gambar, video,
musik, dan pidato. Contoh dari sub-bidang ini adalah pencarian gambar,
pencarian musik, video, dan sebagainya (Butcher, S, 2010).
2.2. Pencocokan String (String Matching)
2.2.1. Pengertian Pencocokan String
Pencocokan
string
merupakan bagian terpenting dari sebuah proses pencarian
string
(
string searching
) dalam sebuah dokumen. Hasil dari pencarian sebuah
string
dalam
dokumen tergantung dari teknik atau cara pencocokan
string
yang digunakan.
Pencocokan
string
diartikan sebagai sebuah permasalahan untuk menemukan pola
susunan karakter
string
di dalam
string
lain atau bagian dari isi teks (Syaroni, 2005).
Pencarian string yang juga bisa disebut pencocokan
string
(
string matching
)
merupakan algoritma untuk melakukan pencarian semua kemunculan
string
pendek
pattern
[ 0…n-1] yang disebut
pattern
di
string
yang lebih panjang teks [0…m-1]
yang disebut teks (Charras, 1997).
2.2.2. Kerangka Kerja Pencocokan String
Persoalan pencarian string dirumuskan sebagai berikut:
1. Sebuah teks, yaitu sebuah (
long
)
string
yang panjangnya n karakter.
2.
Pattern
, yaitu sebuah
string
dengan panjang m.
Dengan sebuah nilai karakter (m<n) yang akan dicari dalam teks. Dalam algoritma
pencocokan
string,
teks diasumsikan berada di dalam memori, sehingga bila kita
mencari
string
di dalam sebuah arsip, maka semua isi arsip perlu dibaca terlebih
dahulu kemudian disimpan di dalam memori. Jika
pattern
muncul lebih dari sekali di
dalam teks, maka pencarian hanya akan memberikan keluaran berupa lokasi
pattern
2.2.3. Kerangka Pikir Pencocokan String
Algoritma
string matching
dapat diklasifikasikan menjadi 3 bagian menurut arah
pencariannya, yakni:
1.
From left to right
Dari arah yang paling alami, dari kiri ke kanan, yang merupakan arah untuk
membaca. Algoritma yang termasuk kategori ini adalah algoritma
brute force
,
algoritma
knuth-morris-pratt.
Untuk contoh pencarian kata menggunakan
[image:50.596.127.468.276.526.2]algoritma
from left to right
dapat dilihat pada Tabel 2.1.
Tabel 2.1. Pencarian Kata Menggunakan Algoritma Knuth-Morris-Pratt
i
0
1
2
3
4
5
6
Pattern(i)
A
R
A
R
I
E
F
Prefix(i)
0
0
1
2
0
0
0
i
0
1
2
3
4
5
6
7
8
9 10 11 12
Pattern
A
R
A
R
I
E
F
Text
A
R
A
R
E
F
A
R
A
R
I
E
F
FASE 1
A
R
A
R
I
E
F
FASE 2
A
R
A
R
I
E
F
FASE 3
A
R
A
R
I
E
F
FASE 4
A
R
A
R
I
E
F
2.
From right to left
Dari arah kanan ke kiri, arah yang biasanya menghasilkan hasil terbaik secara
partikal. Algoritma yang termasuk kategori ini adalah algoritma
boyer-moore
.
[image:50.596.126.510.672.752.2]Contoh pencarian menggunakan algoritma boyer-moore dapat dilihat pada
Tabel 2.2.
Tabel 2.2 Pencarian Kata Menggunakan Algoritma Boyer-Moore
I
0
1
2
3
4
5
6
7
8
9 10 11 12 13 14
Pattern
A
R
I
E
F
Text
A
R
A
R
I
F
A
R
I
F
A
R
I
E
F
FASE 3
A
R
I
E
F
FASE 4
A
R
I
E
F
3.
In a specific order
Dari arah yang ditentukan secara spesifik oleh algoritma tersebut, arah ini
menghasilkan hasil terbaik secara teoritis. Algoritma yang termasuk kategori ini
adalah algoritma
colossi
dan algoritma
crochemore-perrin
. Untuk contoh dari
[image:51.596.128.533.59.732.2]algoritma
in a specific order
dapat dilihat pada Tabel 2.3.
Tabel 2.3. Pencarian Kata Menggunakan Algoritma Colossi
nd= 3
Fase 1
Bergeser 3 karakter (shift[2])
Bergeser 2 karakter (shift[1])
Beberapa konsep
string matching
antara lain:
1.
Approximate string matching
, yaitu sebuah pencarian terhadap pola-pola
string
(mengandung beberapa proses yaitu menghitung jumlah karakter yang
berbeda, penyisipan dan penghapusan karakter) sehingga mendekati pola atau
pattern
dari
string
yang dicari.
2. Algorima pencarian
string
adalah sebuah proses pencarian tempat dari suatu
atau beberapa
string
yang ditemukan dalam sebuah kumpulan
string
atau teks.
Jalan paling sederhana adalah dengan cara membaca karakter satu persatu dan
melakukan perhitungan kesalahan posisi yang ada dari
string
yang dicari
(Charras, 1997).
2.2.4. Macam Algoritma Pencocokan String
Secara garis besar
string matching
dibedakan menjadi 2 yaitu:
1.
Exact string matching.
Exact string matching
, merupakan pencocokan string secara tepat dengan
susunan karakter dalam
string
yang dicocokkan memiliki jumlah maupun
urutan karakter dalam string yang sama. Bagian algoritma ini bermanfaat jika
pengguna ingin mencari
string
dalam dokumen yang sama persis dengan
string
masukan.
Beberapa algoritma
exact string matching
yang mengemuka antara lain:
a.
Brute Force
Analisis dengan metode
Brute Force
adalah membandingkan karakter per
karakter sampai ditemukannya pola yang dicari dari awal
string
sampai
dengan akhir
string
.
b.
Knuth-Morris-Pratt
Metode yang akan digunakan dalam penelitian ini dan akan dijelaskan
Algoritma
boyer-moore
adalah algoritma yang mempertimbangkan
string
matching dengan efisiensi tinggi dari aplikasi. Algoritma ini melakukan
pencocokan karakter yang dimulai dari kanan ke kiri.
2.
Inexact string matching
atau
Fuzzy string matching.
Fuzzy string matching
merupakan pencocokan
string
secara samar, maksudnya
pencocokan
string
dimana
string
yang dicocokkan memiliki kemiripan dimana
keduanya memiliki susunan karakter yang berbeda (mungkin jumlah atau
urutannya) tetapi
string-string
tersebut memiliki kemiripan baik kemiripan
tekstual/ penulisan (
approximate string matching
) atau kemiripan ucapan
(
phonetic string matching
). Metode
fuzzy string matching
diarahkan untuk
mencari nilai dari beberapa
string
yang mendekati dan tidak hanya
menghasilkan cocok atau tidak cocok (Syaroni, 2005).
Konsep
Fuzzy String Matching
:
1.
Fuzzy String Matching
adalah salah satu metode pencarian
string
yang
menggunakan proses pendekatan terhadap pola dari
string
yang dicari.
2. Melakukan pencarian terhadap
string
yang sama dan juga
string
yang
mendekati dengan
string
lain yang terkumpul dalam sebuah penampung
atau kamus.
Kunci dari konsep pencarian ini adalah bagaimana memutuskan bahwa sebuah
string
yang dicari memiliki kesamaan dengan
string
tertampung di kamus, meskipun
tidak sama persis dalam susunan karakternya. Untuk memutuskan
string
hasil
pencarian jika ditemukan
string
hasil pendekatan (aproksimasi) (Dewanto, 2007)
2.3. Algoritma Knuth-Morris-Pratt
Algoritma
Knuth-Morris-Pratt
(KMP) mencari kehadiran sebuah kata
w
dalam teks
s
dengan melakukan observasi awal (
preprocessing
) yaitu ketika muncul ketidaksamaan
kata ini mempunyai informasi mengenai kapan kesamaan selanjutnya bermula,
dengan cara mengecek ulang kata sebelumnya. Algoritma ini dibuat oleh Knuth dan
Pratt dan sendiri oleh J. H. Morris pada tahun 1977, namun ketiganya
Algoritma
Knuth-Morris-Pratt
(KMP) merupakan algoritma yang digunakan
untuk melakukan proses pencocokan
string.
Algoritma ini merupakan jenis
Exact
String matching Algorithm
yang merupakan pencocokan
string
secara tepat dengan
susunan karakter dalam
string
yang sama Contoh : kata algoritmik akan menunjukkan
kecocokan hanya dengan kata algoritmik. Pada algoritma
Knuth-Morris-Pratt
(KMP),
disimpan informasi yang digunakan untuk melakukan pergeseran lebih jauh, tidak
hanya satu karakter seperti algoritma
Brute Force.
Algoritma ini melakukan
pencocokan dari kiri ke kanan (Fadillah, 2008).
2.3.1. Fungsi Pinggiran Pada Algoritma Knuth-Morris-Pratt
Fungsi pinggiran Prefix(i) didefinisikan sebagai ukuran awalan terpanjang dari Pattern
yang merupakan akhiran dari
Pattern
[1…
i
]. Sebagai contoh, tinjau
Pattern(i) =
ararief. Nilai untuk setiap karakter di dalam
Pattern
dapat dilihat pada Tabel 2.4.
[image:54.596.125.431.398.456.2](Wibowo, 2012).
Tabel 2.4. Fungsi Pinggiran
I
0
1
2
3
4
5
6
Pattern(i)
A
R
A
R
I
E
F
Prefix(i)
0
0
1
2
0
0
0
2.3.2. Pencarian Dengan Algoritma Knuth-Morris-Pratt
Secara sistematis, langkah-langkah yang dilakukan algoritma
Knuth-Morris-Pratt
pada saat mencocokkan
string.
1. Algoritma
Knuth-Morris-Pratt
mulai mencocokkan
pattern
pada awal teks.
2. Dari kiri ke kanan, algoritma ini akan mencocokkan karakter per karakter
pattern
dengan karakter di teks yang bersesuaian, sampai salah satu kondisi berikut
dipenuhi:
a. Karakter di
pattern
dan di teks yang dibandingkan tidak cocok (
missmatch
).
b. Semua karakter di
pattern
cocok. Kemudian algoritma akan memberitahukan
penemuan di posisi ini.
c. Algoritma kemudian menggeser
pattern
berdasarkan tabel next, lalu
kata P = “ARARIEF” dan kalimat T = “ARAREFARARIEF”. Pada waktu tertentu,
algoritma dalam keadaan yang ditentukan oleh dua variabel bilangan bulat:
1. m yang menunjukkan posisi dalam T yang merupakan awal dari perbandingan
prospektif untuk P.
2. i indeks di P yang menunjukkan karakter saat ini sedang dipertimbangkan.
Dalam setiap langkah, kita membandingkan T [m + i] dengan P [i] dan jika
mereka sama. Hal ini digambarkan, pada awal menjalankan, seperti Gambar 2.1.
m
0
1
2
3
4
5
6
7
8
9 10 11 12
T
A
R
A
R
E
F
A
R
A
R
I
E
F
P
A
R
A
R
I
E
F
[image:55.596.147.449.275.340.2]i
0
1
2
3
4
5
6
Gambar 2.1. Iterasi metode Knuth-Morris-Pratt
Pertama
Kita lanjutkan dengan membandingkan karakter berturut-turut P untuk karakter
dari T, bergerak dari satu ke yang berikutnya apakah mereka cocok. Namun, pada
langkah kelima, kita mendapatkan T[4] adalah ‘E’ dan P[4] = ‘I’, tidak cocok. Karena
itu kita beralih ke karakter berikutnya, menetapkan jumlah pergeseran dari nilai fungsi
pinggiran, dapat dilihat dari gambar 1 bahwa karakter terakhir yang cocok adalah P[4]
= ‘R’ yang memiliki nilai fungsi pinggiran = 2 sebagaimana dilihat pada Gambar 2.2.
m
0
1
2
3
4
5
6
7
8
9 10 11 12
T
A
R
A
R
E
F
A
R
A
R
I
E
F
P
A
R
A
R
I
E
F
I
0
1
2
3
4
5
6
Gambar 2.2 Iterasi metode Knuth-Morris-Pratt
Kedua
Sistem kembali memiliki ketidaksesuaian pada P[2] (T[4]). Daripada mulai mencari
lagi di T[3], sistem mencatat bahwa tidak ada ‘A’ terjadi antara posisi 2 dan 4 di T
kecuali pada 2; oleh karena itu, setelah memeriksa karakter yang sebelumnya, kita
tahu tidak ada peluang untuk menemukan awal yang cocok jika kita memeriksa
mereka lagi. Oleh karena itu kita beralih ke karakter berikutnya, menetapkan m = 5
[image:55.596.146.450.516.594.2]m
0
1
2
3
4
5
6
7
8
9 10 11 12
T
A
R
A
R
E
F
A
R
A
R
I
E
F
P
A
R
A
R
I
E
F
[image:56.596.149.451.71.150.2]i
0
1
2
3
4
5
6
Gambar 2.3 Iterasi metode Knuth-Morris-Pratt
Ketiga
Pencarian ini masi gagal karena terjadi ketidak sesuaian di P[1] (T[5]). Sehingga
kita kembali ke awal P dan mulai mencari di karakter berikutnya T: m = 6, reset i = 0.
Langkah selanjutnya dapat dilihat dari Gambar 2.4.
M
0
1
2
3
4
5
6
7
8
9 10 11 12
T
A
R
A
R
E
F
A
R
A
R
I
E
F
P
A
R
A
R
I
E
F
[image:56.596.143.449.238.315.2]I
0
1
2
3
4
5
6
Gambar 2.4 Iterasi metode Knuth-Morris-Pratt
Keempat
Kali ini kita dapat menyelesaikan seluruh pencocokan, yang karakter pertama
adalah T[6] (Mulyana, 2014).
Berikut adalah
pseudocode
algoritma KMP pada fase pra-pencarian:
procedure preKMP (
input p : array[0..n-1] of char, input n : integer,
input/ output kmpNext : array[0..n] of integer )
Deklarasi: i,j: integer Algoritma:
i := 0;
j := kmpNext[0] := -1; while (i < n) {
while (j > -1 and not (P[i] = P[j])) j := kmpNext[j];
i := i+1; j := j+1;
if (P[i] = P[j])
kmpNext[i] := kmpNext[j]; else
kmpNext[i] := j; endif
endwhile }
Dan berikut adalah pseudocode algoritma KMP pada fase pencarian:
procedure KMPSearch(
input m, n : integer,
input P : array[0..n-1] of char, input T : array[0..m-1] of char,
Deklarasi:
i, j, next : integer
kmpNext : array[0..n] of integer Algoritma:
preKMP(n, P, kmpNext) i:=0
while (i<= m-n) do j:=0
while (j<n and T[i+j] = P[j]) do j:= j+1
endwhile
if(j >= n) then
ketemu[i]:= true; endif
next := j - kmpNext[j] i:= i+next
endwhile
2.3.3. Kompleksitas Waktu Algoritma
Knuth-Morris-Pratt
Untuk menghitung fungsi pinggiran dibutuhkan waktu
O
(
m
), sedangkan pencarian
string
membutuhkan waktu
O
(
n
), sehingga kompleksitas waktu algoritma KMP
adalah
O
(
m
+
n
) (Guntur, 2008).
2.3.4. Kelebihan Algoritma Knuth-Morris-Pratt
Pada algoritma
Knuth-Morris-Pratt
ini akan menyimpan informasi yang digunakan
untuk melakukan jumlah pergeseran. Algoritma menggunakan informasi tersebut
untuk membuat pergeseran yang lebih jauh, tidak hanya satu karakter. Algoritma
Knuth-Morris-Pratt
ini menjanjikan karena memiliki waktu pencarian yang linier,
baik dalam kasus terbaik atau terburuk (Rizki, 2008).
Implementasi algoritma
Knuth-Morris-Pratt
akan meningkatkan kemampuan
dalam pencarian
query
dalam dokumen. Algoritma
Knuth-Morris-Pratt
cocok untuk
pencarian
string
dengan alphabet sedikit seperti biner (Yusup, 2011).
Adapun kelebihan Algoritma
Knuth-Morris-Pratt
telah digunakan dalam
penelitian-penelitian. Penelitian oleh Mulyana (2014) yang menerapkan algoritma
Knuth-Morris-Pratt
pada
game puzzle
untuk mencari kecocokan pola warna telah
dihasilkan bahwa kemampuan pencarian
Knuth-Morris-Pratt
dalam mencari suatu
pola blok warna di dalam blok warna utama pada permainan
puzzle
dalam hal sumber
yang berperan pada saat pencarian yang dilakukan. Sedangkan dalam hal kecepatan,
sangat tergantung pada spesifikasi perangkat keras pengujian. Hal lain yang dapat
diukur adalah skalabilitas waktu pencarian atau kompleksitas waktu.
Penelitian oleh Wibowo (2012) yang menerapkan algoritma
Knuth-Morris-Pratt
pada pembuatan aplikasi untuk mendeteksi kebenaran perintah SQL
Query
menggunakan metode
Knuth-Morris-