Contoh lanjutan implementasi “FuzzyWuzzy” untuk cleansing data nama

Lintang Gilang Pratama
Lintang Gilang
Published in
5 min readApr 8, 2021
Photo by John Cameron on Unsplash

FuzzyWuzzy adalah suatu package di python, yang dapat digunakan untuk mencari kemiripan (matching) dari suatu string terhadapat suatu kumpulan string. Package ini secara teori menggunakan pendekatan “Levenshtein Distance”.

~~Lintang Gilang Pratama di tulisan FuzzyWuzzy

Sebelumnya saya telah membahas tentang penggunaan FuzzyWuzzy untuk melakukan similirity merek mobil, dimana brand “Honda Civic” memiliki similirity dengan “Honda” dan brand “Toyota Corolla” memiliki similiry dengan “Toyota” dengan nilai similirity sebesar 90.

Pada case sebelumnya kita terbantu karena sudah memiliki list atau dictionary dari merk mobil yaitu :

Merek = ['Honda','Toyota','Ford','Audi','Suzuki','Yamaha']

Muncul sebuah pertanyaan, yang kebetulan merupakan pertanyaan saat saya interview kerja hehehe,

Bagaimana jika tidak memiliki dictionary? 
Apakah masih bisa dilakukan pencarian similirity?

Jawaban nya adalah BISA, lantas bagaima cara nya? Metode apa yang dapat digunakan? Pada tulisan ini saya akan mencoba memberikan contoh penggunaan FuzzyWuzzy dalam mencari similiry pada data nama dan alur dari code versi saya.

Contoh

Diketahui terdapat suatu data dummy sebanyak 29 nama yang jika dilihat secara sekilas terdapat delapan orang yang penulisan nama nya berbeda beda, berikut datanya.

Nama = {'Nama':['M Haykal Narendra','Muhammad Haykal Narendra','M Haykal N','Haykal Narendra', 'Haykal N','Lintang Gilang Pratama', 'Lintang Gilang', 'Lintang G P', 'Lintang', 'Lintang Gilang P','Rindhy','Rindhyy Utami Muris', 'Rindhy Utami M', 'Rindi Utami ', 'Rindhy Utami','Dimas Galih Satrio', 'Dimass Galih', 'Dimas G S', 'Dimas Galih S', 'Dimas','Agung', 'Agung Kurniawan', 'Agung Kurniawan Sastro', 'Agung K S', 'Agungg Kurniawan','Haykal Lintang Rindhy Dimas Agung','Jokowi','Fiqaha', 'Fiqaha Hawalin'],}df = pd.DataFrame(Nama, columns = ['Nama'])

Pada data dummy ini saya memberikan beberapa “jebakan” seperti :

  1. Terdapat satu nama yang merupakan gabungan dari beberapa nama yaitu “Haykal Lintang Rindhy Dimas Agung”
  2. Terdapat tiga nama yang saya buat seperti kelebihan penulisan yaitu “Rindhyy Utami Muris”, “Dimass Galih”, dan “Agungg Kurniawan”
  3. Terdapat delapan nama yang ditulis dengan memiliki singkatan seperti “M Haykal N” dan “Dimas G S”

Tugas kita terhadap data ini adalah mengklasifikan data tersebut dan mencari similirity terhadapa nama lain, sehingga database yang dimiliki lebih rapi

Pembahasan

Pada tahap ini saya akan menerangkan alur dari code versi saya, tahap awal adalah membuat list atau dictionary yang bertujuan sebagai acuan similirity berikut adalah step text processing nya

  1. Buat kolom dummy dari data nama tersebut
  2. Buat kolom panjang dari karakter huruf dari data nama
  3. Buat kolom banyak nya kata dari data nama
  4. Hapus singkatan nama dimana hal ini bertujuan untuk memberikan insight yang lebih “bermakna” karena menurut saya terkadang singkatan memberi bias yang cukup tinggi
  5. Sorting data dari paling banyak huruf ke paling sedikit tujuan nya membuat prioritas acuan data yang akan digunakan sebagai dasar similirity
  6. Lakukan remove duplikat pada dictionary
  7. “dictionary_1” telah diperoleh

Step berikutnya adalah melakukan similirity menggunakan “dictionary_1”

  1. Lakukan similirity data dummy terhadap “dictionary_1” menggunakan package FuzzyWuzzy dengan scorer = fuzz.ratio
  2. Hasil dari step ini adalah similirity data dummy terhadap “dictionary_1” yang mana pada urutan satu merupakan similirity score 100 adalah dirinya sendiri dan urutan berikut nya adalah similirity yang mendekati score 100
  3. Lakukan filtering terhadap hasil similirity, dimana data yang diambil adalah jika similirity urutan kedua > 80, namun jika tidak maka yang diambil adalah similirity urutan kesatu tujuan nya adalah agar meng-global kan dictionary
  4. Lakukan remove duplikat pada dictionary
  5. “dictionary_2” telah diperoleh

Step Berikut nya adalah filtering dictionary kembali dengan cara melakukan similirity terhadapat “dictionary_2” dengan score 100, maka diperoleh “dictionary_3" sebanyak 16 data dari sebelum nya 29 data

Step selanjutnya adalah similirity per kata tujuan nya adalah untuk merapikan kata nya huruf nya kurang atau lebih beberapa huruf seperti “Dimass” seharusnya “Dimas”

  1. Berdasarkan “dictionary_3" lakukan split perkata sehingga diperolah “dictionary_kata” dan “dictionary_kata” ini tidak di remove duplikat
  2. Lakukan similirity terhadap “dictionary_kata” terhadap dirinya sendiri
  3. Similirity yang diambil adalah urutan kedua karena dengan asumsi kata yang memiliki kelebihan atau kurang huruf tidak lah banyak jumlah nya, sehingga dengan mengambil urutan kedua maka kita mengambil data terbanyak yang memiliki similirity terdekat, dimana syarat nya adalah jika score similirity urutan kedua > 80, jika tidak maka diambil similirity urutan satu, hasil nya sebagai berikut

Berdasrkan hasil diatas terlihat bahwa “Dimass” memiliki similirity dengan “Dimas” . Terlihat hanya ada tiga kata yang berstatus “False”. Menggunakan data diatas kita dapat melakukan replace word dari “dictionary_3” sebagai “y” menjadi “x” seperti pada data diatas sehingga diperoleh “dictionary_4”.

Setelah kita memperoleh “dictionary_4” maka kita bisa menggukan dictionary ini sebagai dictionary final yang akan kita gunakan di data dummy diawal, berikut hasil nya

Kesimpulan

Berdasarkan alur code seperti ini diperoleh 16 nama dari 29 data, karena pada proses text processing paling awal kita membentuk 11 data dengan satu kata saja yang mana dengan alur satu kata adalah satu nama sehingga memberikan impact yang cukup besar.

Hasil akan bisa lebih akurat jika dapat digabungkan dengan data lain, misal seperti data ID atau nomor telepon.

Alur ini juga masih dapat dikembangkan lebih lanjut seperti merubah menjadi huruf kecil semua , nama tanpa spasi atau saat melakukan similirity dengan huruf konsonan saja.

Sekian dulu dari saya tekait proses similiry tanpa dictionary untuk kode lengkap dapat di klik di github saya lintang gilang pratama atau bisa download colab.

Terimkasih

Lintang Gilang Pratama

--

--