DawnC commited on
Commit
689deea
1 Parent(s): 2778634

Update scoring_calculation_system.py

Browse files
Files changed (1) hide show
  1. scoring_calculation_system.py +45 -56
scoring_calculation_system.py CHANGED
@@ -33,7 +33,7 @@ class UserPreferences:
33
 
34
  def apply_size_filter(breed_score: float, user_preference: str, breed_size: str) -> float:
35
  """
36
- 強過濾機制,基於用戶的體型偏好過濾品種
37
 
38
  Parameters:
39
  breed_score (float): 原始品種評分
@@ -161,14 +161,14 @@ def calculate_breed_bonus(breed_info: dict, user_prefs: 'UserPreferences') -> fl
161
  # 6. 適應性評估
162
  adaptability_bonus = 0.0
163
  if breed_info.get('Size') == "Small" and user_prefs.living_space == "apartment":
164
- adaptability_bonus += 0.08 # 小型犬更適合公寓
165
 
166
  # 環境適應性評估
167
  if 'adaptable' in temperament or 'versatile' in temperament:
168
  if user_prefs.living_space == "apartment":
169
- adaptability_bonus += 0.10 # 適應性在公寓環境更重要
170
  else:
171
- adaptability_bonus += 0.05 # 其他環境仍有加分
172
 
173
  # 氣候適應性
174
  description = breed_info.get('Description', '').lower()
@@ -633,7 +633,7 @@ def calculate_compatibility_score(breed_info: dict, user_prefs: UserPreferences)
633
 
634
  def calculate_exercise_score(breed_needs: str, exercise_time: int, exercise_type: str, breed_size: str, living_space: str) -> float:
635
  """
636
- 計算品種運動需求與使用者運動條件的匹配度。此函數特別著重:
637
  1. 不同品種的運動耐受度差異
638
  2. 運動時間與類型的匹配度
639
  3. 極端運動量的嚴格限制
@@ -902,21 +902,21 @@ def calculate_compatibility_score(breed_info: dict, user_prefs: UserPreferences)
902
  2. 縮小經驗等級間的差距
903
  3. 保持適度的區分度
904
  """
905
- # 基礎分數矩陣 - 更合理的分數分配
906
  base_scores = {
907
  "High": {
908
  "beginner": 0.55, # 提高起始分,讓新手也有機會
909
- "intermediate": 0.80, # 中級玩家有不錯的勝任能力
910
  "advanced": 0.95 # 資深者幾乎完全勝任
911
  },
912
  "Moderate": {
913
  "beginner": 0.65, # 適中難度對新手更友善
914
- "intermediate": 0.85, # 中級玩家相當適合
915
  "advanced": 0.90 # 資深者完全勝任
916
  },
917
  "Low": {
918
  "beginner": 0.85, # 新手友善品種維持高分
919
- "intermediate": 0.90, # 中級玩家幾乎完全勝任
920
  "advanced": 0.90 # 資深者完全勝任
921
  }
922
  }
@@ -924,25 +924,25 @@ def calculate_compatibility_score(breed_info: dict, user_prefs: UserPreferences)
924
  # 取得基礎分數
925
  score = base_scores.get(care_level, base_scores["Moderate"])[user_experience]
926
 
927
- # 性格評估的權重也需要調整
928
  temperament_lower = temperament.lower()
929
  temperament_adjustments = 0.0
930
 
931
  # 根據經驗等級設定不同的特徵評估標準,降低懲罰程度
932
  if user_experience == "beginner":
933
  difficult_traits = {
934
- 'stubborn': -0.15, # 降低懲罰程度
935
  'independent': -0.12,
936
  'dominant': -0.12,
937
  'strong-willed': -0.10,
938
  'protective': -0.10,
939
  'aloof': -0.08,
940
  'energetic': -0.08,
941
- 'aggressive': -0.20 # 保持較高懲罰,因為安全考慮
942
  }
943
 
944
  easy_traits = {
945
- 'gentle': 0.08, # 提高獎勵以平衡
946
  'friendly': 0.08,
947
  'eager to please': 0.10,
948
  'patient': 0.08,
@@ -967,7 +967,7 @@ def calculate_compatibility_score(breed_info: dict, user_prefs: UserPreferences)
967
  elif 'guard' in temperament_lower:
968
  temperament_adjustments -= 0.12
969
 
970
- # 中級和高級玩家的調整保持不變...
971
  elif user_experience == "intermediate":
972
  moderate_traits = {
973
  'stubborn': -0.08,
@@ -1237,7 +1237,7 @@ def calculate_compatibility_score(breed_info: dict, user_prefs: UserPreferences)
1237
  print(f"品種信息: {breed_info}")
1238
  print(f"使用者偏好: {vars(user_prefs)}")
1239
 
1240
- # 計算所有基礎分數並整合到字典中
1241
  scores = {
1242
  'space': calculate_space_score(
1243
  breed_info['Size'],
@@ -1348,7 +1348,7 @@ def calculate_breed_compatibility_score(scores: dict, user_prefs: UserPreference
1348
  """
1349
  def evaluate_perfect_conditions():
1350
  """
1351
- 評估條件匹配度,特別強化:
1352
  1. 運動類型與時間的綜合評估
1353
  2. 專業技能需求評估
1354
  3. 品種特性評估
@@ -1358,13 +1358,13 @@ def calculate_breed_compatibility_score(scores: dict, user_prefs: UserPreference
1358
  'exercise_match': 0,
1359
  'experience_match': 0,
1360
  'living_condition_match': 0,
1361
- 'breed_trait_match': 0 # 新增品種特性匹配度
1362
  }
1363
 
1364
  # 第一部分:運動需求評估
1365
  def evaluate_exercise_compatibility():
1366
  """
1367
- 評估運動需求的匹配度,特別關注:
1368
  1. 時間與強度的合理搭配
1369
  2. 不同品種的運動特性
1370
  3. 運動類型的適配性
@@ -1425,7 +1425,7 @@ def calculate_breed_compatibility_score(scores: dict, user_prefs: UserPreference
1425
  }
1426
 
1427
  def determine_breed_type():
1428
- """改進品種運動類型的判斷,更精確識別工作犬"""
1429
  # 優先檢查特殊運動類型的標識符
1430
  for breed_type, pattern in breed_exercise_patterns.items():
1431
  if any(identifier in temperament or identifier in description
@@ -1477,7 +1477,6 @@ def calculate_breed_compatibility_score(scores: dict, user_prefs: UserPreference
1477
  def apply_special_adjustments(time_score, type_score, breed_type, pattern):
1478
  """
1479
  處理特殊情況,確保運動方式真正符合品種需求。
1480
- 特別加強:
1481
  1. 短跑型犬種的長時間運動懲罰
1482
  2. 耐力型犬種的獎勵機制
1483
  3. 運動類型匹配的重要性
@@ -1496,7 +1495,7 @@ def calculate_breed_compatibility_score(scores: dict, user_prefs: UserPreference
1496
  elif breed_type == 'endurance_type':
1497
  if exercise_time < pattern['time_ranges']['penalty_start']:
1498
  time_score *= 0.5 # 維持運動不足的懲罰
1499
- elif exercise_time >= 150: # 新增:高運動量獎勵
1500
  if exercise_type in ['active_training', 'moderate_activity']:
1501
  time_bonus = min(0.3, (exercise_time - 150) / 150)
1502
  time_score = min(1.0, time_score * (1 + time_bonus))
@@ -1575,7 +1574,7 @@ def calculate_breed_compatibility_score(scores: dict, user_prefs: UserPreference
1575
 
1576
  def evaluate_living_conditions() -> float:
1577
  """
1578
- 評估生活環境適配性,特別加強:
1579
  1. 降低對大型犬的過度懲罰
1580
  2. 增加品種特性評估
1581
  3. 提升對適應性的重視度
@@ -1700,7 +1699,7 @@ def calculate_breed_compatibility_score(scores: dict, user_prefs: UserPreference
1700
 
1701
  def calculate_weights() -> dict:
1702
  """
1703
- 動態計算評分權重,特別關注:
1704
  1. 極端情況的權重調整
1705
  2. 使用者條件的協同效應
1706
  3. 品種特性的影響
@@ -1739,7 +1738,7 @@ def calculate_breed_compatibility_score(scores: dict, user_prefs: UserPreference
1739
 
1740
  # 空間限制評估 - 更合理的空間評估
1741
  space_extremity = {
1742
- 'apartment': ('restricted', 0.7), # 從0.9降低到0.7,減少限制
1743
  'house_small': ('moderate', 0.5),
1744
  'house_large': ('spacious', 0.3)
1745
  }
@@ -1876,9 +1875,9 @@ def calculate_breed_compatibility_score(scores: dict, user_prefs: UserPreference
1876
  adjustments['experience'] = 2.5
1877
  elif extremities['experience'][0] == 'high':
1878
  if is_working_dog:
1879
- adjustments['experience'] = 2.5 # 提高專家對工作犬的權重
1880
  if extremities['exercise'][0] in ['high', 'extremely_high']:
1881
- adjustments['experience'] = 2.8 # 特別強化高運動量工作犬
1882
  else:
1883
  adjustments['experience'] = 1.8
1884
 
@@ -1890,7 +1889,7 @@ def calculate_breed_compatibility_score(scores: dict, user_prefs: UserPreference
1890
  adjustments['space'] = adjustments.get('space', 1.0) * 1.3
1891
  adjustments['exercise'] = adjustments.get('exercise', 1.0) * 1.3
1892
 
1893
- # 新增:專家 + 大空間 + 高運動量 + 工作犬的組合
1894
  if (extremities['experience'][0] == 'high' and
1895
  extremities['space'][0] == 'spacious' and
1896
  extremities['exercise'][0] in ['high', 'extremely_high'] and
@@ -1931,14 +1930,11 @@ def calculate_breed_compatibility_score(scores: dict, user_prefs: UserPreference
1931
 
1932
  def apply_special_case_adjustments(score: float) -> float:
1933
  """
1934
- 處理特殊情況和極端案例的評分調整。這個函數特別關注:
1935
  1. 條件組合的協同效應
1936
  2. 品種特性的獨特需求
1937
  3. 極端情況的合理處理
1938
-
1939
- 這個函數就像是一個細心的裁判,會考慮到各種特殊情況,
1940
- 並根據具體場景做出合理的評分調整。
1941
-
1942
  Parameters:
1943
  score: 初始評分
1944
  Returns:
@@ -1967,16 +1963,16 @@ def calculate_breed_compatibility_score(scores: dict, user_prefs: UserPreference
1967
  # 大型犬的特殊處理
1968
  if breed_info['Size'] in ['Large', 'Giant']:
1969
  if apartment_friendly:
1970
- multiplier *= 0.85 # 從0.7提升到0.85,降低懲罰
1971
  else:
1972
- multiplier *= 0.75 # 從0.5提升到0.75
1973
 
1974
  # 檢查運動需求的匹配度
1975
  exercise_needs = breed_info.get('Exercise Needs', 'MODERATE').upper()
1976
  exercise_time = user_prefs.exercise_time
1977
 
1978
  if exercise_needs in ['HIGH', 'VERY HIGH']:
1979
- if exercise_time >= 120: # 高運動量可以部分補償空間限制
1980
  multiplier *= 1.1
1981
 
1982
  return multiplier
@@ -1996,17 +1992,17 @@ def calculate_breed_compatibility_score(scores: dict, user_prefs: UserPreference
1996
  if user_prefs.experience_level == 'beginner':
1997
  if care_level == 'HIGH':
1998
  if user_prefs.has_children:
1999
- multiplier *= 0.7 # 從0.5提升到0.7
2000
  else:
2001
- multiplier *= 0.8 # 從0.6提升到0.8
2002
 
2003
  # 性格特徵影響,降低懲罰程度
2004
  challenging_traits = {
2005
- 'stubborn': -0.10, # 從-0.15降低
2006
- 'independent': -0.08, # 從-0.12降低
2007
- 'dominant': -0.08, # 從-0.12降低
2008
- 'protective': -0.06, # 從-0.10降低
2009
- 'aggressive': -0.15 # 保持較高懲罰因安全考慮
2010
  }
2011
 
2012
  for trait, penalty in challenging_traits.items():
@@ -2018,9 +2014,6 @@ def calculate_breed_compatibility_score(scores: dict, user_prefs: UserPreference
2018
  def evaluate_breed_specific_requirements() -> float:
2019
  """
2020
  評估品種特定需求。
2021
-
2022
- 這個函數就像是為每個品種量身定制評估標準,
2023
- 考慮其獨特的特性和需求。
2024
  """
2025
  multiplier = 1.0
2026
  exercise_time = user_prefs.exercise_time
@@ -2034,19 +2027,19 @@ def calculate_breed_compatibility_score(scores: dict, user_prefs: UserPreference
2034
  # 運動需求匹配度評估,更合理的標準
2035
  if exercise_needs == 'LOW':
2036
  if exercise_time > 120:
2037
- multiplier *= 0.85 # 從0.5提升到0.85
2038
  elif exercise_needs == 'VERY HIGH':
2039
  if exercise_time < 60:
2040
- multiplier *= 0.7 # 從0.5提升到0.7
2041
 
2042
  # 特殊品種類型的考慮
2043
  if 'sprint' in temperament:
2044
  if exercise_time > 120 and exercise_type != 'active_training':
2045
- multiplier *= 0.85 # 從0.7提升到0.85
2046
 
2047
  if any(trait in temperament for trait in ['working', 'herding']):
2048
  if exercise_time < 90 or exercise_type == 'light_walks':
2049
- multiplier *= 0.8 # 從0.7提升到0.8
2050
 
2051
  return multiplier
2052
 
@@ -2066,9 +2059,8 @@ def calculate_breed_compatibility_score(scores: dict, user_prefs: UserPreference
2066
 
2067
  def calculate_base_score(scores: dict, weights: dict) -> float:
2068
  """
2069
- 計算基礎評分分數,採用更靈活的評分機制。
2070
-
2071
- 這個函數使用了改進後的評分邏輯,主要關注:
2072
  1. 降低關鍵指標的最低門檻,使系統更包容
2073
  2. 引入非線性評分曲線,讓分數分布更合理
2074
  3. 優化多重條件失敗的處理方式
@@ -2288,10 +2280,7 @@ def calculate_breed_compatibility_score(scores: dict, user_prefs: UserPreference
2288
 
2289
 
2290
  def amplify_score_extreme(score: float) -> float:
2291
- """
2292
- 優化分數分布,提供更有意義的評分範圍。
2293
- 純粹進行數學轉換,不依賴外部資訊。
2294
-
2295
  Parameters:
2296
  score: 原始評分(0-1之間的浮點數)
2297
 
 
33
 
34
  def apply_size_filter(breed_score: float, user_preference: str, breed_size: str) -> float:
35
  """
36
+ 基於用戶的體型偏好過濾品種,只要不符合就過濾掉
37
 
38
  Parameters:
39
  breed_score (float): 原始品種評分
 
161
  # 6. 適應性評估
162
  adaptability_bonus = 0.0
163
  if breed_info.get('Size') == "Small" and user_prefs.living_space == "apartment":
164
+ adaptability_bonus += 0.08
165
 
166
  # 環境適應性評估
167
  if 'adaptable' in temperament or 'versatile' in temperament:
168
  if user_prefs.living_space == "apartment":
169
+ adaptability_bonus += 0.10
170
  else:
171
+ adaptability_bonus += 0.05
172
 
173
  # 氣候適應性
174
  description = breed_info.get('Description', '').lower()
 
633
 
634
  def calculate_exercise_score(breed_needs: str, exercise_time: int, exercise_type: str, breed_size: str, living_space: str) -> float:
635
  """
636
+ 計算品種運動需求與使用者運動條件的匹配度
637
  1. 不同品種的運動耐受度差異
638
  2. 運動時間與類型的匹配度
639
  3. 極端運動量的嚴格限制
 
902
  2. 縮小經驗等級間的差距
903
  3. 保持適度的區分度
904
  """
905
+ # 基礎分數矩陣
906
  base_scores = {
907
  "High": {
908
  "beginner": 0.55, # 提高起始分,讓新手也有機會
909
+ "intermediate": 0.80, # 中等經驗用戶可能有不錯的勝任能力
910
  "advanced": 0.95 # 資深者幾乎完全勝任
911
  },
912
  "Moderate": {
913
  "beginner": 0.65, # 適中難度對新手更友善
914
+ "intermediate": 0.85, # 中等經驗用戶相當適合
915
  "advanced": 0.90 # 資深者完全勝任
916
  },
917
  "Low": {
918
  "beginner": 0.85, # 新手友善品種維持高分
919
+ "intermediate": 0.90, # 中等經驗用戶幾乎完全勝任
920
  "advanced": 0.90 # 資深者完全勝任
921
  }
922
  }
 
924
  # 取得基礎分數
925
  score = base_scores.get(care_level, base_scores["Moderate"])[user_experience]
926
 
927
+ # 性格評估的權重
928
  temperament_lower = temperament.lower()
929
  temperament_adjustments = 0.0
930
 
931
  # 根據經驗等級設定不同的特徵評估標準,降低懲罰程度
932
  if user_experience == "beginner":
933
  difficult_traits = {
934
+ 'stubborn': -0.15,
935
  'independent': -0.12,
936
  'dominant': -0.12,
937
  'strong-willed': -0.10,
938
  'protective': -0.10,
939
  'aloof': -0.08,
940
  'energetic': -0.08,
941
+ 'aggressive': -0.20
942
  }
943
 
944
  easy_traits = {
945
+ 'gentle': 0.08,
946
  'friendly': 0.08,
947
  'eager to please': 0.10,
948
  'patient': 0.08,
 
967
  elif 'guard' in temperament_lower:
968
  temperament_adjustments -= 0.12
969
 
970
+ # 中等經驗用戶
971
  elif user_experience == "intermediate":
972
  moderate_traits = {
973
  'stubborn': -0.08,
 
1237
  print(f"品種信息: {breed_info}")
1238
  print(f"使用者偏好: {vars(user_prefs)}")
1239
 
1240
+ # 計算所有基礎分數
1241
  scores = {
1242
  'space': calculate_space_score(
1243
  breed_info['Size'],
 
1348
  """
1349
  def evaluate_perfect_conditions():
1350
  """
1351
+ 評估條件匹配度:
1352
  1. 運動類型與時間的綜合評估
1353
  2. 專業技能需求評估
1354
  3. 品種特性評估
 
1358
  'exercise_match': 0,
1359
  'experience_match': 0,
1360
  'living_condition_match': 0,
1361
+ 'breed_trait_match': 0
1362
  }
1363
 
1364
  # 第一部分:運動需求評估
1365
  def evaluate_exercise_compatibility():
1366
  """
1367
+ 評估運動需求的匹配度:
1368
  1. 時間與強度的合理搭配
1369
  2. 不同品種的運動特性
1370
  3. 運動類型的適配性
 
1425
  }
1426
 
1427
  def determine_breed_type():
1428
+ """改進品種運動類型的判斷,識別工作犬"""
1429
  # 優先檢查特殊運動類型的標識符
1430
  for breed_type, pattern in breed_exercise_patterns.items():
1431
  if any(identifier in temperament or identifier in description
 
1477
  def apply_special_adjustments(time_score, type_score, breed_type, pattern):
1478
  """
1479
  處理特殊情況,確保運動方式真正符合品種需求。
 
1480
  1. 短跑型犬種的長時間運動懲罰
1481
  2. 耐力型犬種的獎勵機制
1482
  3. 運動類型匹配的重要性
 
1495
  elif breed_type == 'endurance_type':
1496
  if exercise_time < pattern['time_ranges']['penalty_start']:
1497
  time_score *= 0.5 # 維持運動不足的懲罰
1498
+ elif exercise_time >= 150:
1499
  if exercise_type in ['active_training', 'moderate_activity']:
1500
  time_bonus = min(0.3, (exercise_time - 150) / 150)
1501
  time_score = min(1.0, time_score * (1 + time_bonus))
 
1574
 
1575
  def evaluate_living_conditions() -> float:
1576
  """
1577
+ 評估生活環境適配性:
1578
  1. 降低對大型犬的過度懲罰
1579
  2. 增加品種特性評估
1580
  3. 提升對適應性的重視度
 
1699
 
1700
  def calculate_weights() -> dict:
1701
  """
1702
+ 動態計算評分權重:
1703
  1. 極端情況的權重調整
1704
  2. 使用者條件的協同效應
1705
  3. 品種特性的影響
 
1738
 
1739
  # 空間限制評估 - 更合理的空間評估
1740
  space_extremity = {
1741
+ 'apartment': ('restricted', 0.7),
1742
  'house_small': ('moderate', 0.5),
1743
  'house_large': ('spacious', 0.3)
1744
  }
 
1875
  adjustments['experience'] = 2.5
1876
  elif extremities['experience'][0] == 'high':
1877
  if is_working_dog:
1878
+ adjustments['experience'] = 2.5
1879
  if extremities['exercise'][0] in ['high', 'extremely_high']:
1880
+ adjustments['experience'] = 2.8
1881
  else:
1882
  adjustments['experience'] = 1.8
1883
 
 
1889
  adjustments['space'] = adjustments.get('space', 1.0) * 1.3
1890
  adjustments['exercise'] = adjustments.get('exercise', 1.0) * 1.3
1891
 
1892
+ # 專家 + 大空間 + 高運動量 + 工作犬的組合
1893
  if (extremities['experience'][0] == 'high' and
1894
  extremities['space'][0] == 'spacious' and
1895
  extremities['exercise'][0] in ['high', 'extremely_high'] and
 
1930
 
1931
  def apply_special_case_adjustments(score: float) -> float:
1932
  """
1933
+ 處理特殊情況和極端案例的評分調整:
1934
  1. 條件組合的協同效應
1935
  2. 品種特性的獨特需求
1936
  3. 極端情況的合理處理
1937
+
 
 
 
1938
  Parameters:
1939
  score: 初始評分
1940
  Returns:
 
1963
  # 大型犬的特殊處理
1964
  if breed_info['Size'] in ['Large', 'Giant']:
1965
  if apartment_friendly:
1966
+ multiplier *= 0.85
1967
  else:
1968
+ multiplier *= 0.75
1969
 
1970
  # 檢查運動需求的匹配度
1971
  exercise_needs = breed_info.get('Exercise Needs', 'MODERATE').upper()
1972
  exercise_time = user_prefs.exercise_time
1973
 
1974
  if exercise_needs in ['HIGH', 'VERY HIGH']:
1975
+ if exercise_time >= 120:
1976
  multiplier *= 1.1
1977
 
1978
  return multiplier
 
1992
  if user_prefs.experience_level == 'beginner':
1993
  if care_level == 'HIGH':
1994
  if user_prefs.has_children:
1995
+ multiplier *= 0.7
1996
  else:
1997
+ multiplier *= 0.8
1998
 
1999
  # 性格特徵影響,降低懲罰程度
2000
  challenging_traits = {
2001
+ 'stubborn': -0.10,
2002
+ 'independent': -0.08,
2003
+ 'dominant': -0.08,
2004
+ 'protective': -0.06,
2005
+ 'aggressive': -0.15
2006
  }
2007
 
2008
  for trait, penalty in challenging_traits.items():
 
2014
  def evaluate_breed_specific_requirements() -> float:
2015
  """
2016
  評估品種特定需求。
 
 
 
2017
  """
2018
  multiplier = 1.0
2019
  exercise_time = user_prefs.exercise_time
 
2027
  # 運動需求匹配度評估,更合理的標準
2028
  if exercise_needs == 'LOW':
2029
  if exercise_time > 120:
2030
+ multiplier *= 0.85
2031
  elif exercise_needs == 'VERY HIGH':
2032
  if exercise_time < 60:
2033
+ multiplier *= 0.7
2034
 
2035
  # 特殊品種類型的考慮
2036
  if 'sprint' in temperament:
2037
  if exercise_time > 120 and exercise_type != 'active_training':
2038
+ multiplier *= 0.85
2039
 
2040
  if any(trait in temperament for trait in ['working', 'herding']):
2041
  if exercise_time < 90 or exercise_type == 'light_walks':
2042
+ multiplier *= 0.8
2043
 
2044
  return multiplier
2045
 
 
2059
 
2060
  def calculate_base_score(scores: dict, weights: dict) -> float:
2061
  """
2062
+ 計算基礎評分分數
2063
+ 這個函數使用了改進後的評分邏輯:
 
2064
  1. 降低關鍵指標的最低門檻,使系統更包容
2065
  2. 引入非線性評分曲線,讓分數分布更合理
2066
  3. 優化多重條件失敗的處理方式
 
2280
 
2281
 
2282
  def amplify_score_extreme(score: float) -> float:
2283
+ """
 
 
 
2284
  Parameters:
2285
  score: 原始評分(0-1之間的浮點數)
2286