摘要:
合集: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.parquet
和 shopping_queries_dataset_examples.parquet
。它们分别包含与产品和查询样本相关的信息,具体数据结构如下:
产品信息
文件:shopping_queries_dataset_products.parquet
shopping_queries_dataset_products.parquet
文件主要存储与产品相关的信息。其典型数据字段如下:
字段名 | 数据类型 | 描述 |
---|---|---|
product_id | string | 产品的唯一标识符 (Amazon 内部 ID)。 |
title | string | 产品标题,用于描述产品的核心信息,例如品牌、类型、功能等。 |
description | string | 产品的详细描述,包含功能、用途等附加信息 (可能为空)。 |
brand | string | 产品品牌名称,例如 “Sony”、”Samsung”。 |
category | string | 产品所属的分类路径,通常是层级式结构,例如 Electronics > Computers > Laptops 。 |
price | float | 产品价格 (某些情况下可能为空)。 |
image_url | string | 产品图片的 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_id | string | 搜索查询的唯一标识符,用于与查询数据关联。 |
query | string | 用户搜索的查询文本。 |
product_id | string | 产品的唯一标识符,用于与 shopping_queries_dataset_products 数据集关联。 |
esci_label | string | 产品与查询的关系标注,值为 Exact 、Substitute 、Complement 或 Irrelevant 。 |
query_locale | string | 查询的语言或区域信息,例如 en_US 或 de_DE 。 |
示例数据
{
"query_id": "Q12345",
"query": "wireless headphones",
"product_id": "B08XY8GQXJ",
"esci_label": "Exact",
"query_locale": "en_US"
}
查询样本的来源
存储数据的来源信息,表明每条查询样本的来源或类别,用于分析不同数据来源的分布情况。
数据字段定义:
字段名 | 数据类型 | 描述 |
---|---|---|
query_id | string | 查询的唯一标识符,与 shopping_queries_dataset_examples.parquet 的 query_id 对应。 |
source | string | 查询样本的来源,例如 organic (自然搜索) 或 sponsored (广告)。 |
数据样例:
query_id | source |
---|---|
0 | other |
1 | negations |
2 | negations |
3 | negations |
4 | behavioral |
5 | negations |
6 | negations |
7 | negations |
8 | other |
三者之间的关系
shopping_queries_dataset_products.parquet
中的 product_id
与 shopping_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]
执行结果
下表显示了通过三个任务的不同公共测试获得的基线结果。
Task | Metrics | Scores |
---|---|---|
1 | nDCG | 0.83 |
2 | Macro F1, Micro F1 | 0.23, 0.62 |
3 | Macro F1, Micro F1 | 0.44, 0.76 |
Micro F1 是一种用于评估分类模型性能的指标,特别是在类别不平衡的情况下。它是基于精确率(Precision)和召回率(Recall)的调和平均数计算得出的。Micro F1 聚合了所有类别的预测结果,而不是分别计算每个类别的指标。
nDCG(Normalized Discounted Cumulative Gain) 是一种常用的评价指标,用于衡量信息检索或推荐系统的排序效果。它可以反映排序结果的质量,尤其是在考虑相关性权重的情况下。
四、获取案例套件
文件大小:970 MB
需要登录后才允许下载文件包。登录