クエリサービスのあいまい一致
Adobe Experience Platform データに対して「ファジー」一致を使用すると、最も可能性の高い近似一致を返すことができ、同じ文字を含む文字列を検索する必要はありません。 これにより、データをより柔軟に検索でき、時間と労力を節約してデータにアクセスしやすくなります。
あいまい一致は、検索文字列を一致させるために再書式設定を試みるのではなく、2 つのシーケンス間の類似性の割合を分析し、類似性の割合を返します。 FuzzyWuzzy の関数は、regex や difflib に比べてより複雑な状況で文字列を一致させるのに役立つので、このプロセスにお勧めします。
このユースケースで示す例では、2 つの異なる旅行代理店データセットをまたいでホテルの部屋検索から類似した属性を照合することに焦点を当てています。 このドキュメントでは、大きな異なるデータソースからの類似度に基づいて文字列を照合する方法を示しています。 この例では、あいまい一致で Luma と Acme の旅行代理店の部屋の機能の検索結果を比較しています。
はじめに getting-started
このプロセスの一部として機械学習モデルのトレーニングが必要なため、このドキュメントでは 1 つ以上の機械学習環境に関する実務知識を前提としています。
この例では、Python と Jupyter Notebook 開発環境を使用します。 使用できるオプションは多数ありますが、Jupyter Notebook れはオープンソースの web アプリケーションであり、計算要件が低いので、推奨されます。 これは、 公式 Jupyter サイトからダウンロードできます。
開始する前に、必要なライブラリを読み込む必要があります。 FuzzyWuzzy は、difflib ライブラリの上に構築されたオープンソース Python ライブラリで、文字列の照合に使用されます。 Levenshtein Distance を使用して、シーケンスとパターンの違いを計算します。 FuzzyWuzzy には以下の要件があります。
- Python 2.4 (またはそれ以降)
- Python-Levenshtein
コマンドラインから、次のコマンドを使用して FuzzyWuzzy をインストールします。
pip install fuzzywuzzy
または、次のコマンドを使用して、Python-Levenshtein もインストールします。
pip install fuzzywuzzy[speedup]
Fuzzywuzzy に関する技術情報については、こちらの 公式ドキュメントを参照してください。
クエリサービスへの接続
接続資格情報を指定して、機械学習モデルをクエリサービスに接続する必要があります。 有効期限のある資格情報と有効期限のない資格情報の両方を指定できます。 必要な資格情報の取得方法について詳しくは、 資格情報ガイドを参照してください。 Jupyter Notebook を使用している場合は、 クエリサービスへの接続方法に関する完全なガイドを参照してください。
また、線形代数を有効にするには、必ず numpy パッケージを Python 環境に読み込みます。
import numpy as np
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 インスタンスがクエリサービスに接続されました。 接続に成功した場合、メッセージは表示されません。 接続に失敗した場合は、エラーが表示されます。
Luma データセットからのDraw データ luma-dataset
次のコマンドを使用して、分析用のデータを最初のデータセットから取得します。 簡潔にするために、例は列の最初の 10 個の結果に制限されています。
cur.execute('''SELECT * FROM luma;
''')
luma = np.array([r[0] for r in cur])
luma[:10]
「出力」を選択すると、返された配列が表示されます。
code language-console |
---|
|
Acme データセットからのDraw データ acme-dataset
次のコマンドを使用して、分析用のデータを 2 番目のデータセットから取得できるようになりました。 ここでも、簡潔にするために、例は列の最初の 10 個の結果に制限されています。
cur.execute('''SELECT * FROM acme;
''')
acme = np.array([r[0] for r in cur])
acme[:10]
「出力」を選択すると、返された配列が表示されます。
code language-console |
---|
|
ファジースコア関数の作成 fuzzy-scoring
次に、FuzzyWuzzy ライブラリから fuzz
を読み込み、文字列の部分比比較を実行する必要があります。 部分比率関数を使用すると、部分文字列のマッチングを実行できます。 これは最短の文字列を取り、同じ長さのすべての部分文字列と照合します。 この関数は、最大 100% の類似性の割合を返します。 例えば、部分比率関数は、次の文字列「Deluxe Room」、「1 King Bed」、「Deluxe King Room」を比較し、類似性スコア 69% を返します。
ホテル ルーム マッチのユースケースでは、これは次のコマンドを使用して行われます。
from fuzzywuzzy import fuzz
def compute_match_score(x,y):
return fuzz.partial_ratio(x,y)
次に、SciPy ライブラリから cdist
を読み込んで、2 つの入力コレクション内の各ペア間の距離を計算します。 これは、各旅行代理店から提供されたホテルの部屋のすべてのペアのスコアを計算します。
from scipy.spatial.distance import cdist
pairwise_distance = cdist(luma.reshape((-1,1)),acme.reshape((-1,1)),compute_match_score)
あいまい結合スコアを使用して 2 つの列間にマッピングを作成します
距離に基づいて列がスコアリングされたので、ペアのインデックスを作成し、特定のパーセンテージより高いスコアリングの一致のみを保持できます。 この例では、70% 以上のスコアに一致したペアのみを保持します。
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("'","''")))
結果は、次のコマンドで表示できます。 簡潔にするために、結果は 10 行に制限されています。
matched_pairs[:10]
出力 を選択して、結果を確認します。
code language-console |
---|
|
次に、SQL で次のコマンドを使用して、結果を照合します。
matching_sql = ' OR '.join(["(e.luma = '{}' AND b.acme = '{}')".format(c1,c2) for c1,c2 in matched_pairs])
マッピングを適用してクエリサービスであいまい結合を行う mappings-for-query-service
次に、高スコアの一致するペアを SQL を使用して結合し、新しいデータセットを作成します。
:
cur.execute('''
SELECT * FROM luma e
CROSS JOIN acme b
WHERE
{}
'''.format(matching_sql))
[r for r in cur]
「出力」を選択して、この結合の結果を確認します。
code language-console |
---|
|
あいまい一致結果を Platform に保存 save-to-platform
最後に、あいまい一致の結果をデータセットとして保存し、SQL を使用してAdobe Experience Platformで使用できます。
cur.execute('''
Create table luma_acme_join
AS
(SELECT * FROM luma e
CROSS JOIN acme b
WHERE
{})
'''.format(matching_sql))