soul推荐算法
一、word2vec原理
参考一篇文章入门Word2Vec
二、word2vec正负采样怎么做的、word2vec采用的loss和原理
见【搜广推校招面经四、搜广推校招面经五十二、搜广推校招面经五十七】
不太理解为啥问这么多word2vec,索性直接整理一遍。
三、多路召回融合方式
见【搜广推校招面经二十六】
多路召回(Multi-Recall)指的是在信息检索或推荐系统中,通过多种召回策略(例如基于内容的召回、基于协同过滤的召回等)获取候选集,然后将这些候选集进行融合,以提高整体的召回质量和准确性。融合的目标是将不同策略的优点结合起来,从而得到更高质量的最终推荐结果。
3.1. 加权融合(Weighted Fusion)
- 加权融合方法是最常见的融合方式之一。在该方法中,为不同召回策略的候选集分配不同的权重,然后根据权重对各个召回结果进行加权平均,最后生成最终的候选集。
- 公式:
Final Rank ( i ) = ∑ j = 1 n w j ⋅ Rank j ( i ) \text{Final Rank}(i) = \sum_{j=1}^{n} w_j \cdot \text{Rank}_j(i) Final Rank(i)=j=1∑nwj⋅Rankj(i)
其中:- w j w_j wj 是召回策略 j j j的权重。
- Rank j ( i ) \text{Rank}_j(i) Rankj(i) 是策略 j j j 对候选项 i i i 的排名。
- 优点: 简单有效,可以灵活调整各召回策略的权重。
- 缺点: 需要手动调整权重,可能对不同场景不具有通用性。
3.2. 排序融合(Rank Fusion)
- 排序融合方法将多个召回策略生成的候选集排序,并根据候选集的排序结果进行融合。常见的排序融合方法有 Borda Count 和 CombSUM 等。
- Borda Count:为每个召回策略的候选集按顺序赋予分数,最后根据所有策略的排序分数合并得出最终的排序。
- CombSUM:将多个召回策略生成的候选集的排名值相加,最后根据排名总和进行排序。
- 优点: 不需要为每个召回策略设置权重,适应性强。
- 缺点: 排名过程较为复杂,可能会引入排序上的噪声。
3. 基于模型的融合(Model-based Fusion)
- 基于模型的融合方法通过训练一个模型来自动学习如何将多个召回策略的候选集进行合并。该模型通常使用机器学习算法(如逻辑回归、梯度提升树等)根据多个召回策略的结果预测最终的排序或评分。
- 流程:
- 对每个召回策略生成候选集,并提取每个候选的特征。
- 使用机器学习算法训练一个融合模型,模型输入为各策略的候选集特征,输出为最终的排名或评分。
- 优点: 自动化程度高,能够根据数据学习最优的融合策略。
- 缺点: 训练过程需要大量数据和计算资源。
4. 覆盖度融合(Coverage Fusion)
- 覆盖度融合方法通过比较不同召回策略的候选集,选取覆盖面更广的候选项,确保最终推荐的多样性和广度。通常在多个召回策略中选择不重复或较少重复的候选项,从而增加推荐的多样性。
- 优点: 有助于提高候选集的多样性,减少过度集中在某一类别的情况。
- 缺点: 可能会牺牲一些精确性,导致推荐的质量不如专注于某一召回策略时的效果。
5. 混合召回(Hybrid Recall)
- 混合召回方法结合不同召回策略的优点,例如结合基于内容的召回与基于协同过滤的召回。在混合召回中,多个召回策略的结果可能会根据某种规则(例如共现规则、相似度阈值等)进行合并。
- 优点: 可以通过结合多种召回策略来提高系统的推荐质量。
- 缺点: 可能会导致召回结果过于复杂,增加计算复杂度。
6. 重排序(Re-ranking)
- 重排序方法在多个召回策略生成候选集后,采用一个统一的模型对候选集进行重新排序。通常,重排序会引入额外的排序模型(如深度学习模型)来进一步提高最终候选集的精度。
- 优点: 能进一步提高推荐结果的质量,尤其是在有多个召回来源的情况下。
- 缺点: 增加了计算开销,训练重排序模型需要较长的时间和大量的数据。
7. 融合策略的组合(Meta-Learning Fusion)
- 该方法结合了多种融合策略,如加权融合、排序融合、基于模型的融合等,形成一个元学习模型来学习最合适的融合策略。通常会根据任务和数据的特点选择最优的融合方式。
- 优点: 高度灵活,能够自适应不同任务的需求。
- 缺点: 需要大量的计算资源和数据来训练元学习模型。
四、5. 最长回文子串(力扣hot100_多维动态规划_中等)
- 思路:做判断回文字串的任务,首先要知道一个算法叫Manacher算法,这个算法能在O(1)上判断子串是否为回文。
- 如何判断为回文?
- 暴力法:以每个字符i为中心,依次扩展hl,判断t[i - hl] == t[i + hl]
- Manacher算法:通过添加一个if判断,将判断过程简化为O(1)
- 代码:
class Solution:def longestPalindrome(self, s: str) -> str:'''使用 Manacher模板,同时维护最大的halflen[i]对应的下标,最后返回最长回文子串的下标'''t = "#".join("^" + s + "$")half_len = [0]*(len(t)-2) # half_len[i] 表示在 t 上的以 t[i] 为回文中心的最长回文子串的回文半径half_len[1] = 1box_m = 0 # 该回文子串的中心位置,二者的关系为 r=mid+half_len[mid]box_r = 0 # 表示当前右边界下标最大的回文子串的右边界下标+1, box_r=box_m+half_len[box_m]max_i = 0for i in range(2, len(half_len)):hl = 1if i < box_r:hl = min(half_len[box_m *2 -i], box_r-i)while t[i-hl] == t[i+hl]:hl += 1box_m, box_r = i, i+hlhalf_len[i] =hlif hl > half_len[max_i]:max_i = ihl = half_len[max_i]return s[(max_i - hl) // 2: (max_i + hl) // 2 - 1]