Fuzzy Match in Query Service
Verwenden Sie eine "unscharfe"Übereinstimmung Ihrer Adobe Experience Platform-Daten, um die wahrscheinlichsten, ungefähren Übereinstimmungen zurückzugeben, ohne nach Zeichenfolgen mit identischen Zeichen suchen zu müssen. Dies ermöglicht eine wesentlich flexiblere Suche nach Ihren Daten und erleichtert den Zugriff auf Ihre Daten, indem Zeit und Mühe eingespart werden.
Statt zu versuchen, die Suchzeichenfolgen neu zu formatieren, um sie abzugleichen, analysiert die unscharfe Übereinstimmung das Verhältnis der Ähnlichkeit zwischen zwei Sequenzen und gibt den Prozentsatz der Ähnlichkeit zurück. FuzzyWuzzy wird für diesen Prozess empfohlen, da seine Funktionen besser dazu geeignet sind, Zeichenfolgen in komplexeren Situationen im Vergleich zu regex oder difflib zuzuordnen.
Das in diesem Anwendungsfall bereitgestellte Beispiel konzentriert sich auf das Abgleichen ähnlicher Attribute aus einer Hotelzimmersuche über zwei verschiedene Reisebüro-Datensätze hinweg. Das Dokument zeigt, wie Zeichenfolgen anhand ihres Ähnlichkeitsgrads mit großen separaten Datenquellen abgeglichen werden. In diesem Beispiel vergleicht die Fuzzy Match die Suchergebnisse für die Funktionen eines Zimmers der Reisebüros Luma und Acme.
Erste Schritte getting-started
Im Rahmen dieses Prozesses müssen Sie ein Modell für maschinelles Lernen trainieren. In diesem Dokument wird davon ausgegangen, dass Sie über Kenntnisse in einer oder mehreren Umgebungen für maschinelles Lernen verfügen.
In diesem Beispiel werden Python und die Entwicklungsumgebung Jupyter Notebook verwendet. Obwohl viele Optionen verfügbar sind, wird Jupyter Notebook empfohlen, da es sich um eine Open-Source-Webanwendung mit niedrigen Rechenanforderungen handelt. Sie kann von der offiziellen Jupyter-Site heruntergeladen werden.
Bevor Sie beginnen, müssen Sie die erforderlichen Bibliotheken importieren. FuzzyWuzzy ist eine Open-Source-Bibliothek mit dem Namen Python, die auf der Bibliothek difflib aufbaut und zum Abgleichen von Zeichenfolgen verwendet wird. Es verwendet Levenshtein Distance, um die Unterschiede zwischen Sequenzen und Mustern zu berechnen. FuzzyWuzzy hat die folgenden Anforderungen:
- Python 2.4 (oder höher)
- Python-Levenshtein
Verwenden Sie in der Befehlszeile den folgenden Befehl, um FuzzyWuzzy zu installieren:
pip install fuzzywuzzy
Oder verwenden Sie den folgenden Befehl, um auch Python-Levenshtein zu installieren:
pip install fuzzywuzzy[speedup]
Weitere technische Informationen zu Fuzzywuzzy finden Sie in der offiziellen Dokumentation.
Verbindung zu Query Service herstellen
Sie müssen Ihr maschinelles Lernmodell mit Query Service verbinden, indem Sie Ihre Anmeldedaten für die Verbindung angeben. Es können sowohl ablaufende als auch nicht ablaufende Anmeldeinformationen bereitgestellt werden. Weitere Informationen zum Erwerb der erforderlichen Anmeldeinformationen finden Sie im Handbuch zu Anmeldeinformationen . Wenn Sie Jupyter Notebook verwenden, lesen Sie bitte das vollständige Handbuch unter Verbindung zu Query Service herstellen.
Importieren Sie außerdem das Paket numpy in Ihre Python-Umgebung, um die lineare Algebra zu aktivieren.
import numpy as np
Die folgenden Befehle sind erforderlich, um von Jupyter Notebook aus eine Verbindung mit Query Service herzustellen:
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()
Ihre Jupyter Notebook -Instanz ist jetzt mit Query Service verbunden. Wenn die Verbindung erfolgreich hergestellt wurde, wird keine Meldung angezeigt. Wenn die Verbindung fehlgeschlagen ist, wird ein Fehler angezeigt.
Draw-Daten aus dem Luma-Datensatz luma-dataset
Daten für die Analyse werden aus dem ersten Datensatz mit den folgenden Befehlen gezogen. Aus Gründen der Kürze wurden die Beispiele auf die ersten 10 Ergebnisse der Spalte beschränkt.
cur.execute('''SELECT * FROM luma;
''')
luma = np.array([r[0] for r in cur])
luma[:10]
Wählen Sie Ausgabe aus, um das zurückgegebene Array anzuzeigen.
code language-console |
---|
|
Draw-Daten aus dem Acme-Datensatz acme-dataset
Daten für die Analyse werden nun aus dem zweiten Datensatz mit den folgenden Befehlen abgerufen. Auch hier waren die Beispiele aus Gründen der Kürze auf die ersten 10 Ergebnisse der Spalte beschränkt.
cur.execute('''SELECT * FROM acme;
''')
acme = np.array([r[0] for r in cur])
acme[:10]
Wählen Sie Ausgabe aus, um das zurückgegebene Array anzuzeigen.
code language-console |
---|
|
Erstellen einer unscharfen Scoring-Funktion fuzzy-scoring
Als Nächstes müssen Sie fuzz
aus der FuzzyWuzzy-Bibliothek importieren und einen partiellen Quotientenvergleich der Strings durchführen. Mit der Funktion für das Teilverhältnis können Sie eine Übereinstimmung mit Teilzeichenfolgen durchführen. Hierbei wird die kürzeste Zeichenfolge verwendet und mit allen Unterzeichenfolgen abgeglichen, die dieselbe Länge aufweisen. Die Funktion gibt ein prozentuales Ähnlichkeitsverhältnis von bis zu 100 % zurück. Beispielsweise würde die Funktion für das Teilverhältnis die folgenden Zeichenfolgen "Deluxe Room", "1 King Bed"und "Deluxe King Room"vergleichen und eine Ähnlichkeitsbewertung von 69 % zurückgeben.
Im Anwendungsfall zur Übereinstimmung von Hotelzimmern wird dies mit den folgenden Befehlen durchgeführt:
from fuzzywuzzy import fuzz
def compute_match_score(x,y):
return fuzz.partial_ratio(x,y)
Importieren Sie als Nächstes cdist
aus der SciPy-Bibliothek, um den Abstand zwischen den einzelnen Paaren in den beiden Eingaben zu berechnen. Dadurch werden die Bewertungen unter allen Paaren von Hotelzimmern berechnet, die von den einzelnen Reisebüros bereitgestellt werden.
from scipy.spatial.distance import cdist
pairwise_distance = cdist(luma.reshape((-1,1)),acme.reshape((-1,1)),compute_match_score)
Erstellen Sie Zuordnungen zwischen den beiden Spalten mithilfe der unscharfen Join-Punktzahl.
Nachdem die Spalten nun auf der Grundlage der Entfernung bewertet wurden, können Sie die Paare indizieren und nur Treffer beibehalten, die höher als ein bestimmter Prozentsatz waren. In diesem Beispiel werden nur Paare beibehalten, die mit einem Wert von 70 % oder höher übereinstimmen.
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("'","''")))
Die Ergebnisse können mit dem folgenden Befehl angezeigt werden. Aus Gründen der Kürze sind die Ergebnisse auf zehn Zeilen beschränkt.
matched_pairs[:10]
Wählen Sie Ausgabe aus, um die Ergebnisse anzuzeigen.
code language-console |
---|
|
Die Ergebnisse werden dann mithilfe von SQL mit dem folgenden Befehl abgeglichen:
matching_sql = ' OR '.join(["(e.luma = '{}' AND b.acme = '{}')".format(c1,c2) for c1,c2 in matched_pairs])
Anwenden der Zuordnungen für unscharfe Verknüpfungen in Query Service mappings-for-query-service
Als Nächstes werden die Paare, die mit hoher Scoring übereinstimmen, mithilfe von SQL verknüpft, um einen neuen Datensatz zu erstellen.
:
cur.execute('''
SELECT * FROM luma e
CROSS JOIN acme b
WHERE
{}
'''.format(matching_sql))
[r for r in cur]
Wählen Sie Ausgabe aus, um die Ergebnisse dieses Joins anzuzeigen.
code language-console |
---|
|
Unscharfe Übereinstimmungsergebnisse in Platform speichern save-to-platform
Schließlich können die Ergebnisse der unscharfen Übereinstimmung als Datensatz gespeichert werden, der in Adobe Experience Platform mit SQL verwendet werden kann.
cur.execute('''
Create table luma_acme_join
AS
(SELECT * FROM luma e
CROSS JOIN acme b
WHERE
{})
'''.format(matching_sql))