fix: 修复成功率计算超过100%的问题
## 问题分析
成功率计算逻辑有误:
- 之前的计算:matched_segments / matchable_segments (排除固定片段)
- 问题:固定片段不会被添加到matches中,但应该算作成功的片段
## 正确的成功率计算
成功率 = (成功匹配的片段数 + 固定片段数) / 总片段数
### 修复内容
1. **match_materials方法**
- 成功片段数 = matched_segments + fixed_segments_count
- 总片段数 = total_segments (包含所有片段)
- 成功率 = successful_segments / total_segments
2. **match_materials_with_used_segments方法**
- 使用相同的计算逻辑确保一致性
- 修复statistics中的total_segments字段
### 逻辑说明
- 固定片段({固定素材})总是被视为成功的,因为它们不需要匹配
- 成功匹配的片段是通过AI分类或随机匹配成功的片段
- 总成功率 = (AI匹配成功 + 固定片段) / 所有片段
## 预期效果
- 成功率将始终在0-100%范围内
- 固定片段会被正确计入成功率
- 不同匹配方法的成功率计算保持一致
This commit is contained in:
parent
c5b944c4a3
commit
274926182c
|
|
@ -247,22 +247,22 @@ impl MaterialMatchingService {
|
|||
}
|
||||
}
|
||||
|
||||
// 计算统计信息 - 修正:固定素材不计入总数和失败数
|
||||
// 计算统计信息
|
||||
let total_segments = track_segments.len() as u32;
|
||||
let fixed_segments_count = fixed_segments.len() as u32;
|
||||
let matchable_segments = total_segments - fixed_segments_count; // 可匹配的片段数
|
||||
let matched_segments = matches.len() as u32;
|
||||
let failed_segments_count = failed_segments.len() as u32;
|
||||
|
||||
// 成功率基于可匹配的片段计算
|
||||
let success_rate = if matchable_segments > 0 {
|
||||
matched_segments as f64 / matchable_segments as f64
|
||||
// 正确的成功率计算:(成功匹配的片段 + 固定片段) / 总片段数
|
||||
let successful_segments = matched_segments + fixed_segments_count;
|
||||
let success_rate = if total_segments > 0 {
|
||||
successful_segments as f64 / total_segments as f64
|
||||
} else {
|
||||
1.0 // 如果没有需要匹配的片段,成功率为100%
|
||||
1.0 // 如果没有片段,成功率为100%
|
||||
};
|
||||
|
||||
let statistics = MatchingStatistics {
|
||||
total_segments: matchable_segments, // 只统计需要匹配的片段
|
||||
total_segments, // 统计所有片段
|
||||
matched_segments,
|
||||
failed_segments: failed_segments_count,
|
||||
success_rate,
|
||||
|
|
@ -1066,12 +1066,12 @@ impl MaterialMatchingService {
|
|||
let failed_segments_count = failed_segments.len() as u32;
|
||||
let fixed_segments_count = fixed_segments.len() as u32;
|
||||
|
||||
// 修正成功率计算:只考虑需要匹配的片段
|
||||
let matchable_segments = total_segments - fixed_segments_count;
|
||||
let success_rate = if matchable_segments > 0 {
|
||||
matched_segments as f64 / matchable_segments as f64
|
||||
// 正确的成功率计算:(成功匹配的片段 + 固定片段) / 总片段数
|
||||
let successful_segments = matched_segments + fixed_segments_count;
|
||||
let success_rate = if total_segments > 0 {
|
||||
successful_segments as f64 / total_segments as f64
|
||||
} else {
|
||||
1.0 // 如果没有需要匹配的片段,成功率为100%
|
||||
1.0 // 如果没有片段,成功率为100%
|
||||
};
|
||||
|
||||
// 判断匹配是否成功:所有需要匹配的片段都成功匹配
|
||||
|
|
@ -1084,7 +1084,7 @@ impl MaterialMatchingService {
|
|||
project_id: request.project_id.clone(),
|
||||
matches,
|
||||
statistics: MatchingStatistics {
|
||||
total_segments: matchable_segments, // 只统计需要匹配的片段
|
||||
total_segments, // 统计所有片段
|
||||
matched_segments,
|
||||
failed_segments: failed_segments_count,
|
||||
success_rate,
|
||||
|
|
|
|||
Loading…
Reference in New Issue