Amazon2023购物难于搜索的查询与产品语义匹配数据集和算法

摘要:

合集:AI案例-NLP-零售业
AI问题:语义相似度识别
数据集:Amazon2023购物难于搜索的查询与产品语义匹配数据集
数据集价值:促进查询与产品语义匹配领域的研究
解决方案:句子嵌入模型等自然语言处理技术

一、问题描述

Amazon购物查询数据集是一个包含大量难搜索查询的大型数据集,发布该数据集的目的是为了促进查询与产品语义匹配领域的研究。对于每个购物查询,数据集提供了多达40个潜在相关结果,以及ESCI相关性判断(Exact/精确、Substitute/替代、Complement/补充、Irrelevant/无关),表明产品与查询的相关性。每个查询-产品对都附有额外的信息。该数据集是多语言的,因为它包含了英语、日语和西班牙语的查询。

发布这个数据集的主要目标是创建一个基准,用于构建新的排名策略,并同时识别有趣的结果类别(即替代品),这些结果类别可以用来提高搜索产品时的客户体验。使用这个购物查询数据集在文献中研究的三个不同任务是:

任务1 – 查询-产品排名:给定用户指定的查询和匹配的产品列表,该任务的目标是对产品进行排名,使得相关产品排在非相关产品之上。

任务2 – 多类产品质量分类:给定一个查询和为该查询检索的产品结果列表,该任务的目标是将每个产品分类为精确匹配、替代匹配、补充匹配或无关匹配。

任务3 – 产品替代品识别:该任务将衡量系统识别给定查询结果列表中替代产品的能力。

二、数据集内容

Amazon购物查询数据集在 2023 年 7 月 由 Amazon 和华盛顿大学的研究团队联合发布。发布信息详见论文:“Amazon Shopping Queries Dataset: A Large-Scale ESCI Benchmark for Improving Product Search”。它旨在帮助研究人员和开发者提高搜索相关性,并以 ESCI(Exact, Substitute, Complement, Irrelevant)标签评估搜索查询和商品之间的相关性。

Amazon Shopping Queries Dataset 的 shopping_queries_dataset_products 数据集是 Amazon 提供的一部分,专注于产品搜索研究,特别是 ESCI(Exact, Substitute, Complement, Irrelevant)评估标注的任务。

Amazon Shopping Queries Dataset 提供了多个数据文件,其中包括 shopping_queries_dataset_products.parquetshopping_queries_dataset_examples.parquet。它们分别包含与产品和查询样本相关的信息,具体数据结构如下:

产品信息

文件:shopping_queries_dataset_products.parquet

shopping_queries_dataset_products.parquet 文件主要存储与产品相关的信息。其典型数据字段如下:

字段名数据类型描述
product_idstring产品的唯一标识符 (Amazon 内部 ID)。
titlestring产品标题,用于描述产品的核心信息,例如品牌、类型、功能等。
descriptionstring产品的详细描述,包含功能、用途等附加信息 (可能为空)。
brandstring产品品牌名称,例如 “Sony”、”Samsung”。
categorystring产品所属的分类路径,通常是层级式结构,例如 Electronics > Computers > Laptops
pricefloat产品价格 (某些情况下可能为空)。
image_urlstring产品图片的 URL,用于多模态任务或展示 (某些情况下可能为空)。

示例数据

{
  "product_id": "B08XY8GQXJ",
  "title": "Wireless Bluetooth Headphones, Over Ear Headset with Microphone",
  "description": "High-quality wireless headphones with noise cancellation, 30-hour battery life, and Bluetooth 5.0.",
  "brand": "SoundMax",
  "category": "Electronics > Audio > Headphones",
  "price": 59.99,
  "image_url": "https://example.com/product-image.jpg"
}

查询和产品的匹配度

shopping_queries_dataset_examples.parquet 文件包含与查询和产品关系相关的样本数据,特别是 ESCI 标注。其字段说明如下:

字段名数据类型描述
query_idstring搜索查询的唯一标识符,用于与查询数据关联。
querystring用户搜索的查询文本。
product_idstring产品的唯一标识符,用于与 shopping_queries_dataset_products 数据集关联。
esci_labelstring产品与查询的关系标注,值为 ExactSubstituteComplementIrrelevant
query_localestring查询的语言或区域信息,例如 en_USde_DE

示例数据

{
  "query_id": "Q12345",
  "query": "wireless headphones",
  "product_id": "B08XY8GQXJ",
  "esci_label": "Exact",
  "query_locale": "en_US"
}

查询样本的来源

存储数据的来源信息,表明每条查询样本的来源或类别,用于分析不同数据来源的分布情况。

数据字段定义:

字段名数据类型描述
query_idstring查询的唯一标识符,与 shopping_queries_dataset_examples.parquetquery_id 对应。
sourcestring查询样本的来源,例如 organic (自然搜索) 或 sponsored (广告)。

数据样例:

query_idsource
0other
1negations
2negations
3negations
4behavioral
5negations
6negations
7negations
8other

三者之间的关系

shopping_queries_dataset_products.parquet 中的 product_idshopping_queries_dataset_examples.parquet 中的 product_id 相对应。 shopping_queries_dataset_examples.parquet 中的 query_id 可以进一步关联到查询相关的数据(可能存储在其他文件中)。 shopping_queries_dataset_products.parquet:用于理解产品的属性、分类和价格信息。 shopping_queries_dataset_examples.parquet:用于分析查询与产品的匹配关系,训练搜索优化模型。

数据集版权许可协议

Apache2.0

数据集引用要求

@article{reddy2022shopping,
title={Shopping Queries Dataset: A Large-Scale {ESCI} Benchmark for Improving Product Search},
author={Chandan K. Reddy and Lluís Màrquez and Fran Valero and Nikhil Rao and Hugo Zaragoza and Sambaran Bandyopadhyay and Arnab Biswas and Anlu Xing and Karthik Subbian},
year={2022},
eprint={2206.06588},
archivePrefix={arXiv}

三、解析

安装

参考文章《安装深度学习框架PyTorch》安装PyTorch,同时安装sentence-transformers。sentence-transformers是一个基于PyTorch的Python库,用于训练、微调和部署句子嵌入模型。句子嵌入模型是一种自然语言处理(NLP)技术,用于将句子或文本片段转换为固定大小的向量表示。这些向量捕获了句子的语义信息,使得相似的句子在向量空间中彼此靠近。句子嵌入模型在许多NLP任务中都非常有用,如文本分类、情感分析、问答系统、机器翻译、文本相似度计算等。

conda install sentence-transformers
conda list sentence-transformers

输出:

# Name                    Version                   Build  Channel
sentence-transformers     3.3.1              pyhd8ed1ab_0    conda-forge

查看sentence-transformers开发包信息,包括包依赖信息:

pip show sentence-transformers

输出:

Name: sentence-transformers
Version: 3.3.1
Summary: State-of-the-Art Text Embeddings
Home-page: https://www.SBERT.net
Author:
Author-email: Nils Reimers <info@nils-reimers.de>, Tom Aarsen <tom.aarsen@huggingface.co>
License: Apache 2.0
Location: d:\app-data\conda3\envs\pytorch241-gpu\lib\site-packages
Requires: huggingface-hub, Pillow, scikit-learn, scipy, torch, tqdm, transformers
Required-by:

可以发现sentence-transformers依赖于:torch和transformers等开发包。

源码解析

导入开发包

import argparse
from sentence_transformers.cross_encoder import CrossEncoder
from sentence_transformers.cross_encoder.evaluation import CERerankingEvaluator
from sentence_transformers import SentenceTransformer, InputExample, losses
from sentence_transformers import evaluation
import os
import pandas as pd
import torch
from torch.utils.data import DataLoader
from sklearn.model_selection import train_test_split

加载数据集

import pandas as pd
df_examples = pd.read_parquet('shopping_queries_dataset_examples.parquet')
df_products = pd.read_parquet('shopping_queries_dataset_products.parquet')
df_sources = pd.read_csv("shopping_queries_dataset_sources.csv")

关联查询和产品信息

df_examples_products = pd.merge(
    df_examples,
    df_products,
    how='left',
    left_on=['product_locale','product_id'],
    right_on=['product_locale', 'product_id']
)

为任务1准备训练和测试集

df_task_1 = df_examples_products[df_examples_products["small_version"] == 1]
df_task_1_train = df_task_1[df_task_1["split"] == "train"]
df_task_1_test = df_task_1[df_task_1["split"] == "test"]

为任务2准备训练和测试集

df_task_2 = df_examples_products[df_examples_products["large_version"] == 1]
df_task_2_train = df_task_2[df_task_2["split"] == "train"]
df_task_2_test = df_task_2[df_task_2["split"] == "test"]

为任务3准备训练和测试集

df_task_3 = df_examples_products[df_examples_products["large_version"] == 1]
df_task_3["subtitute_label"] = df_task_3["esci_label"].apply(lambda esci_label: 1 if esci_label == "S" else 0 )
del df_task_3["esci_label"]
df_task_3_train = df_task_3[df_task_3["split"] == "train"]
df_task_3_test = df_task_3[df_task_3["split"] == "test"]

关联查询数据源和产品信息

除了人工查询外,还包括广告等查询方式。

df_examples_products_source = pd.merge(
    df_examples_products,
    df_sources,
    how='left',
    left_on=['query_id'],
    right_on=['query_id']
)

执行任务1

以下这段代码的主要目标是训练一个基于 CrossEncoder 的模型(例如,用于信息检索任务),并使用一个由 正样本 和 负样本 构成的验证集来评估模型的性能。

1. 数据加载与样本构建

dev_samples = {}
query2id = {}
for (_, row) in df_dev.iterrows():
    try:
        qid = query2id[row[col_query]]
    except KeyError:
        qid = len(query2id)
        query2id[row[col_query]] = qid
    if qid not in dev_samples:
        dev_samples[qid] = {'query': row[col_query], 'positive': set(), 'negative': set()}
    if row[col_gain] > 0:
        dev_samples[qid]['positive'].add(row[col_product_title])
    else:
        dev_samples[qid]['negative'].add(row[col_product_title])

根据查询(query)和产品标题(product_title)的匹配程度,将它们标记为正样本或负样本。通过 query2id 创建一个查询到 ID 的映射。根据col_gain的值,将样本分为:正样本 (positive):匹配度较高 (col_gain > 0)。负样本 (negative):匹配度较低或无关 (col_gain <= 0)。结果:dev_samples的结构:

{
    qid1: {
        'query': "query_text_1",
        'positive': {"positive_title_1", "positive_title_2"},
        'negative': {"negative_title_1", "negative_title_2"}
    },
    qid2: { ... },
    ...
}

2. 验证器初始化

CERerankingEvaluator 是 sentence-transformers 库中的一个评估器类,用于评估 Cross-Encoder 在 重排序任务 中的性能。CERerankingEvaluator 的主要目的是基于查询和候选项(正样本和负样本)的相关性,为排序任务计算评价指标,如:MRR (Mean Reciprocal Rank):平均倒数排名,用于衡量最相关项在排序中的位置。nDCG (Normalized Discounted Cumulative Gain):归一化折扣累积增益,用于衡量整个排序的质量。它适合用于评估搜索引擎、推荐系统或问答系统中的模型性能。

evaluator = CERerankingEvaluator(dev_samples, name='train-eval')

CERerankingEvaluator 是用于评估交叉编码器模型排序性能的工具。作用:根据验证集中的 positive 和 negative 样本,评估模型在排序任务上的表现。通过标准的评价指标(如 nDCG 或 MRR)衡量模型性能。输入: dev_samples: 验证样本数据,包含查询、正样本和负样本。name: 标识评估过程的名称。

3. 模型初始化

model_name = 'cross-encoder/ms-marco-MiniLM-L-12-v2'
model = CrossEncoder(
    model_name, 
    num_labels=1, 
    max_length=512, 
    default_activation_function=torch.nn.Identity(), 
    device=device
)

加载预训练的 CrossEncoder 模型,使用HuggingFace 的 Transformers 库。 模型参数:

  • model_name: 使用微软的 MiniLM 模型,这是一个轻量级、高性能的预训练模型,适合跨编码任务。
  • num_labels=1: 输出为一个回归分数,用于衡量查询与产品的相关性。
  • max_length=512: 限制输入序列的最大长度。
  • default_activation_function: 使用恒等激活函数 (Identity),输出直接是模型的原始分数。

4. 训练配置与超参数设置

loss_fct=torch.nn.MSELoss()
evaluation_steps = 5000
warmup_steps = 5000
lr = 7e-6

超参数:

  • loss_fct: 使用均方误差 (MSE) 作为损失函数,适合回归任务。
  • evaluation_steps: 每 5000 步评估一次模型。
  • warmup_steps: 学习率预热步数,防止梯度爆炸。
  • lr: 学习率设为 7e-6,适合微调小规模模型。

5. 模型训练

model.fit(
    train_dataloader=train_dataloader,
    loss_fct=loss_fct,
    evaluator=evaluator,
    epochs=num_epochs,
    evaluation_steps=evaluation_steps,
    warmup_steps=warmup_steps,
    output_path=f"{args.model_save_path}_tmp",
    optimizer_params={'lr': lr},
)

输入数据:

  • train_dataloader: 包含训练样本的 DataLoader。
  • loss_fct: 定义的损失函数。

训练设置

  • epochs: 训练的轮数 (这里是 1)。
    • evaluation_steps: 定期评估模型性能。
    • warmup_steps: 使用预热策略提高学习率。
    • optimizer_params: 定义优化器的参数(如学习率)。

输出:临时保存路径 (output_path),训练完成后会保存到最终路径。

6. 模型保存

model.save(args.model_save_path)

将训练后的模型保存到指定路径 (args.model_save_path),便于后续推理或评估。

执行命令行

源码直接指定数据集路径信息,不进行参数化。在工程目录下执行:

cd ranking
python train.py us ./task_1_ranking_model_us --random_state 42 --n_dev_queries 400 --train_batch_size 32

运行结果:

config.json: 100%|█████████████████████████████████████████████████████████████████████████████████████████| 791/791 [00:00<?, ?B/s]
D:\App-Data\conda3\envs\pytorch241-gpu\lib\site-packages\huggingface_hub\file_download.py:139: UserWarning: `huggingface_hub` cache-system uses symlinks by default to efficiently store duplicated files but your machine does not support them in C:\Users\86138\.cache\huggingface\hub\models--cross-encoder--ms-marco-MiniLM-L-12-v2. Caching files will still work but in a degraded version that might require more space on your disk. This warning can be disabled by setting the `HF_HUB_DISABLE_SYMLINKS_WARNING` environment variable. For more details, see https://huggingface.co/docs/huggingface_hub/how-to-cache#limitations.
To support symlinks on Windows, you either need to activate Developer Mode or to run Python as an administrator. In order to activate developer mode, see this article: https://docs.microsoft.com/en-us/windows/apps/get-started/enable-your-device-for-development
  warnings.warn(message)
pytorch_model.bin: 100%|█████████████████████████████████████████████████████████████████████████| 134M/134M [00:14<00:00, 9.39MB/s]
tokenizer_config.json: 100%|███████████████████████████████████████████████████████████████████████████████| 316/316 [00:00<?, ?B/s]
vocab.txt: 100%|█████████████████████████████████████████████████████████████████████████████████| 232k/232k [00:00<00:00, 1.26MB/s]
special_tokens_map.json: 100%|█████████████████████████████████████████████████████████████████████████████| 112/112 [00:00<?, ?B/s]
Epoch:   0%|                                                                                                  | 0/1 [00:00<?, ?it/s]D:\App-Data\conda3\envs\pytorch241-gpu\lib\site-packages\transformers\models\bert\modeling_bert.py:440: UserWarning: 1Torch was not compiled with flash attention. (Triggered internally at C:\cb\pytorch_1000000000000\work\aten\src\ATen\native\transformers\cuda\sdp_utils.cpp:555.)
  attn_output = torch.nn.functional.scaled_dot_product_attention(

Iteration:   4%|███▎                                                                          | 555/12860 [07:19<3:19:52,  1.03it/s]

执行结果

下表显示了通过三个任务的不同公共测试获得的基线结果。

TaskMetricsScores
1nDCG0.83
2Macro F1, Micro F10.23, 0.62
3Macro F1, Micro F10.44, 0.76

Micro F1 是一种用于评估分类模型性能的指标,特别是在类别不平衡的情况下。它是基于精确率(Precision)和召回率(Recall)的调和平均数计算得出的。Micro F1 聚合了所有类别的预测结果,而不是分别计算每个类别的指标。

nDCG(Normalized Discounted Cumulative Gain) 是一种常用的评价指标,用于衡量信息检索或推荐系统的排序效果。它可以反映排序结果的质量,尤其是在考虑相关性权重的情况下。

四、获取案例套件

文件大小:970 MB

需要登录后才允许下载文件包。登录

发表评论