Correspondência difusa no Serviço de consulta
Use uma correspondência "difusa" nos dados do Adobe Experience Platform para retornar as correspondências aproximadas mais prováveis, sem a necessidade de pesquisar cadeias de caracteres com caracteres idênticos. Isso permite uma pesquisa muito mais flexível de seus dados e torna seus dados mais acessíveis, economizando tempo e esforço.
Em vez de tentar reformatar as cadeias de caracteres de pesquisa para correspondê-las, a correspondência difusa analisa a proporção de similaridade entre duas sequências e retorna a porcentagem de similaridade. FuzzyWuzzy é recomendado para este processo, pois suas funções são mais adequadas para ajudar a corresponder cadeias de caracteres em situações mais complexas em comparação com regex ou difflib.
O exemplo fornecido neste caso de uso se concentra em corresponder atributos semelhantes de uma pesquisa de quarto de hotel em dois conjuntos de dados de agências de viagens diferentes. O documento demonstra como fazer a correspondência de strings por seu grau de similaridade a partir de grandes fontes de dados separadas. Neste exemplo, a correspondência difusa compara os resultados da pesquisa para os recursos de um quarto das agências de viagens Luma e Acme.
Introdução getting-started
Como parte desse processo requer que você treine um modelo de aprendizado de máquina, este documento presume um conhecimento prático de um ou mais ambientes de aprendizado de máquina.
Este exemplo usa Python e o ambiente de desenvolvimento Jupyter Notebook. Embora existam muitas opções disponíveis, Jupyter Notebook é recomendado porque é um aplicativo web de código aberto que tem poucos requisitos computacionais. Ele pode ser baixado de o site oficial do Jupyter.
Antes de começar, você deve importar as bibliotecas necessárias. FuzzyWuzzy é uma biblioteca Python de código aberto criada sobre a biblioteca difflib e usada para corresponder a cadeias de caracteres. Ele usa Levenshtein Distance para calcular as diferenças entre sequências e padrões. FuzzyWuzzy tem os seguintes requisitos:
- Python 2.4 (ou posterior)
- Python-Levenshtein
Na linha de comando, use o seguinte comando para instalar o FuzzyWuzzy:
pip install fuzzywuzzy
Ou use o seguinte comando para instalar Python-Levenshtein também:
pip install fuzzywuzzy[speedup]
Mais informações técnicas sobre Fuzzywuzzy podem ser encontradas na documentação oficial.
Conectar-se ao Serviço de consulta
Você deve conectar seu modelo de aprendizado de máquina ao Serviço de consulta fornecendo suas credenciais de conexão. As credenciais com e sem expiração podem ser fornecidas. Consulte o guia de credenciais para obter mais informações sobre como adquirir as credenciais necessárias. Se você estiver usando o Jupyter Notebook, leia o guia completo sobre como se conectar ao Serviço de Consulta.
Além disso, certifique-se de importar o pacote numpy para o ambiente Python para habilitar a álgebra linear.
import numpy as np
Os comandos abaixo são necessários para se conectar ao Serviço de Consulta de 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()
Sua instância Jupyter Notebook agora está conectada ao Serviço de consulta. Se a conexão for bem-sucedida, nenhuma mensagem será exibida. Se a conexão falhar, um erro será exibido.
Dados do Draw do conjunto de dados Luma luma-dataset
Os dados para análise são retirados do primeiro conjunto de dados com os seguintes comandos. Por motivos de brevidade, os exemplos foram limitados aos primeiros 10 resultados da coluna.
cur.execute('''SELECT * FROM luma;
''')
luma = np.array([r[0] for r in cur])
luma[:10]
Selecione Saída para exibir a matriz retornada.
code language-console |
---|
|
Dados do Draw do conjunto de dados Acme acme-dataset
Os dados para análise agora são retirados do segundo conjunto de dados com os seguintes comandos. Novamente, por questões de brevidade, os exemplos foram limitados aos primeiros 10 resultados da coluna.
cur.execute('''SELECT * FROM acme;
''')
acme = np.array([r[0] for r in cur])
acme[:10]
Selecione Saída para exibir a matriz retornada.
code language-console |
---|
|
Criar uma função de pontuação difusa fuzzy-scoring
Em seguida, você deve importar fuzz
da biblioteca FuzzyWuzzy e executar uma comparação de proporção parcial das cadeias de caracteres. A função de proporção parcial permite executar a correspondência de substring. Isto pega a string mais curta e combina com todas as sub- strings que tenham o mesmo comprimento. A função retorna uma taxa de similaridade percentual de até 100%. Por exemplo, a função de proporção parcial compararia as seguintes strings "Quarto Deluxe", "1 Cama King" e "Quarto King Deluxe" e retornaria uma pontuação de similaridade de 69%.
No caso de uso de correspondência de quarto de hotel, isso é feito usando os seguintes comandos:
from fuzzywuzzy import fuzz
def compute_match_score(x,y):
return fuzz.partial_ratio(x,y)
Em seguida, importe cdist
da biblioteca SciPy para calcular a distância entre cada par nas duas coleções de entradas. Este cálculo calcula as pontuações entre todos os pares de quartos de hotel fornecidos por cada uma das agências de viagens.
from scipy.spatial.distance import cdist
pairwise_distance = cdist(luma.reshape((-1,1)),acme.reshape((-1,1)),compute_match_score)
Criar mapeamentos entre as duas colunas usando a pontuação de junção difusa
Agora que as colunas foram pontuadas com base na distância, você pode indexar os pares e reter somente correspondências que tiveram pontuação maior do que uma determinada porcentagem. Este exemplo retém apenas pares que corresponderam a uma pontuação de 70% ou superior.
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("'","''")))
Os resultados podem ser exibidos com o comando a seguir. Por motivos de brevidade, os resultados são limitados a dez linhas.
matched_pairs[:10]
Selecione Saída para ver os resultados.
code language-console |
---|
|
Os resultados são correspondidos usando SQL com o seguinte comando:
matching_sql = ' OR '.join(["(e.luma = '{}' AND b.acme = '{}')".format(c1,c2) for c1,c2 in matched_pairs])
Aplicar os mapeamentos para fazer junção difusa no Serviço de consulta mappings-for-query-service
Em seguida, os pares correspondentes de alta pontuação são unidos usando SQL para criar um novo conjunto de dados.
:
cur.execute('''
SELECT * FROM luma e
CROSS JOIN acme b
WHERE
{}
'''.format(matching_sql))
[r for r in cur]
Selecione Saída para ver os resultados desta junção.
code language-console |
---|
|
Salvar resultados de correspondência difusa na Platform save-to-platform
Por fim, os resultados da correspondência difusa podem ser salvos como um conjunto de dados para uso no Adobe Experience Platform usando SQL.
cur.execute('''
Create table luma_acme_join
AS
(SELECT * FROM luma e
CROSS JOIN acme b
WHERE
{})
'''.format(matching_sql))