namespace DramaLing.Api.Services; /// /// CEFR等級映射服務 - 將CEFR等級轉換為詞彙難度數值 /// public static class CEFRMappingService { private static readonly Dictionary CEFRToWordLevel = new() { { "A1", 20 }, // 基礎詞彙 (1-1000常用詞) { "A2", 35 }, // 常用詞彙 (1001-3000詞) { "B1", 50 }, // 中級詞彙 (3001-6000詞) { "B2", 65 }, // 中高級詞彙 (6001-12000詞) { "C1", 80 }, // 高級詞彙 (12001-20000詞) { "C2", 95 } // 精通詞彙 (20000+詞) }; private static readonly Dictionary WordLevelToCEFR = new() { { 20, "A1" }, { 35, "A2" }, { 50, "B1" }, { 65, "B2" }, { 80, "C1" }, { 95, "C2" } }; /// /// 根據CEFR等級獲取詞彙難度數值 /// /// CEFR等級 (A1-C2) /// 詞彙難度 (1-100) public static int GetWordLevel(string? cefrLevel) { if (string.IsNullOrEmpty(cefrLevel)) return 50; // 預設B1級別 return CEFRToWordLevel.GetValueOrDefault(cefrLevel.ToUpperInvariant(), 50); } /// /// 根據詞彙難度數值獲取CEFR等級 /// /// 詞彙難度 (1-100) /// 對應的CEFR等級 public static string GetCEFRLevel(int wordLevel) { // 找到最接近的CEFR等級 var closestLevel = WordLevelToCEFR.Keys .OrderBy(level => Math.Abs(level - wordLevel)) .First(); return WordLevelToCEFR[closestLevel]; } /// /// 獲取新用戶的預設程度 /// /// 預設用戶程度 (50 = B1級別) public static int GetDefaultUserLevel() => 50; /// /// 判斷是否為A1學習者 /// /// 學習者程度 /// 是否為A1學習者 public static bool IsA1Learner(int userLevel) => userLevel <= 20; /// /// 獲取學習者程度描述 /// /// 學習者程度 (1-100) /// 程度描述 public static string GetUserLevelDescription(int userLevel) { return userLevel switch { <= 20 => "A1 - 初學者", <= 35 => "A2 - 基礎", <= 50 => "B1 - 中級", <= 65 => "B2 - 中高級", <= 80 => "C1 - 高級", _ => "C2 - 精通" }; } /// /// 根據詞彙使用頻率估算難度 (未來擴展用) /// /// 詞彙頻率排名 /// 估算的詞彙難度 public static int EstimateWordLevelByFrequency(int frequency) { return frequency switch { <= 1000 => 20, // 最常用1000詞 → A1 <= 3000 => 35, // 常用3000詞 → A2 <= 6000 => 50, // 中級6000詞 → B1 <= 12000 => 65, // 中高級12000詞 → B2 <= 20000 => 80, // 高級20000詞 → C1 _ => 95 // 超過20000詞 → C2 }; } /// /// 獲取所有CEFR等級列表 /// /// CEFR等級數組 public static string[] GetAllCEFRLevels() => new[] { "A1", "A2", "B1", "B2", "C1", "C2" }; /// /// 驗證CEFR等級是否有效 /// /// 要驗證的CEFR等級 /// 是否有效 public static bool IsValidCEFRLevel(string? cefrLevel) { if (string.IsNullOrEmpty(cefrLevel)) return false; return CEFRToWordLevel.ContainsKey(cefrLevel.ToUpperInvariant()); } }