You need to enable JavaScript to run this app. 如何从自由文本商品描述提取商品类型 基于spaCy的Mercari竞赛实践
优惠活动
大模型
产品
解决方案
定价
更多

如何从自由文本商品描述提取商品类型 基于spaCy的Mercari竞赛实践

从商品自由文本提取商品类型的优化方案

你当前基于spaCy句法ROOT提取的逻辑,核心问题是商品标题多为无完整句式的短文本,ROOT常落在配送说明、规格属性、量词等非商品核心词上,也就是你样例中出现的SHIPPING、size、set这类错误结果。以下是可直接落地的优化方向:

1 现有spaCy方案的低成本优化

无需更换技术栈,仅调整提取规则即可大幅提升准确率:

  • 提前维护非商品类黑名单,把shipping、size、set、free、nwt这类通用非商品名词加入过滤列表
  • 调整提取优先级:商品类型基本为名词,ROOT符合要求(不在黑名单+是名词/专有名词)才直接返回,否则优先从ROOT的子节点中找符合要求的核心名词

修改后的参考代码如下:

import spacy
nlp = spacy.load('en_core_web_sm')
# 可根据业务场景补充黑名单
BLACKLIST = {'shipping', 'size', 'set', 'free', 'nwt'}

def get_product_type(text):
    doc = nlp(text.lower())
    # 先找句法ROOT
    root = next((tok for tok in doc if tok.dep_ == 'ROOT'), None)
    if not root:
        return ""
    # ROOT符合要求直接返回
    if root.text not in BLACKLIST and root.pos_ in {'NOUN', 'PROPN'}:
        return root.text.title()
    # ROOT无效则遍历子节点找核心商品名词
    for child in root.children:
        if child.pos_ in {'NOUN', 'PROPN'} and child.text not in BLACKLIST:
            return child.text.title()
    # 兜底逻辑
    return root.text.title()

z = train_data.assign(product_type=z['name'].apply(get_product_type))

用该代码测试你给出的坏例即可得到正确结果:

  • Salvatore Ferragamo Belt FREE SHIPPING → 输出Belt
  • Uggs size 7 → 输出Uggs
  • NWT LulaRoe Girls Mae Dress Size 4 → 输出Dress

2 开箱即用的成熟方案

如果不想自行维护规则,可直接用面向电商场景优化的预训练方案:

方案A:电商领域预训练NLP模型

直接加载spaCy面向电商领域训练的预训练模型,内置商品实体识别能力,无需自行写规则即可提取核心商品类型。

方案B:词表最长匹配方案

Mercari竞赛的Top方案大多采用该逻辑:先整理电商场景通用的商品类型词表(可直接复用各大电商平台的公开分类词表),再用AC自动机等工具对商品标题做最长匹配,命中的最长词即为商品类型,无需运行NLP模型,处理速度远高于句法分析,适合大批量数据处理。

内容的提问来源于stack exchange,提问作者Newbi-Boy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 01:15:06