我希望从自由文本产品描述中提取产品类型,以便进行分组。
背景是从一个古老的Kaggel竞争中学习(mercari价格建议挑战(。
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 | root_product_name
Air Jordan Retro 6运动蓝 | [(Air,复合色(,(Jordan,复合色 |
Salvatore Ferragamo皮带免费送货 | [(Salvatore,amod(,(Ferragamo,compound(,(Belt,npadvmod(,[FREE,amod],(SHIPPING,ROOT(] |
树莓切罗基磨砂上衣和裤子 | [(树莓,复合物(,(切罗基,复合物 |
Uggs size 7 | [(Uggs,compound(,(size,ROOT(,(7,nummod(] |
精油扩散器 | [(Essential,amod(,(Oil,compound(,(扩散器,ROOT(] |
Skylanders | [(Skylanders,ROOT(] |
Sono人类接发20英寸 | [(Sono,nmod(,(human,amod(,[头发,nsubj(,(接发,ROOT(,(20,nummod(,(英寸,npadvmod(] |
NWT LulaRoe Girls Mae连衣裙4码 | [(NWT,复合(,(LulaRoe,复合( |
ES胸罩和内裤套装4(36B( | [(ES,compound(,(Bra,nmod(,(and,cc(,(Panty,conj(,(set,ROOT(,(of,prep( |
Free Shipping Skeleton Kids Top |
确定产品类型是一个分类,而不是提取任务。如果产品标题是";任天堂Switch红蓝新盒装";类别可以是";电子游戏";。
在您的数据集中;类别名称"菲尔德,那是你的标签。您应该考虑在spaCy中使用textcat模型,参见示例项目。