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. FuzzyWuzzywordt geadviseerd voor dit proces aangezien zijn functies geschikter zijn helpen koorden in complexere situaties in vergelijking met regex of difflib aanpassen.
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.
In dit voorbeeld worden Python en de Jupyter Notebook -ontwikkelomgeving gebruikt. Hoewel er veel opties beschikbaar zijn, wordt Jupyter Notebook aanbevolen omdat het een opensource webtoepassing is die lage computervereisten heeft. Het kan van de officiële plaats van Jupyterworden gedownload.
Voordat u begint, moet u de benodigde bibliotheken importeren. FuzzyWuzzy is een opensource Python -bibliotheek die boven op de difflib -bibliotheek is gemaakt en wordt gebruikt om tekenreeksen overeen te laten komen. Levenshtein Distance wordt gebruikt om de verschillen tussen reeksen en patronen te berekenen. FuzzyWuzzy heeft de volgende vereisten:
- Python 2.4 (of hoger)
- Python-Levenshtein
Gebruik vanaf de opdrachtregel de volgende opdracht om FuzzyWuzzy te installeren:
pip install fuzzywuzzy
Of gebruik de volgende opdracht om Python-Levenshtein ook te installeren:
pip install fuzzywuzzy[speedup]
De meer technische informatie over Fuzzywuzzy kan in hun officiële documentatieworden gevonden.
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. Gelieve te zien de geloofsbrieven gidsvoor meer informatie over hoe te om de noodzakelijke geloofsbrieven te verwerven. Als u Jupyter Notebook gebruikt, te lezen gelieve de volledige gids op hoe te met de Dienst van de Vraagte verbinden.
Ook moet u het numpy -pakket importeren in de Python -omgeving om lineaire algebra in te schakelen.
import numpy as np
De onderstaande opdrachten zijn nodig om verbinding te maken met Query Service vanuit 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.
Draw-gegevens van de Luma-gegevensset luma-dataset
De gegevens voor analyse worden getrokken van de eerste dataset met de volgende bevelen. Kortom, de voorbeelden zijn beperkt tot de eerste 10 resultaten van de kolom.
cur.execute('''SELECT * FROM luma;
''')
luma = np.array([r[0] for r in cur])
luma[:10]
Selecteer Output om de teruggekeerde serie te tonen.
code language-console |
---|
|
Draw-gegevens 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]
Selecteer Output om de teruggekeerde serie te tonen.
code language-console |
---|
|
Een vage scores-functie maken fuzzy-scoring
Vervolgens moet u fuzz
importeren uit de FuzzyWuzzy-bibliotheek en een vergelijking van de tekenreeksen in een gedeeltelijke verhouding uitvoeren. 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)
Importeer vervolgens cdist
uit de SciPy -bibliotheek om de afstand tussen elk paar in de twee verzamelingen invoer 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 slechts gelijken behouden die hoger scored dan een bepaald percentage. 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. Voor de beknoptheid zijn de resultaten beperkt tot tien rijen.
matched_pairs[:10]
Selecteer Output 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]
Selecteer Output om de resultaten van dit te zien toetreden.
code language-console |
---|
|
Zwak gelijke resultaten opslaan naar 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))