Spaces:
Running
on
Zero
Running
on
Zero
Update scoring_calculation_system.py
Browse files- scoring_calculation_system.py +28 -105
scoring_calculation_system.py
CHANGED
@@ -2322,20 +2322,11 @@ def calculate_breed_compatibility_score(scores: dict, user_prefs: UserPreference
|
|
2322 |
|
2323 |
return min(max_possible_score, max(min_possible_score, final_score))
|
2324 |
|
|
|
2325 |
def amplify_score_extreme(score: float) -> float:
|
2326 |
"""
|
2327 |
優化分數分布,提供更有意義的評分範圍。
|
2328 |
-
|
2329 |
-
這個函數就像是一個分數校準器,它的作用類似於相機的色彩校準,
|
2330 |
-
讓原始的分數分布能更好地反映實際的匹配程度。比如,一個90分的匹配
|
2331 |
-
應該確實代表一個非常好的搭配,而不是一個僅僅"還可以"的選擇。
|
2332 |
-
|
2333 |
-
我們使用分段函數和平滑曲線來實現這個目標:
|
2334 |
-
- 90-100分代表極佳匹配(映射到96-100)
|
2335 |
-
- 80-90分代表優秀匹配(映射到90-96)
|
2336 |
-
- 70-80分代表良好匹配(映射到82-90)
|
2337 |
-
- 50-70分代表可接受匹配(映射到75-82)
|
2338 |
-
- 50分以下代表較差匹配(映射到70-75)
|
2339 |
|
2340 |
Parameters:
|
2341 |
score: 原始評分(0-1之間的浮點數)
|
@@ -2344,104 +2335,36 @@ def amplify_score_extreme(score: float) -> float:
|
|
2344 |
float: 調整後的評分(0-1之間的浮點數)
|
2345 |
"""
|
2346 |
def smooth_curve(x: float, steepness: float = 12) -> float:
|
2347 |
-
"""
|
2348 |
-
創建平滑的S型曲線用於分數轉換。
|
2349 |
-
|
2350 |
-
這個函數使用sigmoid函數來產生平滑的轉換曲線,避免分數在
|
2351 |
-
不同區間之間產生突兀的跳變。就像是在照片編輯中,我們會使用
|
2352 |
-
漸變而不是突變來調整色調。
|
2353 |
-
|
2354 |
-
Parameters:
|
2355 |
-
x: 輸入值(0-1之間)
|
2356 |
-
steepness: 曲線的陡峭程度,越大曲線越陡
|
2357 |
-
|
2358 |
-
Returns:
|
2359 |
-
float: 轉換後的值(0-1之間)
|
2360 |
-
"""
|
2361 |
import math
|
2362 |
return 1 / (1 + math.exp(-steepness * (x - 0.5)))
|
2363 |
|
2364 |
-
|
2365 |
-
|
2366 |
-
|
2367 |
-
|
2368 |
-
|
2369 |
-
|
2370 |
-
|
2371 |
-
|
2372 |
-
|
2373 |
-
|
2374 |
-
|
2375 |
-
|
2376 |
-
|
2377 |
-
|
2378 |
-
|
2379 |
-
|
2380 |
-
|
2381 |
-
|
2382 |
-
|
2383 |
-
|
2384 |
-
|
2385 |
-
|
2386 |
-
|
2387 |
-
|
2388 |
-
transition = smooth_curve(position)
|
2389 |
-
return 0.90 + (transition * 0.06)
|
2390 |
-
|
2391 |
-
# 良好匹配區間(70-80)
|
2392 |
-
elif score >= 0.70:
|
2393 |
-
position = (score - 0.70) / 0.10
|
2394 |
-
# 加入輕微的非線性轉換
|
2395 |
-
return 0.82 + (math.pow(position, 0.9) * 0.08)
|
2396 |
-
|
2397 |
-
# 可接受匹配區間(50-70)
|
2398 |
-
elif score >= 0.50:
|
2399 |
-
position = (score - 0.50) / 0.20
|
2400 |
-
# 使用更平緩的曲線
|
2401 |
-
return 0.75 + (smooth_curve(position) * 0.07)
|
2402 |
-
|
2403 |
-
# 較差匹配區間(50以下)
|
2404 |
-
else:
|
2405 |
-
position = score / 0.50
|
2406 |
-
# 確保即使是較低分數也能得到基本分數
|
2407 |
-
return 0.70 + (smooth_curve(position) * 0.05)
|
2408 |
-
|
2409 |
-
def apply_context_bonus(score: float) -> float:
|
2410 |
-
"""
|
2411 |
-
根據具體情況添加額外的分數調整。
|
2412 |
-
|
2413 |
-
這個函數考慮特定的場景來微調分數,就像是考試時會根據題目
|
2414 |
-
的難度來調整給分標準。
|
2415 |
-
|
2416 |
-
Parameters:
|
2417 |
-
score: 當前分數
|
2418 |
-
|
2419 |
-
Returns:
|
2420 |
-
float: 調整後的分數
|
2421 |
-
"""
|
2422 |
-
bonus = 0
|
2423 |
-
|
2424 |
-
# 特殊場景加分
|
2425 |
-
temperament = breed_info.get('Temperament', '').lower()
|
2426 |
-
if user_prefs.living_space == 'apartment':
|
2427 |
-
if 'adaptable' in temperament and score > 0.85:
|
2428 |
-
bonus += 0.02
|
2429 |
-
|
2430 |
-
# 運動需求匹配度加分
|
2431 |
-
if breed_info.get('Exercise Needs', 'MODERATE').upper() == 'LOW':
|
2432 |
-
if user_prefs.exercise_time <= 60 and score > 0.85:
|
2433 |
-
bonus += 0.01
|
2434 |
-
|
2435 |
-
return min(1.0, score + bonus)
|
2436 |
|
2437 |
-
|
2438 |
-
adjusted_score = apply_range_mapping(score)
|
2439 |
-
|
2440 |
-
# 應用情境相關的調整
|
2441 |
-
final_score = apply_context_bonus(adjusted_score)
|
2442 |
-
|
2443 |
-
# 確保分數在有效範圍內
|
2444 |
-
return round(min(1.0, max(0.0, final_score)), 4)
|
2445 |
|
2446 |
# def amplify_score_extreme(score: float) -> float:
|
2447 |
# """優化分數分布,提供更高的分數範圍"""
|
|
|
2322 |
|
2323 |
return min(max_possible_score, max(min_possible_score, final_score))
|
2324 |
|
2325 |
+
|
2326 |
def amplify_score_extreme(score: float) -> float:
|
2327 |
"""
|
2328 |
優化分數分布,提供更有意義的評分範圍。
|
2329 |
+
純粹進行數學轉換,不依賴外部資訊。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2330 |
|
2331 |
Parameters:
|
2332 |
score: 原始評分(0-1之間的浮點數)
|
|
|
2335 |
float: 調整後的評分(0-1之間的浮點數)
|
2336 |
"""
|
2337 |
def smooth_curve(x: float, steepness: float = 12) -> float:
|
2338 |
+
"""創建平滑的S型曲線用於分數轉換"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2339 |
import math
|
2340 |
return 1 / (1 + math.exp(-steepness * (x - 0.5)))
|
2341 |
|
2342 |
+
# 90-100分的轉換(極佳匹配)
|
2343 |
+
if score >= 0.90:
|
2344 |
+
position = (score - 0.90) / 0.10
|
2345 |
+
return 0.96 + (position * 0.04)
|
2346 |
+
|
2347 |
+
# 80-90分的轉換(優秀匹配)
|
2348 |
+
elif score >= 0.80:
|
2349 |
+
position = (score - 0.80) / 0.10
|
2350 |
+
return 0.90 + (position * 0.06)
|
2351 |
+
|
2352 |
+
# 70-80分的轉換(良好匹配)
|
2353 |
+
elif score >= 0.70:
|
2354 |
+
position = (score - 0.70) / 0.10
|
2355 |
+
return 0.82 + (position * 0.08)
|
2356 |
+
|
2357 |
+
# 50-70分的轉換(可接受匹配)
|
2358 |
+
elif score >= 0.50:
|
2359 |
+
position = (score - 0.50) / 0.20
|
2360 |
+
return 0.75 + (smooth_curve(position) * 0.07)
|
2361 |
+
|
2362 |
+
# 50分以下的轉換(較差匹配)
|
2363 |
+
else:
|
2364 |
+
position = score / 0.50
|
2365 |
+
return 0.70 + (smooth_curve(position) * 0.05)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2366 |
|
2367 |
+
return round(min(1.0, max(0.0, score)), 4)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2368 |
|
2369 |
# def amplify_score_extreme(score: float) -> float:
|
2370 |
# """優化分數分布,提供更高的分數範圍"""
|