如何从自由文本商品描述提取商品类型 基于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→ 输出BeltUggs size 7→ 输出UggsNWT LulaRoe Girls Mae Dress Size 4→ 输出Dress
2 开箱即用的成熟方案
如果不想自行维护规则,可直接用面向电商场景优化的预训练方案:
方案A:电商领域预训练NLP模型
直接加载spaCy面向电商领域训练的预训练模型,内置商品实体识别能力,无需自行写规则即可提取核心商品类型。
方案B:词表最长匹配方案
Mercari竞赛的Top方案大多采用该逻辑:先整理电商场景通用的商品类型词表(可直接复用各大电商平台的公开分类词表),再用AC自动机等工具对商品标题做最长匹配,命中的最长词即为商品类型,无需运行NLP模型,处理速度远高于句法分析,适合大批量数据处理。
内容的提问来源于stack exchange,提问作者Newbi-Boy
相关产品推荐
相关产品推荐

