保护私人版权,尊重他人版权。转载请注明出处并附带页面链接
从函数模型推导到搜索排名
——从搜索排名需求中,公式完善过程,理解程序开发中的数学建模。
这里以内容质量评分与搜索排名为例,从最基础的线性函数出发,按照提出问题;解决问题的基本方式,逐步完善评分函数。从而为大家关于数学在我们项目研发实践中的应用提供借鉴,也期待大家能由此提高大家对数学的敏感度,将数学思维应用于项目研发的各个阶段,从而提高产品研发质量和用户体验。
文中基本方法灵感来自《推荐系统原理与实践》一书。有兴趣的同学可以自行了解。为了避免泄密嫌疑,这里暂不透露是什么内容的质量评分和搜索排名。大家就当作是某种垂搜应用就好了。
需求描述
现在存在两个来源的内容:1. 由M提供的内容,数量在千万级;2. 由L提供的内容,数量在万级。现在,由于直观感受,L的总体数据质量较高,因此,希望令L来源的数据在搜索结果中靠前。
解决思路
大致解决思路有两个办法,各有优缺点:
- 关于搜索结果,直接将搜索结果中,L数据置顶。
- 引入质量评分,基于质量评分与搜索匹配度评分的函数,调整各个数据记录的优先级。
进一步分析需求描述,可以关注到,需求本质是希望将质量高的数据提前,而非L的数据提前;
此外,考虑到目前L数据和M数据质量都是参差不齐的,且难以完全处理好所有数据内容问题,引入质量评分,将确定质量高的数据在任意搜索结果中提前是未来必然要实现的;
同时,采用第一种方法会降低代码灵活性,
而采用第二种方法,在未来需要调整质量评分方式或排名方式时,仅需重新调整质量评分以及搜索排名关于质量评分与匹配度评分的函数即可,与业务代码耦合度低,有利于未来迭代。
综上所述,最终决定选择第二种办法实现。
质量评分与搜索排名
基本思路如下所述。
- 添加质量评分字段,用于存储分值。
- 设计总评分关于质量评分和匹配度评分的函数,最终搜索结果按照总评分排序。
思路很简单,实现也很简单,关键点仅在于如何设计总评分关于质量评分和匹配度评分的函数。这个过程与数学建模的思维方式、推荐系统的设计思路以及机器学习的建模中部分过程十分相似,因此,这里以该需求为例,从最基础的线性函数出发,按照提出问题;分解问题;解决问题的基本方式,逐步完善评分函数。从而为大家关于数学在我们项目研发实践中的应用提供借鉴,也期待大家能由此提高大家对数学的敏感度,将数学思维应用于项目研发的各个阶段,从而提高产品研发质量和用户体验。
数学模型推导与搜索排名实现
假设,最终用于对搜索结果排序的字段是总评分 $\boldsymbol{S}$(Score),我们主动对数据质量作出的评分是质量评分 $\boldsymbol{QS}$(Quality Score),用户按照筛选项或不同关键字模糊搜索时,由搜索引擎基于某种算法计算的筛选结果关于筛选项产生的评分是匹配度评分 $\boldsymbol{MS}$(Match Score)。这时,一种比较简单的提高某个数据搜索排名的方法是关于$MS$和$QS$求和,如 公式 1 所示。然后,我们逐步推荐问题,再解决,以此完善这一模型。
$$\begin{align}
S = F(QS, MS) = QS + MS\ (QS \in N, MS \in R^+, S \in R^+)
\end{align}$$
Q: 实际应用中$\boldsymbol{QS}$ 与 $\boldsymbol{MS}$ 对于总评分的影响权值不一定是相等的
一种很简单的思路,引入效用函数。如 公式 2 所示。其中的权值$w_1$、$w_2$可以是经验估计值,也可以是基于某种统计方法或其它算法求得的值。
$$\begin{align}
S = F(QS, MS) = w_1QS + w_2MS\ \\
(QS \in N,\ MS \in R^+, \ S \in R^+,\ w_1 \in R^+,\ w_2 \in R^+,\ w_1 + w_2 = 1)
\end{align}$$
Q: 可能某一数据与搜索项匹配度不高($MS$较低),但由于QS较高,导致该数据在搜索结果中过度靠前
一种思路是优化 $\boldsymbol{QS}$ 模型;限制 $QS$ 的取值范围。另一种思路是修改函数,令 $MS$ 越高的函数,$QS$ 对 $S$ 的影响越大;$MS$ 越低,则 $QS$ 对 $S$ 的影响越小。在实践中,我们两种思路结合思考显然是更合理的,但这里暂且仅基于第二种思路作描述。
一种简单的方法是简单将$MS$ 与 $QS$ 求积。
$$\begin{align}
F(QS, MS) = w_1QS \bullet w_2MS
\end{align}$$
进行到这一步,其实就差不多了,搜索排名也仅进行到此为止。但在实际应用中,尤其是对于精度敏感、计算数值大的应用,还会存在其他问题,这时需要进一步完善模型,即后文所述部分。后文提及的两个问题,只是希望能为大家在遇到相似问题时,提供更多的解决思路。
Q: MS是实数,存在小数部分,而计算机中的求积运算通常可能存在浮点数精度丢失和误差累积问题,如何减少?
首先,我们认识到,浮点数精度丢失问题往往发生在乘除运算中,由运算中小数有效位丢失导致,而误差累积在积分或累加过程中产生的。
对于这一问题的解决方式,可以参考目前中文分词中常用的概率计算方法——将区间 $(0, 1)$ 的乘除运算,转化为其对数的加减运算。整数运算是不存在类似浮点数的精度丢失问题,如果函数边界合适,也能避免溢出问题。这时,函数如公式 4 所示(这里我省去了底数,底数我们可以根据期望的函数图像调整)。
$$\begin{align}
logF(QS, MS) = log(w_1QS \bullet w_2MS) = log(w_1QS) + log(w_2MS)
\end{align}$$
此时,为了便于计算,可以进一步转化$w_1$、$w_2$。
$$\begin{align}
\frac{1}{w_1} = w^\backprime_1, \frac{1}{w_2} = w^\backprime_2\ \ (w_1 \in R^+,\ w_2 \in R^+,\ w_1 + w_2 = 1, w^\backprime_1 \in N^+, w^\backprime_2 \in N^+)
\end{align}$$
使得
$$\begin{align}
logF(QS, MS) &= log(w_1QS) + log(w_2MS) \\
&= log(\frac{QS}{w^\backprime_1}) + log(\frac{MS}{w^\backprime_2}) \\
&= log(QS) - log(w^\backprime_1) + log(MS) - log(w^\backprime_2)
\end{align}$$
这一点在这里用其实有一些多余,因为搜索排名的权值,小数位的精度丢失其实对整个大的排名结果影响不大——我们搜索一半关心的是最匹配的前N个而精度丢失常常只影响最不匹配的N个。在这里提出这一点只是为了引出这一通过对数运算解决精度丢失的计算方法。这点在NLP或其它精度敏感的运算中十分重要。
Q: $F(QS,MS)$ 是无界函数,实际使用中可能因为数值过大而导致意外情况。
这一点有点胡扯,实际上,我只是在这里引出一种防止溢出的解决方案,在搜索排名中并不存在这一问题,也未进行至这一步。
这个问题其实是 $F(QS, MS)$ 无界的导致的。结合前文所述,我们重新设计函数S,S满足一下三个条件。
- S在区间 $QS \in [0, +∞)$;$MS \in (0, +∞)$ 中, $\exists M(\ M \in N), S \in [0, M]$
- S在区间 $QS \in [0, +∞),\ MS \in (0, +∞)$ 中是连续函数
- S在区间 $QS \in [0, +∞),\ MS \in (0, +∞)$ 中是单调函数
符合这几点要求的函数模型有很多,可以用已有的,也可以自行设定。这里我采用高斯概率密度函数之比作为最终结果。高斯概率密度函数之比,符合柯西分布——函数有界且单调连续。基于柯西分布,我们十分易于确定总数据集中符合我们需求的结果集并以此排序。
$$\begin{align}
& QS^\backprime = QS_{max} - QS; MS^\backprime = MS_{max} - MS \\
& QS^\backprime \sim N(0, 1),\ Cauchy(QS^\backprime) = \frac{Gaussion(QS^\backprime)}{Gaussion(0)}\\
& MS^\backprime \sim N(0, 1),\ Cauchy(MS^\backprime) = \frac{Gaussion(MS^\backprime)}{Gaussion(0)}\\
& S = Cauchy(QS^\backprime) + Cauchy(MS^\backprime)
\end{align}$$
其中,$MS_{max}$ 由搜索引擎提供,匹配结果集中匹配度最高的分值。在数据中,质量评分$QS \in [0, 100]$,因此$QS_{max}$ 为100。
如此,我们不但解决了最终评分无界的问题,同时,也基于Gaussion求得比较符合实际情况的评分模型$S$。同时,为了进一步解决浮点运算精度丢失问题、权重问题。再次基于前文所述方法进行变换即可,这里不作进一步描述。
难以理解的同学请自行了解高斯分布的物理意义,因为我也难以解释清楚。在此之后,我们要确认高斯分布的一个重要性质:$X \sim N(0, 1), Y \sim N(0, 1) \rightarrow X/Y \in C(1, 0) $。