Fuzzy match i frågetjänsten
Använd en 'luddig' matchning på dina Adobe Experience Platform-data för att returnera de mest troliga, ungefärliga matchningarna utan att behöva söka efter strängar med identiska tecken. Detta gör att du kan söka efter data på ett mycket flexiblare sätt och gör dina data mer tillgängliga genom att spara tid och arbete.
I stället för att försöka formatera om söksträngarna för att matcha dem analyserar den oskarpa matchningen förhållandet mellan två sekvenser och returnerar procentandelen likhet. FuzzyWuzzy rekommenderas för den här processen eftersom dess funktioner passar bättre för att matcha strängar i mer komplexa situationer jämfört med regex eller difflib.
Exemplet i det här fallet fokuserar på matchning av liknande attribut från en hotellrumssökning mellan två olika data från resebyråer. Dokumentet visar hur strängar ska matchas genom deras likhet från stora separata datakällor. I det här exemplet jämförs sökresultaten med ett rum från resebyråerna Luma och Acme.
Komma igång getting-started
Som en del av den här processen kräver att du utbildar en maskininlärningsmodell, vilket krävs i det här dokumentet för att du ska kunna lära dig en eller flera maskininlärningsmiljöer.
I det här exemplet används Python och Jupyter Notebook-utvecklingsmiljön. Det finns många alternativ, men Jupyter Notebook rekommenderas eftersom det är ett webbprogram med öppen källkod som har låga datorkrav. Den kan hämtas från den officiella Jupyter-webbplatsen.
Innan du börjar måste du importera de nödvändiga biblioteken. FuzzyWuzzy är ett Python-bibliotek med öppen källkod som är byggt ovanpå biblioteket difflib och som används för att matcha strängar. Levenshtein Distance används för att beräkna skillnaderna mellan sekvenser och mönster. FuzzyWuzzy har följande krav:
- Python 2.4 (eller senare)
- Python-Levenshtein
Använd följande kommando från kommandoraden för att installera FuzzyWuzzy:
pip install fuzzywuzzy
Eller använd följande kommando för att installera Python-Levenshtein också:
pip install fuzzywuzzy[speedup]
Mer teknisk information om Fuzzywuzzy finns i deras officiella dokumentation.
Anslut till frågetjänst
Du måste ansluta din maskininlärningsmodell till frågetjänsten genom att ange dina anslutningsreferenser. Du kan ange både utgångsdatum och icke-utgångsdatum. Mer information om hur du hämtar de nödvändiga inloggningsuppgifterna finns i handboken för inloggningsuppgifter. Om du använder Jupyter Notebook kan du läsa den fullständiga guiden om hur du ansluter till frågetjänsten.
Glöm inte att importera paketet numpy till din Python-miljö för att aktivera linjär algebra.
import numpy as np
Kommandona nedan krävs för att ansluta till frågetjänsten från 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()
Jupyter Notebook-instansen är nu ansluten till frågetjänsten. Om anslutningen lyckas visas inget meddelande. Om anslutningen misslyckas visas ett fel.
Draw-data från Luma-datauppsättningen luma-dataset
Analysdata hämtas från den första datauppsättningen med följande kommandon. I korthet har exemplen begränsats till de första 10 resultaten i kolumnen.
cur.execute('''SELECT * FROM luma;
''')
luma = np.array([r[0] for r in cur])
luma[:10]
Välj Utdata om du vill visa den returnerade arrayen.
code language-console |
---|
|
Draw data från Acme-datauppsättningen acme-dataset
Analysdata hämtas nu från den andra datauppsättningen med följande kommandon. Som en fortsättning har exemplen begränsats till de första 10 resultaten i kolumnen.
cur.execute('''SELECT * FROM acme;
''')
acme = np.array([r[0] for r in cur])
acme[:10]
Välj Utdata om du vill visa den returnerade arrayen.
code language-console |
---|
|
Skapa en otydlig poängfunktion fuzzy-scoring
Därefter måste du importera fuzz
från FuzzyWuzzy-biblioteket och utföra en partiell jämförelse av strängarna. Med funktionen för partiell proportion kan du utföra delsträngsmatchning. Detta tar den kortaste strängen och matchar den med alla delsträngar som har samma längd. Funktionen returnerar ett procentvärde för likhet på upp till 100 %. Funktionen för partiella proportioner skulle till exempel jämföra följande strängar 'Deluxe Room', '1 King Bed' och 'Deluxe King Room' och returnera en likhetspoäng på 69 %.
I hotell-rummet används följande kommandon:
from fuzzywuzzy import fuzz
def compute_match_score(x,y):
return fuzz.partial_ratio(x,y)
Importera sedan cdist
från biblioteket SciPy för att beräkna avståndet mellan varje par i de två indatamängderna. Detta beräknar poängen för alla par hotellrum som tillhandahålls av varje resebyrå.
from scipy.spatial.distance import cdist
pairwise_distance = cdist(luma.reshape((-1,1)),acme.reshape((-1,1)),compute_match_score)
Skapa mappningar mellan de två kolumnerna med hjälp av det oskarpa hörnet
Nu när kolumnerna har bedömts utifrån avstånd kan du indexera paren och bara behålla matchningar som har poängsatts högre än en viss procentandel. I det här exemplet behålls endast par som matchar med en poäng på 70 % eller högre.
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("'","''")))
Resultatet kan visas med följande kommando. Resultatet är begränsat till tio rader.
matched_pairs[:10]
Välj Utdata om du vill se resultatet.
code language-console |
---|
|
Resultatet matchas sedan med SQL med följande kommando:
matching_sql = ' OR '.join(["(e.luma = '{}' AND b.acme = '{}')".format(c1,c2) for c1,c2 in matched_pairs])
Använda mappningarna för att göra oskarp koppling i frågetjänsten mappings-for-query-service
Därefter förenas matchningspar med hög poäng med hjälp av SQL för att skapa en ny datauppsättning.
:
cur.execute('''
SELECT * FROM luma e
CROSS JOIN acme b
WHERE
{}
'''.format(matching_sql))
[r for r in cur]
Välj Utdata om du vill se resultatet av den här kopplingen.
code language-console |
---|
|
Spara oskarpa matchningsresultat till plattformen save-to-platform
Slutligen kan resultatet av den oskarpa matchningen sparas som en datauppsättning som kan användas i Adobe Experience Platform med hjälp av SQL.
cur.execute('''
Create table luma_acme_join
AS
(SELECT * FROM luma e
CROSS JOIN acme b
WHERE
{})
'''.format(matching_sql))