Beranda > Computer > Similarity Algorithm

Similarity Algorithm

Pernahkah anda mengalami kesulitan mencari kata-kata yang memiliki kemiripan dalam sekumpulan teks data? sebagai contoh anda ingin menampilkan semua data yang memiliki kemiripan dengan keyword [teknik] dan mengharapkan hasil sebagai berikut:

Search: [teknik]
     teknik
     technic
     technical
     teknikal

Untuk anda yang telah berpengalaman tentunya anda terpikir untuk menggunakan metode soundex atapun metaphone. Benar algoritma ini pun mengacu pada metode tersebut, namun pembahasan ini saya berusaha untuk membuatnya lebih dekat dengan bahasa Indonesia dengan tujuan untuk mencari kata yang memiliki kemiripan baik dalam bahasa Indonesia maupun padanan terdekat dalam bahasa Inggris seperti yang dicontohkan tersebut.

Hanya saja sebagaimana algoritma lainnya, tentu saja anda tidak bisa mengharapkan output atas algoritma ini benar 100% karena bagaimanapun metode yang digunakan pasti akan terdapat bias atas kata yang ditemukannya. Sebagai contoh:

Search: [mikro]
     mikro
     micro
     makro
     macro

Seperti halnya pada algortima soundex, saya pun mengelompokkan abjad kata sebagai berikut:


A, I, U, E, O            : 1
     P, G, B, D               : 2
     L, M, N, R, X, H         : 3
     V, F, S, T, J, Z         : 4
     Q, C, K                  : 5
     W, Y                     : 6

Untuk membatasi identifikasi, saya menetapkan:
– Nilai dari grup yang sama tidak boleh berdampingan.
– Maksimum encode adalah 6 karakter
– Nilai kembalian berupa integer dengan tujuan agar lebih efisien digunakan sebagai index key.

implementasi kodenya adalah sebagai berikut:

uses
  Math;
function similarity(AText: string): Integer;
var
  nLength: smallint;
  nLastCode: smallint;
  nLenCode: smallint;
  nIndex: smallint;
  nCode: smallint;
const
  MAX_LEN = 6;
begin
  AText      := LowerCase(AText);
  nLength    := Length(AText);
  nIndex     := 1;
  Result     := 0;
  nLastCode  := 0;
  nLenCode   := 0;
  while (nIndex <= nLength) and (nLenCode < MAX_LEN) do
  begin
    case AText[nIndex] of
     'a', 'i', 'u', 'e', 'o'      : nCode := 1;
     'p', 'g', 'b', 'd'           : nCode := 2;
     'l', 'm', 'n', 'r', 'x'      : nCode := 3;
     'v', 'f', 's', 't', 'j', 'z' : nCode := 4;
     'q', 'c', 'k', 'h'           : nCode := 5;
     'w', 'y'                     : nCode := 6;
    else
      nCode := 0;
    end;
    if (nCode > 0) and (nLastCode <> nCode) then
    begin
      Result := IfThen(Result = 0,
        nCode, (Result*10)+nCode);
      nLastCode := nCode;
      Inc(nLenCode);
    end;
    Inc(nIndex);
  end;
end;
Iklan
Kategori:Computer
  1. Belum ada komentar.
  1. No trackbacks yet.

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

%d blogger menyukai ini: