# 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.