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)
    

离散字段打分

  • 只能判断存在性,或者用矢量相似度

案例/字符串相似性判断

  • 最简单的方法,使用分词器,然后计算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相似度

  • 进阶方法,需要使用分类或聚类算法