# POC Similarity Nama Nasabah [TOC] ## Description Terdapata kebutuhan untuk membandingkan nama nasabah, nama bank, maupun suatu perusahaan yang berbeda, namun sebenarnya merujuk pada satu entitas yang sama. Untuk memenuhi kebutuhan tersebut, telah tersedia sebuah algoritma yang bernama **Levenshtein Distance** yang dapat menganalisis perbandingan dengan menghitung persentase kemiripan dari dua *text* yang berbeda. :::info :bulb: **Levenshtein Distance** *Levenshtein distance is a string metric for measuring the difference between two sequences. Informally, the Levenshtein distance between two words is the minimum number of single-character edits (insertions, deletions or substitutions) required to change one word into the other* Source : [Link](https://en.wikipedia.org/wiki/Levenshtein_distance) ::: ## Example ### Code Berikut adalah contoh implementasi dari **Levenshtein Distance**, ```python3 Str1 = "Boy Lucky Rizqi" Str2 = "BPK BOY LUCKY RIZQI" Ratio = fuzz.ratio(Str1.lower(),Str2.lower()) W_Ratio = fuzz.WRatio(Str1,Str2) Partial_Ratio = fuzz.partial_ratio(Str1.lower(),Str2.lower()) Token_Sort_Ratio = fuzz.token_sort_ratio(Str1,Str2) Token_Set_Ratio = fuzz.token_set_ratio(Str1,Str2) print("Ratio:", Ratio) print("W_Ratio:", W_Ratio) print("Partial_Ratio:", Partial_Ratio) print("Token_Sort_Ratio:", Token_Sort_Ratio) print("Token_Set_Ratio:", Token_Set_Ratio) ``` Output: ``` Ratio: 88 W_Ratio: 95 Partial_Ratio: 100 Token_Sort_Ratio: 88 Token_Set_Ratio: 100 ``` --- ### Explanation Ada beberapa *function* yang tersedia: #### 1. fuzz.ratio *ratio function* menggunakan perhitungan standar dari *Levenshtein Distance* untuk menghitung kemiripan dari dua teks. Contoh: ```python3 Str1 = "Joko Widodo" Str2 = "Jokowi" ratio = fuzz.ratio(Str1.lower(),Str2.lower()) print("ratio: ", ratio) ``` Output: ``` ratio: 71 ``` Kata "Joko Widodo" dan "Jokowi" menghasilkan angka kemiripan **71%**, dengan catatan kedua teks kita *set lowercase* terlebih dahulu (``Str1.lower(),Str2.lower()``). --- #### 2. fuzz.WRatio Fungsi ini merupakan pengembangan dari perhitungan standar dari *ratio function*, dimana pada fungsi ini lebih memperhatikan besar kecil teks, dan juga beberapa parameter lain. Contoh: ```python3 Str1 = "Joko Widodo" Str2 = "Jokowi" w_ratio = fuzz.WRatio(Str1,Str2) print("w_ratio: ", w_ratio) ``` Output: ``` ratio: 75 ``` Dengan menggunakan *WRatio function*, Kata "Joko Widodo" dan "Jokowi" menghasilkan angka kemiripan **75%** dimana sebelumnya hanya menghasilkan angka **71%**. --- #### 3. fuzz.partial_ratio Fungsi ini bisa mendeteksi bahwa "Joko Widodo" merujuk ke "Jokowi" dengan melihat dari panjangnya string. Contoh: ```python3 Str1 = "Joko Widodo" Str2 = "Jokowi" partial_ratio = fuzz.partial_ratio(Str1.lower(),Str2.lower()) print("partial_ratio: ", partial_ratio) ``` Output: ``` ratio: 83 ``` Cara kerjanya adalah dengan menggunakan logika ***optimal partial***. Dengan kata lain, jika string pendek memiliki panjang **k** dan string yang lebih panjang memiliki panjang **m**, maka algoritmanya akan mencari skor dari substring panjang-**k** yang paling cocok. --- #### 4. fuzz.token_sort_ratio Bisa digunakan untuk melihat nama yang ditulis terbalik, seperti nama pengarang buku dalam sebuah daftar pustaka. Contoh: ```python3 Str1 = "Joko Widodo" Str2 = "Widodo Joko" ratio = fuzz.ratio(Str1,Str2) token_sort_ratio = fuzz.token_sort_ratio(Str1,Str2) print("ratio:", ratio) print("token_sort_ratio:", token_sort_ratio) ``` Output: ``` ratio: 71 token_sort_ratio: 100 ``` Bila menggunakan *ratio function* biasa maka akan menghasilkan skor kemiripan **58%**, sedangkan menggunakan *token_set_ratio function* menghasilkan angka **100%**. --- #### 5. fuzz.token_set_ratio Merupakan *advanced function* dari beberapa *function* sebelumnya. Contoh: ```python3 Str1 = "Joko Widodo" Str2 = "Jokowi" token_set_ratio = fuzz.token_set_ratio(Str1,Str2) print("token_set_ratio: ", token_set_ratio) ``` Output: ``` ratio: 71 ``` Fungsi ini mengimplementasikan beberapa parameter yang ada pada *token_sort_ratio function* kemudian menggunakan *ratio function* sebagai skor akhirnya. --- #### 6. process.extract Selain itu, terdapat fungsi yang akan membantu untuk mendapatkan skor dari beberapa string yang dimasukkan. Contoh: ```python3 query = 'Joko Widodo' choices = ['Jokowi', 'Joko Santoso', 'Joko'] for text, percentage in process.extract(query, choices): print(text, percentage) ``` Output: ``` Joko 90 Jokowi 75 Joko Santoso 61 ``` ## Conclusion Dengan menggunakan **Levenshtein Distance**, kita dapat mengetahui nilai kemiripan dari dua teks yang berbeda. TODO: - Dengan melihat angka yang keluar dari beberapa contoh diatas, perlu dipastikan juga treshold yang akan digunakan. Angka treshold ini nantinya akan digunakan sebagai acuan bahwa 2 kata yang sedang diukur kemiripannya, merupakan kata yang merujuk ke suatu entitas yang sama.