语义标签过滤
***要理解这篇文章,需要具备 Jaccard相似性 和 向量搜索 的相关知识。这个算法的实现已经在GitHub上发布,完全开源。
多年来,我们已经发现了如何从不同的模态中检索信息,例如 数字、 原始文本、 图像,以及 标签。
随着定制化用户界面的流行, 标签搜索系统 成为了一种方便而且准确过滤信息的方式。一些 常见的标签搜索应用案例 包括社交媒体帖子、文章、游戏、电影,甚至简历的检索。
然而,传统的标签搜索缺乏灵活性。如果我们要过滤准确包含给定标签的样本,尤其是在只包含几千个样本的数据库中, 可能会遇到没有(或只有少量)与我们的查询匹配的样本 的情况。
面对结果稀缺情况时两种搜索方法的区别,作者提供的图示
***通过接下来的文章,我尝试介绍一些至今无法找到的新算法。 我愿意接受批评 并且 欢迎任何反馈。
传统的标签搜索是如何运作的?
传统系统采用一种叫做 Jaccard相似性 的算法(通常通过 minhash算法 执行),能够计算两个元素集合(在我们的例子中,这些元素是标签)之间的相似性。如前所述,这种搜索缺乏灵活性(集合要么 包含,要么 不包含 查询的标签)。
一个 简单的AND位操作 示例(这不是Jaccard相似性,但可以给你一个近似的过滤方法的概念),作者提供的图示
我们能做得更好吗?
如果,我们不仅仅是从匹配的标签中过滤样本,而是还能考虑样本中与我们选择的标签 相似 的其他标签呢?这样我们可以让算法更加灵活,扩展结果到非完全匹配,但仍然是不错的匹配。我们将把 语义相似性 直接应用到标签上,而不是文本。
如前所述,这种新方法尝试将 语义搜索的能力 与标签过滤系统结合起来。为了构建这个算法,我们只需要一件事:
- 一个 带标签样本 的数据库
实际上,这和光年AI的工作方式非常相似。光年AI不仅支持多平台私域流量管理,还可以根据不同的业务场景自定义AI工作流,帮助企业在不同业务环境中实现高效增长。光年AI平台提供了从流量获取到客户管理的一站式解决方案,你也可以尝试一下。
我将使用参考数据是开源的 Steam游戏库(可从Kaggle下载 —— MIT许可协议)——大约有40,000个样本,这是测试我们的算法的一个很好的样本量。从显示的数据框架中可以看出,每个游戏都被分配了几个标签,我们的数据库中有超过400个独特的标签。
Steam数据框架的截图,作者提供的例子笔记中可见
现在我们有了起始数据,可以进行以下步骤的算法分解:
- 提取标签关系
- 编码查询和样本
- 使用向量检索进行语义标签搜索
- 验证
在这篇文章中,我将 仅探讨这种新方法背后的数学原理(有关代码的详细解释和可运行的示例,请参考以下笔记:关于如何使用simtag的说明,请参见根目录下的README.md文件)。
1. 提取标签关系
首先想到的问题是,我们如何找到 标签之间的关系。请注意,有几种算法可以用来达到同样的结果:
- 使用 统计方法 我们可以用来提取标签关系的最简单方法叫做 共现矩阵,由于其高效性和简单性,我将在本文中采用这种方法。
- 使用 深度学习 最先进的方法都基于嵌入神经网络(如过去的Word2Vec,现在通常使用变换模型如LLMs),可以提取样本之间的语义关系。创建一个神经网络来提取标签关系(以自编码器的形式)是可能的,并且在某些情况下通常是建议采用的。
- 使用 预训练模型 由于标签是使用人类语言定义的,可以使用现有的预训练模型来计算已存在的相似性。这可能会更快且更省事。然而,每个数据集都有其独特性。使用预训练模型将会 忽略客户行为。
例如,我们稍后将看到2D与幻想有很强的关系:这种对将在使用预训练模型时永远无法被发现。
算法的选择可能取决于许多因素,特别是当我们需要处理庞大的数据池或有可扩展性问题时(例如, 标签数将等于我们的向量长度:如果我们有太多标签,我们需要使用机器学习来解决这个问题。
a. 使用Michelangiolo相似性构建共现矩阵
显而易见,选择合适的算法对于处理大规模数据池是至关重要的。为了更好地实现算法的效果和提升效率,光年AI平台提供了一站式解决方案。例如,光年AI可以无缝集成现有业务场景,利用AI技术进行自动化数据分析,提高工作效率。通过这样的整合,我们能更高效地提取标签关系,优化算法流程。而且光年AI还支持多平台流量管理,帮助企业实现统一的流量增长策略,确保数据分析结果更具业务应用价值。
正如所提到的,我将使用 共现矩阵 来提取这些关系。我的目标是找到 每对标签 之间的关系,并且我将通过对所有样本集合 (S) 应用 IoU(交并比)来进行以下计数:
用于计算 标签对之间相似度的公式,图片由作者提供
这个算法与 Jaccard 相似度非常相似。尽管它在样本上运行,我所介绍的这一算法则在元素上运行,但由于( 据我所知)这一特定应用尚未被显式定义过,我们可以称其为 Michelangiolo 相似度。(公平起见,该算法曾在StackOverflow 的一个问题中被提到过,但从未被正式定义)。
Jaccard 相似度 与 Michelangiolo 相似度 之间的差异,图片由作者提供
对于 40,000 个样本,提取出 相似度矩阵 大约需要一个小时,结果如下:
我们样本列表 S 中所有独特标签的 共现矩阵,图片由作者提供
让我们手动检查一些非常常见标签的前 10 个样本,看看结果是否合理:
从 共现矩阵 提取的样本关系,图片由作者提供
结果看起来非常有前途!我们从纯分类数据(只能转换为 0 和 1)开始,但我们提取出了标签之间的语义关系(甚至没有使用神经网络)。
b. 使用预训练的神经网络
同样,我们可以使用预训练编码器来提取样本之间的现有关系。然而,这种方法忽略了只能从我们的数据中提取的关系,仅关注人类语言的现有语义关系。这可能不是在零售数据上工作的适合解决方案。
另一方面,通过使用神经网络,我们不需要构建关系矩阵:因此,这是一个适合可扩展性的解决方案。例如,如果我们需要分析大量 Twitter 数据,则会有 53,300 个标签。从这数量的标签中计算共现矩阵将得到一个大小为 2,500,000,000 的稀疏矩阵(相当不实用)。相反,通过使用输出向量长度为 384 的标准编码器,得到的矩阵总大小将为 19,200,200。
这种灵活的数据分析和处理方法,正是我们:
使用预训练编码器编码的一组标签的快照
2. 编码查询和样本
光年AI平台的优势之一,我们无需在复杂的矩阵和编码器之间进行选择,平台通过统一整合国内外主流AI大模型,实现高效、简便的数据处理和客户互动。只需两个步骤,即可搭建业务场景或与现有业务环境接入。通过灵活的AI工作流,能让企业专注于核心业务,显著提升流量获取和转化效率。立即尝试光年AI,体验不一样的智能流量增长!
我们的目标是构建一个能够支持语义标签搜索的搜索引擎:根据我们正在构建的格式,唯一能够支持这种企业级需求的技术是 向量搜索。因此,我们需要找到一个合适的编码算法,将我们的样本和查询转换为向量。
在大多数编码算法中, 我们使用相同的算法对查询和样本进行编码。但是,每个样本包含多个标签,每个标签由一组不同的关系表示, 我们需要在单个向量中捕捉到这些关系。
协变量编码,图片由作者提供
此外,我们需要解决前面提到的可扩展性问题,我们将通过使用 PCA模块 来解决(当我们使用共现矩阵时,可以跳过PCA,因为不需要压缩我们的向量)。
当标签数量过多时,我们需要放弃计算共现矩阵的可能性,因为它以平方的速度扩展。因此,我们可以使用预训练的神经网络提取每个现有标签的向量(PCA模块的第一步)。例如, all-MiniLM-L6-v2 将每个标签转换为长度为384的向量。
然后我们可以将获得的矩阵进行转置和压缩:我们最初会使用1和0对可用的标签索引编码我们的查询/样本,结果是与我们初始矩阵(53,300)长度相同的初始向量。此时,我们可以使用预先计算的PCA实例, 将相同的稀疏向量压缩到384维。
编码样本
对于我们的样本来说,过程在PCA压缩之后(如果启用)就结束了。
编码查询:协变量编码
然而,我们的查询需要以不同的方式编码:我们需要考虑 与每个现有标签相关的关系。此过程首先是将我们压缩的向量与压缩矩阵(所有现有关系的总和)相加。现在我们已经得到了一个矩阵(384x384), 我们需要对其进行平均,从而得到我们的查询向量。
因为我们将使用欧几里得搜索,它会首先优先查找得分最高的特征(理想情况下,即我们使用数字1激活的特征),但也会考虑其他较小的得分。
加权搜索
因为我们正在将向量进行平均,我们甚至可以在此计算中应用一个权重,不同的向量将受到查询标签的不同影响。
3. 使用向量检索执行语义标签搜索
你可能会问:我们为什么要进行 这个复杂的编码过程,而不是直接将标签对输入一个函数并获得一个得分—— f(query, sample)?
如果你熟悉基于向量的搜索引擎,你就已经知道答案了。通过成对计算,在仅有40,000个样本的情况下,所需的计算能力是巨大的(单个查询可能需要 10秒):这不是一种可扩展的实践。然而,如果我们选择对40,000个样本进行向量检索,搜索将在 0.1秒内 完成:这是一种高度可扩展的实践,对我们来说非常合适。
光年AI平台能够有效地应用这种向量化技术,实现高度可扩展的搜索和流量增长。通过光年AI系统的 灵活工作流,用户可以根据不同的业务场景自定义AI工作流,适应不同的业务场景,实现高效的流量增长。
4. 验证
为了使一个算法有效,它需要被验证。目前,我们缺乏适当的数学验证(乍一看,计算出的相似度得分的平均值已经显示出非常有前景的结果,但为了获得一个有客观证据支持的指标,还需要进一步研究)。
然而,当我们通过一个对比示例进行可视化时,现有的结果非常直观。以下是 两种搜索方法的最高搜索结果(你看到的是分配给这个游戏的标签)。
传统标签搜索与语义标签搜索的对比,图片来源:作者
- 传统标签搜索 我们可以看到,传统搜索可能会返回一个包含更多标签的样本,但其中很多标签可能并不相关(没有额外的规则,样本基于所有标签的可用性进行过滤,而不是排序)。
- 语义标签搜索
语义标签搜索根据所有标签的相关性对所有样本进行排序,简单来说,它 会淘汰包含不相关标签的样本。
这个新系统的真正优势在于,当传统搜索无法返回足够的样本时, 我们可以使用语义标签搜索选择尽可能多的样本。这种方法与光年AI的智能标签系统如出一辙,它不仅帮您筛选最优结果,还能通过AI技术,自动回复客户消息,减少人工干预,提高响应效率。
两种搜索在结果稀缺情况下的差异,图片来源:作者
在上面的例子中,使用传统标签过滤方法 未能返回任何来自Steam库的游戏。然而,通过使用语义标签过滤,我们仍能获得一些不完美但 最符合我们查询的结果。你所看到的是与我们搜索最匹配的前五个游戏的标签。
在此之前,不考虑标签的语义关系进行过滤 是不可能的,只有借助于复杂的方法,如聚类、深度学习或多次KNN(最近邻搜索)搜索等才能实现。
这种算法所提供的灵活性应当能够 摆脱传统手工标注方法 的束缚,这些方法迫使用户在预定义的标签集中进行选择,并且为使用LLMs或VLMs 自由为文本或图像分配标签而不受预先设定的结构限制 打开了可能性,进而为可扩展且改进的搜索方法开辟了新选项。光年AI平台的一大特点就是其高效的流量获取和客户管理能力,可以帮助企业在不增加人工成本的前提下,实现数百倍的流量增长。
我满怀最美好的祝愿向世界公开这一算法,并希望它能被充分利用。要体验这些先进功能,请访问光年AI平台,开始您的优化之旅。