量化商品,计算相似度

如何精准寻找竞品

一般情况下,竞品的识别方式,是通过价格、规格、成分、主要宣传点、销量等维度进行判断的,然而这种方式存在一定滞后性,并且过于主观,同时没有监控到该竞品完整的生命周期,何时起量,何时打爆,都不清楚。本次专题研究的是通过量化的方式来描述商品,计算彼此之间的相似度,单纯从相似度判断是否可能成为目标竞品。

相似度算法

在这里插入图片描述

首先了解一下可落地的相似度算法,参考文章https://blog.csdn.net/Gamer_gyt/article/details/78037780
本次项目,主要是用到余弦相似度、调整余弦相似度,用来计算商品成分、功效的相似度

数据源及具体实现

流程是从生意参谋获取商品ID->进入天猫详情页->获取详情页信息(标题、主图、详情图、价格、规格)->计算商品相似度
在这里插入图片描述

第一步:进入生意参谋-市场排行-商品排行(老品建议流量排行、新品建议交易排行)获取TOP300商品ID
第二步:借助淘宝详情页接口,爬取详情页信息(主图,详情图,标题,促销价,原价,规格)
第三步:借助腾讯云图文识别接口,识别文字(资费如下)
在这里插入图片描述
第四步:构建成分、功效维度表
在这里插入图片描述

第五步:构建相似度计算模型(原理是提取目标产品与竞品详情页+主图+标题文字中的关键词,进行计数,有序排列,形成向量,计算向量夹角的余弦值)

class Similar(object):
	def __init__(self,yuan,chengfen,gongxiao,path):
		self.yuan=self.read_data(yuan)
		self.yuan=self.yuan[self.yuan['规格数字']>0]
		print(self.yuan.head())
		self.chengfen=self.read_data(chengfen)
		self.gongxiao=self.read_data(gongxiao)
		#self.price_slice(self.yuan)

		#创造向量,功效模型&成分模型
		self.yuan['新功效'] = self.yuan['产品名'] + self.yuan['字符串']
		self.yuan['新成分'] = self.yuan['产品名'] + self.yuan['字符串']
		self.yuan['功效_向量'] = self.yuan['新功效'].apply(lambda x: self.deal_data_gong(x))
		self.yuan['成分_向量'] = self.yuan['新成分'].apply(lambda x: self.deal_data_cheng(x))


		#价格模型采用 调整型余弦相似度
		avg_price=self.yuan['价格'].sum()/self.yuan['价格'].count()
		avg_price_cu = self.yuan['促销价'].sum() / self.yuan['促销价'].count()
		avg_specs = self.yuan['规格数字'].sum() / self.yuan['规格数字'].count()
		print([avg_price,avg_price_cu,avg_specs])
		self.yuan['价格_向量'] = self.yuan.apply(lambda x: [x['价格']-avg_price, x['促销价']-avg_price_cu, x['规格数字']-avg_specs], axis=1)



		print(self.yuan['价格_向量'].head())
		print(self.yuan['功效_向量'].head())
		self.yuan['功效_评分'] = self.yuan['功效_向量'].apply(lambda x: self.cosine_similarity_gai_V1(self.yuan['功效_向量'][0],x))
		self.yuan['成分_评分'] = self.yuan['成分_向量'].apply(lambda x: self.cosine_similarity_gai_V1(self.yuan['成分_向量'][0], x))

		#价格模型-余弦相似度
		#self.yuan['价格_评分'] = self.yuan['价格_向量'].apply(lambda x: self.cosine_similarity_gai_V1(self.yuan['价格_向量'][0], x))

		self.yuan['单位价格']=self.yuan.apply(lambda x: x['促销价']/x['规格数字'], axis=1)
		# 价格模型-减分制
		self.yuan['价格_评分'] = 10-self.yuan['单位价格'].apply(lambda x: self.jiage_rate(self.yuan['单位价格'][0], x))-self.yuan['促销价'].apply(lambda x: self.jiage_rate(self.yuan['促销价'][0], x))

		self.yuan['综合评分']=self.yuan['功效_评分']*0.5+self.yuan['成分_评分']*0.2+self.yuan['价格_评分']*0.3
		self.yuan.to_csv(path,encoding='utf-8-sig',index=None)



	# 获取数据源
	def read_data(self,yuan):

		if '.CSV' in yuan.upper():
			try:
				data = pd.read_csv(yuan,encoding='GB18030')
			except:
				data = pd.read_csv(yuan, encoding='utf-8')
		else:
			data=pd.read_excel(yuan)
		return data

	# jaccard公式计算相似度
	def get_jaccard_sim(self,str1, str2):

		a = set(str1)
		b = set(str2)
		c = a.intersection(b)
		print(round((float(len(c)) / (len(a) + len(b) - len(c)))*10,2))
		return round((float(len(c)) / (len(a) + len(b) - len(c)))*10,2)

	# cosine计算相似度
	def cosine_similarity_gai_V1(self,vector1, vector2):
		# 余弦相似度计算
		dot_product = 0.0
		normA = 0.0
		normB = 0.0
		for a, b in zip(vector1, vector2):
			dot_product += a * b
			normA += a ** 2
			normB += b ** 2

		if normA == 0.0 or normB == 0.0:
			return 0
		else:
			return round(dot_product / ((normA ** 0.5) * (normB ** 0.5)) * 10, 2)

	def jiage_rate(self,vector1, vector2):
		return abs(vector2/vector1-1)*10



	#切割价格段,获取本品价格区间的竞品
	def price_slice(self,data):
		'''
			price_slice功能可选可不选
		'''
		item={}
		price_duan=[0.00,0.10,0.34,0.66,0.88,0.97,1.00]
		my_price=data['促销价'][0]

		#默认第一位的产品是目标产品,其他为竞品
		print('本品价格:%s'%my_price)

		#进行价格升序
		data=data.sort_values(by='促销价',ascending=True).reset_index()
		max_count=len(data['促销价'])

		#筛选位于价格段内的竞品
		for i in range(0,len(price_duan)-1):
			if data['促销价'][int(round(price_duan[i]*max_count,0))]<my_price and data['促销价'][int(round(price_duan[i+1]*max_count,0))]>my_price:
				self.ta=data[int(round(price_duan[i]*max_count,0)):int(round(price_duan[i+1]*max_count,0))]



	#处理源数据,匹配成分、功效表
	def deal_data_gong(self,text):
		vector_=[]  #存储所有向量
		for index, row in self.gongxiao.iterrows():
			wei_list=str(row['二级维度']).split('、')
			zan=0
			for wei in wei_list:
				zan=zan+str(text).count(wei)
			vector_.append(zan)
		return vector_

	# 处理源数据,匹配成分、功效表
	def deal_data_cheng(self, text):
		vector_ = []  # 存储所有向量
		for index, row in self.chengfen.iterrows():
			wei_list = str(row['二级维度']).split('、')
			zan = 0
			for wei in wei_list:
				zan = zan + str(text).count(wei)
			vector_.append(zan)
		return vector_

第六步:结果输出,二次验证,筛选目标竞品
在这里插入图片描述
第七步:追踪竞品,建立预警机制,实时警报

思考与应用

这里,如果只是输出竞品list,该项目的价值产出确实有限,后续可考虑加入其他模块,形成完整竞品分析流程

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值