我们如何开始自动创建产品卡

图片

在上一篇文章中,我谈到了我们如何学会根据产品名称自动匹配产品,例如,了解
耳机A4Tech Bloody G501黑色

A4 G501,黑色(红色){带麦克风的耳机,2.2m}

- 这是相同的。这样就可以使与价格和库存状况有关的一切自动化。在本文中,我将告诉您我们如何进一步发展并利用商品的特征和图像使工作自动化。

鉴于按名称自动匹配商品的可靠操作,这是产品开发的逻辑延续。我们将自动化项目分配给了另一家公司,我以一个客户的示例为例讨论该项目,并在他的允许下共享一些客户的数据。接下来是一个简短的介绍,然后我们将讨论使用的算法。

我们从哪里开始


一年前的初始状态如下:编目12万种商品,其中有7万种存货。在启动自动比较和创建商品后(如上一篇文章所述),该目录迅速增长到一百万种商品,其中有600到65万种存货。但是,只有35万个职位可用于零售购买,因为其余职位没有特征。根据类别,要使产品出现在销售中,必须填充一定比例的特征。在某些类别中,必须有一张照片。在销售的35万种商品中,有12万种没有图像。我将解释说,有现货但没有零售的商品可以批发出售,习惯上将带有名称和价格的excel文件发送到那里。但是带卡的b2b门户无疑是一个加号。它们也可以放在聚合器上,那里已经有有关该产品的更多详细信息。

图像和规格以半自动模式填充。在这一年中,其他客户出现了,现在我知道该流程是如何在十几个或两个相对较大的商店中构建的,它或多或少是标准的。不时维护站点的程序员就商店的主题编写站点解析器。此外,管理面板中的内容部门会比较目录中的消费商品和产品,以及来源中的类别和目录中的类别。然后,在每个类别中,为每个属性配置对应,替换,单位转换。某些商品的卡完全手动填写。一小部分货物交给了外部承包商。我们的客户也是如此。

每月约有6%的商品目录已过时,也就是说,要在某个站点上出售50万种产品,您只需每月创建3万张卡片,以保持数量不变。

我们决定尽可能系统地解决此问题,并尽可能自动地创建产品卡。

我们从哪里获得数据


出现的第一个问题是在哪里获取源数据,以及我们可以获得多少数据。我们有两个主要来源:

  • 供应商文件和API
  • 我们在互联网上找到的数据

第二点涉及解析站点。我们已经创建了用于创建解析器的基础结构,该基础结构使您可以在大约半小时内配置站点解析。然后,在此基础结构上进行了大约一百个解析器,目前他们已经收集了1600万种产品的信息,并将3500万个图像和文档(指令,数据表)下载并上传到CDN。作为CDN,我们使用“兔子CDN”。保存图像时,我们考虑它们的感知哈希值,以便以后可以快速找到重复的副本,下面将对此进行详细讨论。理想情况下,如果解析器本身没有提示和设置,便能够在任何站点上收集有关产品的信息,但这是遥不可及的计划。

我们如何用图像填充产品卡


这是最简单,最明显的部分。我们已经有了一种按名称匹配产品的机制,该机制可以快速而准确地工作,在这种情况下,我们对误报率(大约为0.1%)感兴趣。假阴性几乎不会影响结果,因为差异不大,我们最终使用10或11个来源。比较以每秒5至6千种产品的速度进行,并且我们的1500万种产品在不到一个小时的时间内即可匹配任何目录。可以结束这一点,因为经过比较,我们知道了商品的所有图像。但是实际上,它们是在不同的位置以不同的组合复制的,因此从一组相似的图片中选择质量最好的图片,然后将其作为后续手动编辑产品卡的选择,将其余的内容作为选项是正确的。

相似图像的识别分两个阶段进行。在第一阶段,当下载文件时,对于我们的每个图像,我们都将其视为感知哈希。首先,移除纯色背景,修剪田野。然后将DCT哈希应用于结果图像。关于此算法,曾经在Habré上发表过一篇文章

在对每种产品进行匹配之后,我们得到了一组已经计算出哈希值的图像,我们需要将其划分为多个簇,然后从每个簇中选择质量最高的图像。这样一个集合的大小可以从几个单位到几百个单位不等,典型值为10-40。在此大小下,您可以应用二次复杂度算法,主要操作-计算汉明距离-非常快。

我们将图像分为以下几类:

  1. 集合中的第一个图像形成第一个聚类
  2. 将每个下一个图像与每个群集中的第一个图像进行比较
  3. 如果最高相似系数大于阈值,则将图像添加到现有群集中
  4. 否则,我们将根据一个图像创建一个新的群集

之后,我们从每个群集中获取最高质量的图像。在第一近似中,质量由图像的大小和分辨率确定。尺寸和分辨率越大,效果越好,但是尺寸与分辨率之比应在合理范围内。这样的分析在实践中就足够了。

此外,还有一个细微差别。我们自动找到了商品的图片,但是,到目前为止,这个人更重要。如果一个人决定改变图像的顺序,那么他应该有这样的机会。但是与此同时,我们不喜欢手动编辑后``冻结''卡的想法,我们希望在将来改进算法,查找新图像并自动改进卡。

考虑到这一点,这种方法原来是一个可行的选择:所有手动更改的图像(此处的更改意味着最广泛的操作:确认,排除,更改顺序)将始终保留在原位。我们将来可以在自动模式下更改所有其他图像。

我们如何填写带有属性的产品卡


使用属性,事情要比使用图片复杂得多。在不同的来源中,相同的属性可能会被不同地调用,可能以不同的单位表示,可能没有明确的对应关系(例如,HDMI:是和接口:HDMI,USB)。

我们首先定义属性,然后提出以下类型:

  • 好吧不
  • 数量+单位
  • 单选
  • 多项选择
  • 线

此外,我将使用术语“ 尺寸 ”和“ 度量单位 ”,它们具有不同的含义。

然后他们描述了度量单位以及如何转换它们。目前,已经有一百多个,从米到分贝。根据尺寸将它们全部分为几组,并且在组内可以相互联系。例如,马力可以转换为瓦特,流明可以转换为牛顿米-这是不可能的。

接下来,我们尝试将将属性填充为独立步骤的过程分成几个步骤,以便可以分别改进和测试每个步骤。对于目录中的每个产品,我们执行以下操作:

  1. 我们按名称将商品与来源商品进行比较(我们有一个复杂的过程,在上一篇文章中有详细介绍
  2. 形成要填充的属性定义列表
  3. 我们形成所有相关产品的属性列表
  4. 我们将第2节中的每个定义与第3节中的值列表相关联
  5. 将列表转换为单个值

让我们更详细地考虑最后两个要点。假设我们有一个这样的属性定义:
名称:“ Power”
类型:数字(
6、0 单位:瓦特
以及这样的值列表(实际上,它要大得多):
长度(mm):220
长度:0.22 m
功率(kW):1.8
功率:1.8 kW
额定功率:1800 W
功率:2 kW
功率:1800
首先,我们需要了解原则上应该考虑哪些价值。一个有效但非最终的版本如下所示:

  • ( )
  • ( )
  • .

对于每种情况,我们将这些要点实现为独立的算法,因此可以分别进行改进。在带有同义词的段落中,我们手动输入了一些最明显的对,然后推迟到更好的时间。此外,也许我们将尝试使用填充属性中的数据自动选择同义词。另外,我们只能从一个来源获取一个值,因此每种算法都有一个优先级,它决定了算法的执行顺序。

完成此操作后,我们将具有以下一组值:
功率(kW):1.8
功率:1.8 kW
额定功率:1800 W
功率:2 kW
功率:1800
我们知道必须将此集合缩减为一定维数。对于每种类型,我们都有一个独立的算法。对于数量和度量单位,我们执行以下操作:

对于每个值,我们尝试确定度量单位。如果失败,或者它的尺寸与属性的尺寸不一致,请在以后忽略此值。我们将具有以下一组值:
功率(kW):1.8
功率:1.8 kW
额定功率:1800 W
功率:2 kW
我们尝试将每个值转换为数字并转换为所需的度量单位。在这里,我们尝试考虑所有可能的格式:用逗号和点分隔整数和小数部分,用逗号和空格分隔千位,缩写如千位等等。结果是:
1800瓦
1800瓦
1800瓦
2000瓦
该集合必须减少为单个值。对于集合中的单个值,请使用它。如果值不止一个并且它们重合,那就更好了。如果值不止一个且不重合,我们将采用最常见的一个。如果不是这种情况,请不要自动填充属性。

这是一个数值类型的属性的示例,对于其他类型的属性,最后的步骤有所不同,并考虑了它们的功能。

至于手动编辑,我们以与图像完全相同的方式处理属性。任何手动更改或确认的内容都无法自动更改。其他一切都可以。

我们如何测试项目


该项目具有显着的特征:核心是一项完全由优化任务组成的技术。此外,这些任务大多数都没有确切的解决方案,因此,我们提出了自己的标准,其中考虑了速度和准确性。这是真正需要测试的地方。

该项目的体系结构的设计方式是将尽可能复杂的算法分为简单的步骤。对于每个步骤,都有一个优化标准和一组测试。强调准确性,也要速度。至少,我们在照顾每一个变化。每个这样的步骤都类似于体育编程的任务,并且我们有机会在每次更改后比较结果。

结果


经过几个月的生产工作,有可能更准确地评估结果。到现在还不到一周。在这段时间内,我们能够将大约11万种由于缺少属性或图像而未售出的产品添加到该站点。
未来的目标是完全放弃手工工作来填写目录。在第一阶段,一个好的结果是将其体积减少70%。我认为,通过几个月的结果,我们将实现这一目标。

All Articles