Technology

Menghitung Prosentase Kemiripan Kata Melalui PHP atau MySQL

 

Searching suatu paragraf atau teks dengan begitu banyak kata di dalamnya terkadang kita membutuhkan suatu kode pencarian untuk mencari tahu seberapa relevan hasil yang ditampilkan oleh suatu program terhadap kata kunci atau keyword search yang kita masukkan. Cara yang dapat ditempuh juga memiliki variasi, anda bisa memilihnya sesuai dengan keahlian teknis yang anda miliki saat ini. Pada kesempatan ini, saya akan berbagi mengenai topik prosentase kemiripan atau relevansi kata terhadap suatu paragraf atau teks dengan PHP dan MySQL.

Setup

Sebagai latihan, anggap saja anda memiliki suatu database berisi kumpulan artikel-artikel, dan anda ingin mencari beberapa artikel dengan keyword tertentu. Pertama, buat database terlebih dahulu dengan menjalankan perintah berikut pada MySQL

create database mebiso_articles;

Kemudian buat table yang berisikan artikel-artikel.

CREATE TABLE `mebiso_articles`.`article` (
  `id` INT NOT NULL,
  `title` VARCHAR(100) NULL,
  `author` VARCHAR(100) NULL,
  `body` TEXT NULL,
  PRIMARY KEY (`id`),
  FULLTEXT INDEX `idx` (`title` ASC, `body` ASC));

INSERT INTO article (author, title,body) VALUES
    ('gufy','MySQL Tutorial','DBMS stands for DataBase ...'),
    ('gufy','How To Use MySQL Well','After you went through a ...'),
    ('gufy','Optimizing MySQL','In this tutorial we will show ...'),
    ('gufy','1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
    ('gufy','MySQL vs. YourSQL','In the following database comparison ...'),
    ('gufy','MySQL Security','When configured properly, MySQL ...');

Cara 1: Query data dari MySQL, hitung prosentase kemiripan dengan PHP

Query artikel berdasarkan keyword

Anggap saja anda ingin mencari artikel dengan keyword “mysql”. Untuk mencari artikel dengan keyword tersebut, buat file php baru dan masukkan kode dibawah ini.

<?php

// sesuaikan dengan konfigurasi database password anda
$host = 'localhost';
$username = 'root';
$password = 'root';
$dbname = 'mebiso_articles';

$connection_string = 'mysql:host='.$host.';dbname='.$dbname.';';

$keyword = 'mysql';
$pdo = new PDO($connection_string, $username, $password);

$statement = $pdo->prepare("SELECT * FROM article where title like :keyword or body like :keyword ");
$statement->execute(array(':keyword'=>'%'.$keyword.'%'));
$results = $statement->fetchAll(PDO::FETCH_CLASS);

print_r($results);

 Menghitung prosentasi kemiripan

Sekarang anda mendapatkan result dari query diatas. Mari kita hitung berapa prosentase kemiripan keyword dengan judul dengan mengubah kode menjadi seperti dibawah ini.

<?php

// sesuaikan dengan konfigurasi database password anda
$host = 'localhost';
$username = 'root';
$password = 'root';
$dbname = 'mebiso_articles';

$connection_string = 'mysql:host='.$host.';dbname='.$dbname.';';

$keyword = 'mysql';
$pdo = new PDO($connection_string, $username, $password);

$statement = $pdo->prepare("SELECT * FROM article where title like :keyword or body like :keyword ");
$statement->execute(array(':keyword'=>'%'.$keyword.'%'));
$results = $statement->fetchAll(PDO::FETCH_CLASS);

foreach($results as &$result)
{
  similar_text($result->title, $keyword, $percent);
  $result->relevance = round($percent, 2);
}

print_r($results);

Agar lebih mudah mencari tahu mana yang paling mirip, mari kita urutkan berdasarkan relevansinya.

<?php

// sesuaikan dengan konfigurasi database password anda
$host = 'localhost';
$username = 'root';
$password = 'root';
$dbname = 'mebiso_articles';

$connection_string = 'mysql:host='.$host.';dbname='.$dbname.';';

$keyword = 'mysql';
$pdo = new PDO($connection_string, $username, $password);

$statement = $pdo->prepare("SELECT * FROM article where title like :keyword or body like :keyword ");
$statement->execute(array(':keyword'=>'%'.$keyword.'%'));
$results = $statement->fetchAll(PDO::FETCH_CLASS);

foreach($results as &$result)
{
  similar_text($result->title, $keyword, $percent);
  $result->relevance = round($percent, 2);
}

usort($results, function($first, $second){
  return $first->relevance < $second->relevance;
});

print_r($results);

Kelebihan dan Kelemahan

Kelebihan menggunakan cara ini:

  1. Prosentase kemiripan lebih akurat
  2. Mudah

Kelemahan menggunakan cara ini:

  1. Ketika result dari MySQL lebih dari 100 data, penghitungan prosentase akan lambat
  2. Pengurutan data berdasarkan relevansi harus melalui PHP

Cara 2: Query data dan hitung kemiripan dengan MySQL

Ada alternatif lain untuk mencari relevansi antara keyword dengan text atau judul yang akan dicari. Seluruh proses pencarian dan relevansi sepenuhnya dilimpahkan pada MySQL melalui query. Dengan keyword yang sama, berikut ini kode untuk mencari data dan hitung kemiripannya.

<?php

// sesuaikan dengan konfigurasi database password anda
$host = 'localhost';
$username = 'root';
$password = 'root';
$dbname = 'mebiso_articles';

$connection_string = 'mysql:host='.$host.';dbname='.$dbname.';';

$keyword = 'mysql';
$keyword_phrase = "";
$pdo = new PDO($connection_string, $username, $password);
$sql = "SELECT *,MATCH(title, body) against (:keyword_phrase IN BOOLEAN MODE) as relevance
FROM article
where title like :keyword or body like :keyword
ORDER BY relevance DESC";

$keyword_phrase = implode("* ", explode(" ", $keyword))."*";
$statement = $pdo->prepare($sql);
$statement->execute(array(':keyword'=>'%'.$keyword.'%', 'keyword_phrase'=>$keyword_phrase));
$results = $statement->fetchAll(PDO::FETCH_CLASS);


print_r($results);

Jika kita lihat kode diatas, ada perbedaan query. Ada Match() Against(). Fungsi tersebut hanya dapat berjalan pada field yang memiliki index berupa Full-Text. Apabila field title, dan body, tidak memiliki index full-text, maka akan muncul error.

Kelebihan dan Kelemahan

Kelebihan menggunakan metode ini adalah:

  1. Pengurutan hasil data sesuai dengan yang paling mirip jauh lebih cepat
  2. Proses lebih singkat, PHP hanya berfungsi untuk query dan menampilkan data

Kekurangan metode ini adalah:

  1. Perlu pemahaman lebih jauh terkait Full-Text Search Index
  2. Angka relevansi yang muncul bukanlah prosentase yang diharapkan (ref: http://mysqlserverteam.com/rankings-with-innodb-full-text-search/)

Anda juga bisa kombinasikan dua metode diatas, sehingga anda bisa mendapatkan hasil dan prosesentase sesuai harapan anda. Well, Semoga bermanfaat. :-)

Baca juga:

Optimasi Kode Anda untuk Meningkatkan Performa Aplikasi Berbasis PHP

10 Framework PHP untuk Para Developer Website

20 Ekstensi Google Chrome yang Cocok untuk Developer dan Desainer Web


Berikan Komentar

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *