简单的评分系统
Contents
供应商字段
- 案例价格区间 (start, end),需求价格money
- 数学公式:调和平均值可以提高距离近的价格的权重(联想并联电阻的公式),可能会接近0;加上算术平均值作为缓冲距离,可以使距离不产生
ZeroDivisionError
。
d1 = money - start d2 = money- end d_{harmony}= 2 \left| d1*d2 \right| /(|d1|+|d2|) d_{arithmetic} = | (start+end)/2 - money| d_{last} = (d_{harmony}+ d_{arithemic})/ 2
- 代码
# s1表示距离相关评分 s1 = money/d_last # flag_range = (-1, 0, 1) 分别表示 money与(money,start)的区间关系为greater,in, less flag_range= 0 # d1*d2>0表示money不在区间中,d1和d2的符号相同,取d1符号的负数,就表示区间flag_range if (d1*d2)>0: flag_range = - np.sign(d1) w = 1- 2* flag_range # s2表示区间相关评分 s2 = w # a1和a2可以根据需求改变 s_ultimate = a1*s1 + a2*s2 # 如需高性价比,则 (a1, a2) = (2,1),如需高质量 (a1, a2) = (1, 2) # 求最高分, ranges是一系列价格区间 [(start, end),...] 的列表,求出money所在区间的start_1, end_1 start_1, end_1 = get_interval(money, ranges) best_score= 3+ 4+4*start_1/(end_1-start_1)
- 数学公式:调和平均值可以提高距离近的价格的权重(联想并联电阻的公式),可能会接近0;加上算术平均值作为缓冲距离,可以使距离不产生
离散字段打分
- 只能判断存在性,或者用矢量相似度
案例/字符串相似性判断
- 最简单的方法,使用分词器,然后计算Jaccard相似度
req = set(analysis.extract_tags(text_req))
supp = set(analysis.extract_tags(text_supp))
# 简单的长度计算
r_jaccard = len(req.intersection(supp))/len(req.union(supp))
# 复杂一点的cosine相似度
- 进阶方法,需要使用分类或聚类算法