Ha szállodai szobaárakat hasonlítunk össze különböző weboldalak között, meg kell győződnünk arról, hogy az almát az almával hasonlítjuk össze

A számítástechnikában a fuzzy string matching az olyan karakterláncok megtalálásának technikája, amelyek megközelítőleg (és nem pontosan) egyeznek egy mintával. Más szóval, a fuzzy string matching egy olyan típusú keresés, amely akkor is talál talál találatokat, ha a felhasználók rosszul írják a szavakat, vagy csak részleges szavakat adnak meg a kereséshez. Hozzávetőleges karakterlánc-illesztésnek is nevezik.

Az elmosódott karakterlánc-keresés különböző alkalmazásokban használható, például:

  • Egy helyesírás-ellenőrző és helyesírási hiba-, gépelési hibajavító. Ha például egy felhasználó beírja a Google-ba a “Missisaga” szót, a találatok listáját kapja vissza a “Showing results for mississauga” kifejezéssel együtt. Vagyis a keresési lekérdezés akkor is eredményt ad vissza, ha a felhasználói bevitel további vagy hiányzó karaktereket, illetve más típusú helyesírási hibákat tartalmaz.
  • A szoftver használható a duplikált rekordok ellenőrzésére. Például, ha egy ügyfél többször szerepel különböző vásárlásoknál az adatbázisban a nevének eltérő írásmódja (pl. Abigail Martin vs. Abigail Martinez), egy új cím vagy egy tévesen megadott telefonszám miatt.

A dedupe-ról szólva, ez nem biztos, hogy olyan egyszerű, mint amilyennek hangzik, különösen, ha több százezer rekordról van szó. Még az Expedia sem csinálja 100%-ig jól:

Forrás: Expedia

Ez a bejegyzés elmagyarázza, mi az a fuzzy string matching a felhasználási esetekkel együtt, és példákat ad a Python Fuzzywuzzy könyvtárának használatával.

Minden szállodának saját nomenklatúrája van a szobák elnevezésére, ugyanez a forgatókönyv vonatkozik az online utazási irodákra (OTA) is. Például egy szobát ugyanabban a szállodában az Expedia “Studio, 1 King Bed with Sofa bed, Corner”, a Booking.com biztonságosnak találhatja, ha a szobát egyszerűen “Corner King Studio” néven mutatja.

Ezzel nincs semmi baj, de zavart okozhat, ha össze akarjuk hasonlítani a szobaárakat az OTA-k között, vagy ha az egyik OTA meg akar győződni arról, hogy a másik OTA betartja az árparitási megállapodást. Más szóval, ahhoz, hogy árat tudjunk összehasonlítani, meg kell győződnünk arról, hogy almát almával hasonlítunk össze.

Az árösszehasonlító webhelyek és alkalmazások egyik legkövetkezetesebben frusztráló problémája, hogy megpróbálják kitalálni, hogy két tétel (vagy szállodai szoba) ugyanarra a dologra vonatkozik-e, automatikusan.

A Fuzzywuzzy egy Python könyvtár, amely a Levenshtein távolságot használja a szekvenciák közötti különbségek kiszámítására egy egyszerűen használható csomagban.

A demonstrációhoz létrehozom a saját adathalmazomat, azaz ugyanarra a szállodai szálláshelyre veszek egy szobatípus az Expediától, mondjuk “Suite, 1 King Bed (Parlor)”, majd összevetem a Booking.com szobatípusával, ami “King Parlor Suite”. Egy kis tapasztalattal a legtöbb ember tudná, hogy ezek ugyanazok. Ezt a módszert követve létrehozok egy kis adathalmazt több mint 100 szobatípuspárral, amely megtalálható a Githubon.

Ezt az adathalmazt felhasználva fogjuk tesztelni, hogyan gondolkodik a Fuzzywuzzy. Más szóval, a Fuzzywuzzyt arra használjuk, hogy két adatforrás közötti rekordokat egyeztessünk.

import pandas as pddf = pd.read_csv('room_type.csv')
df.head(10)

1. ábra

Az adathalmazt magam készítettem, így nagyon tiszta.

A Fuzzywuzzyban két karakterlánc összehasonlításának több módja is van, próbáljuk ki őket egyesével.

  • ratio , a teljes karakterlánc hasonlóságát hasonlítja össze, sorrendben.
from fuzzywuzzy import fuzz
fuzz.ratio('Deluxe Room, 1 King Bed', 'Deluxe King Room')

Ez azt mondja, hogy a “Deluxe szoba, 1 királyi ágy” és a “Deluxe királyi szoba” páros körülbelül 62%-ban egyezik.

fuzz.ratio('Traditional Double Room, 2 Double Beds', 'Double Room with Two Double Beds')

A “Hagyományos kétágyas szoba, 2 franciaággyal” és a “Kétágyas szoba két franciaággyal” páros körülbelül 69%-ban egyezik.

fuzz.ratio('Room, 2 Double Beds (19th to 25th Floors)', 'Two Double Beds - Location Room (19th to 25th Floors)')

A “Room, 2 Double Beds (19-25. emelet)” és a “Two Double Beds – Location Room (19-25. emelet)” páros körülbelül 74%-ban megegyezik.

Csalódott vagyok ezekben. Kiderült, hogy a naiv megközelítés túlságosan érzékeny a szórendbeli apró különbségekre, a hiányzó vagy plusz szavakra és más hasonló problémákra.

  • partial_ratio , összehasonlítja a részleges string hasonlóságot.

Még mindig ugyanazokat az adatpárokat használjuk.

fuzz.partial_ratio('Deluxe Room, 1 King Bed', 'Deluxe King Room')
fuzz.partial_ratio('Traditional Double Room, 2 Double Beds', 'Double Room with Two Double Beds')
fuzz.partial_ratio('Room, 2 Double Beds (19th to 25th Floors)', 'Two Double Beds - Location Room (19th to 25th Floors)')

Az én adathalmazom esetében a részleges string összehasonlítása összességében nem hoz jobb eredményeket. Folytassuk.

  • token_sort_ratio , figyelmen kívül hagyja a szórendet.
fuzz.token_sort_ratio('Deluxe Room, 1 King Bed', 'Deluxe King Room')
fuzz.token_sort_ratio('Traditional Double Room, 2 Double Beds', 'Double Room with Two Double Beds')
fuzz.token_sort_ratio('Room, 2 Double Beds (19th to 25th Floors)', 'Two Double Beds - Location Room (19th to 25th Floors)')

Az eddigi legjobb.

  • token_set_ratio , figyelmen kívül hagyja a duplikált szavakat. Hasonló a token sort ratio-hoz, de egy kicsit rugalmasabb.
fuzz.token_set_ratio('Deluxe Room, 1 King Bed', 'Deluxe King Room')
fuzz.token_set_ratio('Traditional Double Room, 2 Double Beds', 'Double Room with Two Double Beds')
fuzz.token_set_ratio('Room, 2 Double Beds (19th to 25th Floors)', 'Two Double Beds - Location Room (19th to 25th Floors)')

Úgy tűnik, hogy a token_set_ratio megfelel a legjobban az adataimnak. Ennek a felfedezésnek megfelelően úgy döntöttem, hogy a token_set_ratio-et alkalmazom a teljes adathalmazomra.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.