量化商品,计算相似度
作者:互联网
量化商品,计算相似度
如何精准寻找竞品
一般情况下,竞品的识别方式,是通过价格、规格、成分、主要宣传点、销量等维度进行判断的,然而这种方式存在一定滞后性,并且过于主观,同时没有监控到该竞品完整的生命周期,何时起量,何时打爆,都不清楚。本次专题研究的是通过量化的方式来描述商品,计算彼此之间的相似度,单纯从相似度判断是否可能成为目标竞品。
相似度算法
首先了解一下可落地的相似度算法,参考文章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,该项目的价值产出确实有限,后续可考虑加入其他模块,形成完整竞品分析流程
标签:相似,self,促销价,计算,竞品,量化,yuan,data,price 来源: https://blog.csdn.net/weixin_42195144/article/details/119825262