Wanneer we de prijs van een hotelkamer op verschillende websites vergelijken, moeten we er zeker van zijn dat we appels met appels vergelijken

In de informatica is fuzzy string matching de techniek van het vinden van strings die bij benadering (in plaats van exact) overeenkomen met een patroon. Met andere woorden, fuzzy string matching is een type zoekmethode waarbij matches worden gevonden, zelfs wanneer gebruikers woorden verkeerd spellen of slechts gedeeltelijke woorden invoeren voor de zoekactie. Het is ook bekend als approximate string matching.

Fuzzy string zoeken kan worden gebruikt in verschillende toepassingen, zoals:

  • Een spellingcontrole en spelling-fouten, typefouten corrector. Bijvoorbeeld, een gebruiker typt “Missisaga” in Google, een lijst van treffers wordt geretourneerd samen met “Resultaten tonen voor mississauga”. Dat wil zeggen, zoekopdracht retourneert resultaten, zelfs als de gebruiker input bevat extra of ontbrekende tekens, of andere vormen van spelfouten.
  • Een software kan worden gebruikt om te controleren op dubbele records. Bijvoorbeeld, als een klant wordt vermeld meerdere malen met verschillende aankopen in de database als gevolg van verschillende spellingen van hun naam (dat wil zeggen Abigail Martin vs Abigail Martinez) een nieuw adres, of een verkeerd ingevoerde telefoonnummer.

Speaking of dedupe, kan het niet zo eenvoudig als het klinkt, in het bijzonder als je honderdduizenden records. Zelfs Expedia maakt het niet 100% goed:

Bron: Expedia

In dit bericht wordt uitgelegd wat fuzzy string matching is, samen met de gebruikssituaties en worden voorbeelden gegeven met behulp van de Fuzzywuzzy-bibliotheek van Python.

Elk hotel heeft zijn eigen nomenclatuur om zijn kamers te benoemen, hetzelfde scenario geldt voor Online Travel Agency (OTA). Bijvoorbeeld, een kamer in hetzelfde hotel, Expedia noemt “Studio, 1 King Bed met Sofa bed, Corner”, Booking.com kan vinden veilig in het tonen van de kamer gewoon als een “Corner King Studio”.

Er is niets mis hier, maar het kan leiden tot verwarring wanneer we willen kamerprijs vergelijken tussen OTA’s, of een OTA wil ervoor zorgen dat een andere OTA volgt de tarief pariteit overeenkomst. Met andere woorden, om prijs te kunnen vergelijken, moeten we ervoor zorgen dat we appels met appels vergelijken.

Een van de meest consequent frustrerende problemen voor prijsvergelijkingswebsites en apps is het proberen uit te vinden of twee items (of hotelkamers) automatisch voor hetzelfde zijn.

Fuzzywuzzy is een Python-bibliotheek die Levenshtein Distance gebruikt om de verschillen tussen reeksen te berekenen in een eenvoudig te gebruiken pakket.

Om dit te demonstreren, maak ik mijn eigen dataset, dat wil zeggen, voor hetzelfde hotel, neem ik een kamertype van Expedia, laten we zeggen “Suite, 1 King Bed (Parlor)”, dan match ik het met een kamertype in Booking.com dat “King Parlor Suite” is. Met een beetje ervaring, zouden de meeste mensen weten dat dit hetzelfde is. Volg deze methodologie, maak ik een kleine data set met meer dan 100 kamer type paren die kan worden gevonden op Github.

Gebruik makend van deze data set, gaan we testen hoe Fuzzywuzzy denkt. Met andere woorden, we gebruiken Fuzzywuzzy om records te matchen tussen twee gegevensbronnen.

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

Figuur 1

De dataset is door mijzelf gemaakt, dus hij is erg schoon.

Er zijn verschillende manieren om twee strings te vergelijken in Fuzzywuzzy, laten we ze een voor een proberen.

  • ratio , vergelijkt de volledige string-gelijkenis, in volgorde.
from fuzzywuzzy import fuzz
fuzz.ratio('Deluxe Room, 1 King Bed', 'Deluxe King Room')

Dit vertelt ons dat de “Deluxe kamer, 1 kingsize bed” en de “Deluxe King Room” voor ongeveer 62% identiek zijn.

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

De “Traditionele Tweepersoonskamer, 2 Tweepersoonsbedden” en de “Tweepersoonskamer met Twee Tweepersoonsbedden” zijn voor ongeveer 69% identiek.

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

De “Kamer, 2 Tweepersoonsbedden (19e tot 25e Verdieping)” en “Tweepersoonskamer met Twee Tweepersoonsbedden – Locatiekamer (19e tot 25e Verdieping)” zijn voor ongeveer 74% gelijk.

Ik ben teleurgesteld over deze. Het blijkt dat de naïeve benadering veel te gevoelig is voor kleine verschillen in woordvolgorde, ontbrekende of extra woorden, en andere dergelijke zaken.

  • partial_ratio , vergelijkt partial string similarity.

We gebruiken nog steeds dezelfde dataparen.

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)')

Voor mijn dataset levert het vergelijken van partial string over het geheel genomen geen betere resultaten op. Laten we doorgaan.

  • token_sort_ratio , negeert woordvolgorde.
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)')

Beste tot nu toe.

  • token_set_ratio , negeert gedupliceerde woorden. Het is vergelijkbaar met token sort ratio, maar een beetje flexibeler.
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)')

Het lijkt erop dat token_set_ratio het beste past bij mijn gegevens. Op grond van deze ontdekking heb ik besloten token_set_ratio op mijn hele gegevensverzameling toe te passen.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.