|
@@ -91,7 +91,7 @@ public class RankServiceImpl implements RankService {
|
|
|
Modality modality, RankingParams params) {
|
|
Modality modality, RankingParams params) {
|
|
|
Double rov = signals.getRov();
|
|
Double rov = signals.getRov();
|
|
|
|
|
|
|
|
- // 按维度独立 boost:优先取 boostsByCode[configCode],回退 deconstructBoost
|
|
|
|
|
|
|
+ // boost 仅作用于相关性分(解构维度权重),ROV 是视频粒度不加 boost
|
|
|
Double codeBoost = params.getBoostsByCode() != null
|
|
Double codeBoost = params.getBoostsByCode() != null
|
|
|
? params.getBoostsByCode().getOrDefault(signals.getProvenance() != null
|
|
? params.getBoostsByCode().getOrDefault(signals.getProvenance() != null
|
|
|
? signals.getProvenance().getConfigCode() : null, params.getDeconstructBoost())
|
|
? signals.getProvenance().getConfigCode() : null, params.getDeconstructBoost())
|
|
@@ -99,17 +99,20 @@ public class RankServiceImpl implements RankService {
|
|
|
if (codeBoost == null) codeBoost = params.getDeconstructBoost();
|
|
if (codeBoost == null) codeBoost = params.getDeconstructBoost();
|
|
|
|
|
|
|
|
boolean hasRov = rov != null && Double.isFinite(rov);
|
|
boolean hasRov = rov != null && Double.isFinite(rov);
|
|
|
- double boost = (modality == Modality.VIDEO && hasRov) ? codeBoost : 1.0;
|
|
|
|
|
|
|
|
|
|
if (!hasRov) {
|
|
if (!hasRov) {
|
|
|
- double composite = boost * simNorm;
|
|
|
|
|
- return ScoreBreakdown.of(composite, simNorm, 0, boost, lowerBound, passesThreshold);
|
|
|
|
|
|
|
+ if (modality == Modality.VIDEO) {
|
|
|
|
|
+ double composite = codeBoost * params.getAlpha() * simNorm;
|
|
|
|
|
+ return ScoreBreakdown.of(composite, simNorm, 0, codeBoost, lowerBound, passesThreshold);
|
|
|
|
|
+ }
|
|
|
|
|
+ double composite = simNorm;
|
|
|
|
|
+ return ScoreBreakdown.of(composite, simNorm, 0, 1, lowerBound, passesThreshold);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
double rovDenom = params.getRovClipHigh() - params.getRovClipLow();
|
|
double rovDenom = params.getRovClipHigh() - params.getRovClipLow();
|
|
|
double rovNorm = rovDenom > 0 ? clip01((rov - params.getRovClipLow()) / rovDenom) : 0;
|
|
double rovNorm = rovDenom > 0 ? clip01((rov - params.getRovClipLow()) / rovDenom) : 0;
|
|
|
- double composite = boost * (params.getAlpha() * simNorm + (1 - params.getAlpha()) * rovNorm);
|
|
|
|
|
- return ScoreBreakdown.of(composite, simNorm, rovNorm, boost, lowerBound, passesThreshold);
|
|
|
|
|
|
|
+ double composite = params.getAlpha() * codeBoost * simNorm + (1 - params.getAlpha()) * rovNorm;
|
|
|
|
|
+ return ScoreBreakdown.of(composite, simNorm, rovNorm, codeBoost, lowerBound, passesThreshold);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private double effectiveSimThreshold(String configCode, RankingParams params) {
|
|
private double effectiveSimThreshold(String configCode, RankingParams params) {
|
|
@@ -151,27 +154,10 @@ public class RankServiceImpl implements RankService {
|
|
|
|
|
|
|
|
double maxSim = sims.stream().max(Double::compare).orElse(0.0);
|
|
double maxSim = sims.stream().max(Double::compare).orElse(0.0);
|
|
|
|
|
|
|
|
- // 自适应 ROV 分位(从候选集估计 P5/P95,样本需足够大才有统计意义)
|
|
|
|
|
double rovLow = baseParams.getRovClipLow();
|
|
double rovLow = baseParams.getRovClipLow();
|
|
|
double rovHigh = baseParams.getRovClipHigh();
|
|
double rovHigh = baseParams.getRovClipHigh();
|
|
|
- if (rovs.size() >= 30) {
|
|
|
|
|
- rovs.sort(Double::compare);
|
|
|
|
|
- int p5Idx = Math.max(0, (int) (rovs.size() * 0.05));
|
|
|
|
|
- int p95Idx = Math.min(rovs.size() - 1, (int) (rovs.size() * 0.95));
|
|
|
|
|
- rovLow = rovs.get(p5Idx);
|
|
|
|
|
- rovHigh = rovs.get(p95Idx);
|
|
|
|
|
- // 防止上下界过于接近
|
|
|
|
|
- if (rovHigh - rovLow < 0.001) {
|
|
|
|
|
- rovHigh = rovLow + 0.01;
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
|
|
|
|
|
- // 自适应 sim 下界:max(绝对兜底, 相对阈值 max_sim - delta)
|
|
|
|
|
- double absFloor = baseParams.getSimThreshold();
|
|
|
|
|
- double relFloor = maxSim - 0.15;
|
|
|
|
|
- double simFloor = Math.max(absFloor, relFloor);
|
|
|
|
|
- // 安全钳:不高于 0.9,不低于 0.4
|
|
|
|
|
- simFloor = Math.max(0.4, Math.min(0.9, simFloor));
|
|
|
|
|
|
|
+ double simFloor = baseParams.getSimThreshold();
|
|
|
|
|
|
|
|
// 构建自适应参数
|
|
// 构建自适应参数
|
|
|
RankingParams adaptiveParams = new RankingParams();
|
|
RankingParams adaptiveParams = new RankingParams();
|