首页 > 解决方案 > 从自由文本产品描述中提取产品类型

问题描述

我正在寻找从自由文本产品描述中提取产品类型以进行分组。

上下文是从旧的 Kaggel 竞赛(mercari-price-suggestion-challenge)中学习的练习。

Google / Stack Overflow 提供多个方向,但没有特定的开箱即用代码(我可以找到)。

我能想到的最好的方法(我是 NLP 新手)是通过spacy包,解析产品名称描述,并将 ROOT 词作为产品类型本身,请参见下面的代码

该解决方案有时似乎提供了公平的结果,请参阅下面的结果示例,但我认为对于现成的代码应该有更好的做法。

import spacy
nlp = spacy.load('en_core_web_sm')

z = train_data
z = z.assign(product_enitity=z['name'].apply(nlp))
z = z.assign(product_enitity_parse=[([(X, X.dep_) for X in Y]) for Y in z['product_enitity']])

def get_root_word(sent):
    return [tok[0] for tok in sent if (tok[1] == "ROOT") ]

z = z.assign(root_product_name=[get_root_word(sent) for sent in z['product_enitity_parse']])
姓名 product_enitity_parse 根产品名称
Air Jordan 复古 6 运动蓝 [(空气,复合),(乔丹,复合),(复古,ROOT),(6,nummod),(运动,复合),(蓝色,appos)] [复古的]
Salvatore Ferragamo 腰带免运费 [(Salvatore, amod), (Ferragamo, Compound), (Belt, npadvmod), (FREE, amod), (SHIPPING, ROOT)] [航运]
Raspberry Cherokee Scrubs 上衣和裤子。 [(覆盆子,复合),(切诺基,复合),(Scrubs,nsubj),(top,ROOT),(and,cc),(pants,c... [最佳]
7 号 Uggs [(Uggs, 复合), (size, ROOT), (7, nummod)] [尺寸]
精油扩散器 [(Essential, amod), (Oil, Compound), (Diffuser, ROOT)] [扩散器]
斯凯兰德斯 [(天空之城,ROOT)] [天行者]
Sono 人发接发 20 英寸 [(Sono, nmod), (human, amod), (hair, nsubj), (extensions, ROOT), (20, nummod), (inches, npadvmod)] [扩展]
全新带标签 LulaRoe 女童连衣裙 4 码 [(NWT,复合),(LulaRoe,复合),(Girls,复合),(Mae,复合),(连衣裙,复合),(S ... [尺寸]
ES 文胸和内裤 4 件套 (36B) [(ES, 复合), (Bra, nmod), (and, cc), (Panty, conj), (set, ROOT), (of, prep), (4, pobj), ((, ... [放]
免费送货骷髅儿童上衣 [(免费,amod),(运输,复合),(骨架,复合),(儿童,复合),(顶部,ROOT)] [最佳]

标签: pythonnlpspacy

解决方案


确定产品类型是一种分类,而不是提取任务。如果产品标题是“Nintendo Switch Red Blue New in Box”,则类别可能是“视频游戏”。

在您的数据集中,看起来有一个“category_name”字段,这是您的标签。您应该查看在 spaCy 中使用textcat模型,请参阅示例项目


推荐阅读