Fuzzy match in de Dienst van de Vraag
Gebruik een 'vage' match op je Adobe Experience Platform-gegevens om de meest waarschijnlijke, bijna overeenkomende overeenkomsten te retourneren zonder dat er naar tekenreeksen met identieke tekens moet worden gezocht. Hierdoor kunt u uw gegevens veel flexibeler doorzoeken en uw gegevens toegankelijker maken door tijd en moeite te besparen.
In plaats van te proberen om de onderzoekskoorden opnieuw te formatteren om hen aan te passen, analyseert de vage gelijke de verhouding van gelijkenis tussen twee opeenvolgingen en keert het percentage van gelijkenis terug. FuzzyWuzzy wordt aanbevolen voor dit proces, aangezien de functies ervan geschikter zijn om tekenreeksen in complexere situaties aan te passen in vergelijking met regex of difflib.
Het voorbeeld dat in dit gebruiksgeval wordt gegeven, is gericht op het afstemmen van vergelijkbare kenmerken van een zoekopdracht in een hotelkamer in twee verschillende gegevensbestanden voor reisbureaus. In het document wordt weergegeven hoe tekenreeksen op basis van de mate van overeenkomst met grote, afzonderlijke gegevensbronnen moeten worden vergeleken. In dit voorbeeld vergelijkt de wazzy match de zoekresultaten met de functies van een kamer van de reisbureaus Luma en Acme.
Aan de slag getting-started
Als onderdeel van dit proces moet u een model voor machinaal leren trainen, wordt in dit document uitgegaan van een praktische kennis van een of meer computerleeromgevingen.
Dit voorbeeld gebruikt Python en de Jupyter Notebook ontwikkelomgeving. Hoewel er veel opties beschikbaar zijn, Jupyter Notebook wordt aanbevolen omdat het een opensource webtoepassing is met lage computervereisten. Het kan worden gedownload van de officiële Jupyter-site.
Voordat u begint, moet u de benodigde bibliotheken importeren. FuzzyWuzzy is een open-sourced Python op de difflib en wordt gebruikt om tekenreeksen aan te passen. Gebruikt Levenshtein Distance om de verschillen tussen reeksen en patronen te berekenen. FuzzyWuzzy heeft de volgende eisen:
- Python 2.4 (of hoger)
- Python-Levenshtein
Gebruik vanaf de opdrachtregel de volgende opdracht om te installeren FuzzyWuzzy:
pip install fuzzywuzzy
Of gebruik de volgende opdracht om te installeren Python-Levenshtein ook:
pip install fuzzywuzzy[speedup]
Meer technische informatie over Fuzzywuzzy kan worden gevonden in hun officiële documentatie.
Verbinding maken met Query-service
U moet het model van het machinleren aan de Dienst van de Vraag verbinden door uw verbindingsgeloofsbrieven te verstrekken. Zowel kunnen het verlopen als niet-het verlopen geloofsbrieven worden verstrekt. Zie de aanmeldingsgids voor meer informatie over hoe te om de noodzakelijke geloofsbrieven te verkrijgen. Als u Jupyter Notebook, lees de volledige handleiding op hoe te met de Dienst van de Vraag te verbinden.
Zorg er ook voor dat u de numpy in uw Python omgeving om lineaire algebra mogelijk te maken.
import numpy as np
De hieronder bevelen zijn noodzakelijk om met de Dienst van de Vraag van te verbinden Jupyter Notebook:
import psycopg2
conn = psycopg2.connect('''
sslmode=require
host=<YOUR_ORGANIZATION_ID>
port=80
dbname=prod:all
user=<YOUR_ADOBE_ID_TO_CONNECT_TO_QUERY_SERVICE>
password=<YOUR_QUERY_SERVICE_PASSWORD>
''')
cur = conn.cursor()
Uw Jupyter Notebook -instantie is nu verbonden met Query Service. Als de verbinding tot stand is gebracht, wordt er geen bericht weergegeven. Als de verbinding mislukt, wordt een fout weergegeven.
Gegevens tekenen vanuit de Luminagedataset luma-dataset
De gegevens voor analyse worden getrokken van de eerste dataset met de volgende bevelen. Kortom, de voorbeelden zijn beperkt tot de eerste tien resultaten van de kolom.
cur.execute('''SELECT * FROM luma;
''')
luma = np.array([r[0] for r in cur])
luma[:10]
Selecteren Uitvoer om de geretourneerde array weer te geven.
code language-console |
---|
|
Gegevens tekenen uit de gegevensset Acme acme-dataset
De gegevens voor analyse worden nu getrokken van de tweede dataset met de volgende bevelen. Om kort te gaan, zijn de voorbeelden beperkt gebleven tot de eerste 10 resultaten van de kolom.
cur.execute('''SELECT * FROM acme;
''')
acme = np.array([r[0] for r in cur])
acme[:10]
Selecteren Uitvoer om de geretourneerde array weer te geven.
code language-console |
---|
|
Een vage scores-functie maken fuzzy-scoring
Vervolgens moet u importeren fuzz
uit de FuzzyWuzzy-bibliotheek en voer een vergelijking van de tekenreeksen in gedeeltelijke verhouding uit. Met de functie voor partiële verhoudingen kunt u overeenkomende subtekenreeksen uitvoeren. Hierbij wordt de kortste tekenreeks gebruikt die overeenkomt met alle subtekenreeksen met dezelfde lengte. De functie retourneert een percentage gelijkenis van maximaal 100%. De functie voor gedeeltelijke verhouding zou bijvoorbeeld de volgende tekenreeksen 'Deluxe Room', '1 King Bed' en 'Deluxe King Room' vergelijken en een vergelijkbare score van 69% retourneren.
In de het gebruikscase van de de ruimteovereenkomst van het hotel, wordt dit gedaan gebruikend de volgende bevelen:
from fuzzywuzzy import fuzz
def compute_match_score(x,y):
return fuzz.partial_ratio(x,y)
Volgende, importeren cdist
van de SciPy bibliotheek om de afstand tussen elk paar in de twee inzamelingen van input gegevens te berekenen. Dit berekent de scores onder alle paren hotelkamers die door elk van de reisbureaus worden verstrekt.
from scipy.spatial.distance import cdist
pairwise_distance = cdist(luma.reshape((-1,1)),acme.reshape((-1,1)),compute_match_score)
Toewijzingen maken tussen de twee kolommen met behulp van de vage samenvoegscore
Nu de kolommen zijn gescoord op afstand, kunt u de paren indexeren en alleen overeenkomsten behouden die een score hoger dan een bepaald percentage hebben. In dit voorbeeld blijven alleen paren behouden die overeenkomen met een score van 70% of hoger.
matched_pairs = []
for i,c1 in enumerate(luma):
idx = np.where(pairwise_distance[i,:] > 70)[0]
for j in idx:
matched_pairs.append((luma[i].replace("'","''"),acme[j].replace("'","''")))
De resultaten kunnen met het volgende bevel worden getoond. Kortom, de resultaten zijn beperkt tot tien rijen.
matched_pairs[:10]
Selecteren Uitvoer om de resultaten te zien.
code language-console |
---|
|
De resultaten worden dan aangepast gebruikend SQL met het volgende bevel:
matching_sql = ' OR '.join(["(e.luma = '{}' AND b.acme = '{}')".format(c1,c2) for c1,c2 in matched_pairs])
Pas de afbeeldingen toe om vage verbindingen in de Dienst van de Vraag uit te voeren mappings-for-query-service
Daarna, worden de high-scoring passende paren aangesloten bij het gebruiken van SQL om een nieuwe dataset tot stand te brengen.
:
cur.execute('''
SELECT * FROM luma e
CROSS JOIN acme b
WHERE
{}
'''.format(matching_sql))
[r for r in cur]
Selecteren Uitvoer om de resultaten van deze verbinding te zien.
code language-console |
---|
|
Zwak overeenkomende resultaten opslaan in Platform save-to-platform
Tot slot kunnen de resultaten van de vage gelijke als dataset voor gebruik in Adobe Experience Platform worden bewaard gebruikend SQL.
cur.execute('''
Create table luma_acme_join
AS
(SELECT * FROM luma e
CROSS JOIN acme b
WHERE
{})
'''.format(matching_sql))