diff --git a/ARCHITECTURE_ANALYSIS.md b/ARCHITECTURE_ANALYSIS.md new file mode 100644 index 0000000..f9fd0ea --- /dev/null +++ b/ARCHITECTURE_ANALYSIS.md @@ -0,0 +1,277 @@ +# novelty-seeking 系統流程與耦合度分析 + +> 生成日期: 2025-12-04 + +## 一、系統整體架構概覽 + +novelty-seeking 是一個創新思維引導系統,由三個核心 Agent 組成: +- **Attribute Agent**:從查詢到屬性節點的映射 +- **Transformation Agent**:屬性到新關鍵字的轉換 +- **Expert Transformation Agent**:多視角專家角度的屬性轉換 + +--- + +## 二、完整資料流程 + +``` +┌─────────────────────────────────────────────────────────────────────┐ +│ Attribute Agent │ +├─────────────────────────────────────────────────────────────────────┤ +│ 用戶輸入 Query (如「腳踏車」) │ +│ ↓ │ +│ Step 0: 類別分析 (category_mode 決定) │ +│ → 產出: CategoryDefinition[] (如 材料/功能/用途/使用族群) │ +│ ↓ │ +│ Step 1: 屬性列表生成 │ +│ → 產出: {材料: [鋼,木,碳纖維], 功能: [搬運,儲存], ...} │ +│ ↓ │ +│ Step 2: 關係生成 (DAG 邊) │ +│ → 產出: AttributeDAG (nodes + edges) │ +└─────────────────────────────────────────────────────────────────────┘ + ↓ (高耦合) +┌─────────────────────────────────────────────────────────────────────┐ +│ Expert Transformation Agent │ +├─────────────────────────────────────────────────────────────────────┤ +│ 輸入: Query + Category + Attributes (來自 Attribute Agent) │ +│ ↓ │ +│ Step 0: 專家團隊生成 │ +│ → expert_source 決定: llm / curated / dbpedia / wikidata │ +│ → 產出: ExpertProfile[] (如 會計師/心理師/生態學家) │ +│ ↓ │ +│ Step 1: 專家視角關鍵字生成 (對每個 attribute) │ +│ → 產出: ExpertKeyword[] (關鍵字 + 來源專家 + 來源屬性) │ +│ ↓ │ +│ Step 2: 描述生成 (對每個 keyword) │ +│ → 產出: ExpertTransformationDescription[] │ +└─────────────────────────────────────────────────────────────────────┘ +``` + +--- + +## 三、Attribute Agent 詳細流程 + +### 3.1 流程架構 + +``` +用戶查詢 (Query) + ↓ +┌─────────────────────────────────────────────┐ +│ Step 0: 類別分析 (Category Mode 決定) │ +├─────────────────────────────────────────────┤ +│ 輸入: query, suggested_category_count │ +│ 處理: │ +│ - FIXED_ONLY: 使用 4 個固定類別 │ +│ - FIXED_PLUS_CUSTOM: 固定 + 用戶自訂 │ +│ - FIXED_PLUS_DYNAMIC: 固定 + LLM 推薦 │ +│ - CUSTOM_ONLY: 僅 LLM 推薦 │ +│ - DYNAMIC_AUTO: 純 LLM 推薦 (預設) │ +│ 輸出: Step0Result (recommended categories) │ +└─────────────────────────────────────────────┘ + ↓ +┌─────────────────────────────────────────────┐ +│ Step 1: 屬性列表生成 (Attributes) │ +├─────────────────────────────────────────────┤ +│ 輸入: query, final_categories │ +│ LLM 處理: │ +│ - 分析 query 在各類別下的屬性 │ +│ - 每個類別生成 3-5 個屬性 │ +│ 輸出: DynamicStep1Result │ +└─────────────────────────────────────────────┘ + ↓ +┌─────────────────────────────────────────────┐ +│ Step 2: 關係映射 (Relationships → DAG) │ +├─────────────────────────────────────────────┤ +│ 輸入: query, categories, attributes │ +│ LLM 處理: │ +│ - 分析相鄰類別之間的因果關係 │ +│ - 生成 (source, target) 關係對 │ +│ 輸出: AttributeDAG │ +└─────────────────────────────────────────────┘ +``` + +### 3.2 關鍵輸入變數 + +| 變數 | 來源 | 影響範圍 | 作用 | +|------|------|--------|------| +| `query` | 用戶輸入 | Step 0-2 全部 | 決定分析的物件 | +| `category_mode` | 用戶選擇 | Step 0 | 決定使用哪些類別 | +| `suggested_category_count` | 用戶設定 | Step 0 | LLM 推薦類別的數量 | +| `temperature` | 用戶設定 | Step 0-2 | 控制 LLM 輸出的多樣性 | +| `model` | 用戶選擇 | Step 0-2 | 選擇不同的 LLM 模型 | + +--- + +## 四、Expert Transformation Agent 詳細流程 + +### 4.1 流程架構 + +``` +屬性列表 (attributes from Attribute Agent) + ↓ +┌─────────────────────────────────────────────┐ +│ Step 0: 專家團隊生成 (Expert Generation) │ +├─────────────────────────────────────────────┤ +│ 決定因素: │ +│ - expert_source = 'llm' → LLM 生成 │ +│ - expert_source ∈ ['curated', 'dbpedia', │ +│ 'wikidata'] → 本地檔案隨機選取 │ +│ - 有 custom_experts → 結合 LLM │ +│ │ +│ 輸出: ExpertProfile[] │ +│ [{id, name, domain, perspective}] │ +└─────────────────────────────────────────────┘ + ↓ +┌─────────────────────────────────────────────┐ +│ Step 1: 專家視角關鍵字生成 (Keywords) │ +├─────────────────────────────────────────────┤ +│ 迴圈: for each attribute in attributes: │ +│ LLM 為每個專家生成 keywords_per_expert │ +│ 個關鍵字 │ +│ │ +│ 輸出: ExpertKeyword[] │ +│ [{keyword, expert_id, expert_name, │ +│ source_attribute}] │ +└─────────────────────────────────────────────┘ + ↓ +┌─────────────────────────────────────────────┐ +│ Step 2: 描述生成 (Descriptions) │ +├─────────────────────────────────────────────┤ +│ 迴圈: for each expert_keyword: │ +│ LLM 生成 15-30 字的創新應用描述 │ +│ │ +│ 輸出: ExpertTransformationDescription[] │ +└─────────────────────────────────────────────┘ +``` + +### 4.2 關鍵輸入變數 + +| 變數 | 來源 | 影響範圍 | 作用 | +|------|------|--------|------| +| `expert_source` | 用戶選擇 | Step 0 | 決定專家來源 (llm/curated/dbpedia/wikidata) | +| `expert_count` | 用戶設定 | Step 0 | 專家數量 (2-8) | +| `keywords_per_expert` | 用戶設定 | Step 1 | 每專家每屬性關鍵字數 (1-3) | +| `custom_experts` | 用戶輸入 | Step 0 | 用戶指定的專家名稱 | +| `temperature` | 用戶設定 | Step 0-2 | 控制多樣性 | + +### 4.3 關鍵字生成公式 + +``` +總關鍵字數 = len(attributes) × expert_count × keywords_per_expert + +範例計算: +├─ 3 個屬性 (搬運, 儲存, 展示) +├─ 3 位專家 (會計師, 心理師, 生態學家) +├─ 1 個關鍵字/專家 +└─ = 3 × 3 × 1 = 9 個關鍵字 +``` + +--- + +## 五、關鍵字生成影響因素 + +| 階段 | 影響變數 | 影響程度 | 說明 | +|------|---------|---------|------| +| **屬性生成** | `query` | 極高 | 決定 LLM 分析的語義基礎 | +| | `category_mode` | 高 | 決定類別維度 | +| | `temperature` | 中 | 越高越多樣 | +| | `model` | 中 | 不同模型知識基礎不同 | +| **專家生成** | `expert_source` | 高 | 決定專家來源與品質 | +| | `expert_count` | 中 | 2-8 位專家 | +| | `custom_experts` | 中 | 與 LLM 結合 | +| **關鍵字生成** | `experts[].domain` | 極高 | 直接決定關鍵字視角 | +| | `keywords_per_expert` | 低 | 控制數量 | +| | `source_attribute` | 高 | 決定思考起點 | + +--- + +## 六、耦合度分析 + +### 6.1 高耦合連接 ⚠️ + +| 連接 | 耦合度 | 原因 | 風險 | +|------|--------|------|------| +| Attribute → Expert Transform | 高 | Expert 依賴 Attribute 輸出 | 結構變更需同步修改 | +| Expert 生成 → Keyword 生成 | 高 | domain 直接影響關鍵字 | domain 品質差→關鍵字無關 | +| Prompt → LLM 輸出結構 | 高 | prompt 定義 JSON 格式 | 改 prompt 需改 schema | + +### 6.2 低耦合連接 ✓ + +| 連接 | 耦合度 | 原因 | 優點 | +|------|--------|------|------| +| curated/dbpedia/wikidata | 低 | 獨立本地檔案 | 可單獨更新 | +| SSE 通信格式 | 低 | 標準化解耦 | 向後相容 | +| useAttribute/useExpertTransformation | 低 | 獨立 hook | 可單獨複用 | + +### 6.3 耦合度矩陣 + +| | Attribute | Transformation | Expert Transform | +|----|-----------|---------------|----| +| **Attribute** | - | 低 | 高 | +| **Transformation** | 低 | - | 低 | +| **Expert Transform** | 高 | 低 | - | + +--- + +## 七、專家來源比較 + +| 來源 | 檔案 | 筆數 | Domain 品質 | 特點 | +|------|------|------|------------|------| +| `llm` | - | 動態 | 高 | LLM 根據 query 生成相關專家 | +| `curated` | curated_occupations_zh/en.json | 210 | 高 | 精選職業,含具體領域 | +| `dbpedia` | dbpedia_occupations_en.json | 2164 | 低 | 全是 "Professional Field" | +| `wikidata` | - | - | - | 未實作本地化 | + +--- + +## 八、決策變化追蹤範例 + +``` +Query: "腳踏車" + ↓ +Category Mode: DYNAMIC_AUTO + → LLM 建議 [材料, 功能, 用途, 使用族群] + ↓ +Expert Source: "curated" + → 隨機選取 [外科醫師(醫療與健康), 軟體工程師(資訊科技), 主廚(餐飲與服務)] + ↓ +Attribute "搬運" + Expert "外科醫師" + → LLM 思考: 醫療視角看搬運 + → Keyword: "器官運輸", "急救物流" + ↓ +Description 生成: + → "從急救醫療角度,腳踏車可改良為緊急醫療運輸工具..." +``` + +--- + +## 九、改進建議 + +| 問題 | 現狀 | 建議改進 | +|------|------|---------| +| domain 品質 | DBpedia 全是通用值 | ✅ 已建立精選職業 | +| 重複計算 Expert | 每類別重新生成 | 考慮 Expert 全局化 | +| Temperature 統一 | 整流程同一值 | 可按 Step 分開設定 | +| 缺乏快取 | 每次重新分析 | 加入 Attribute 快取層 | +| 語言支援 | 主要中文 | ✅ 已建立英文版 | + +--- + +## 十、關鍵檔案清單 + +### Backend +- `app/routers/analyze.py` - Attribute Agent 路由 +- `app/routers/expert_transformation.py` - Expert Transformation 路由 +- `app/prompts/step_prompts.py` - Attribute Agent 提示詞 +- `app/prompts/expert_transformation_prompt.py` - Expert Transformation 提示詞 +- `app/services/expert_source_service.py` - 專家來源服務 +- `app/services/llm_service.py` - LLM 調用服務 +- `app/data/curated_occupations_zh.json` - 精選職業(中文) +- `app/data/curated_occupations_en.json` - 精選職業(英文) +- `app/data/dbpedia_occupations_en.json` - DBpedia 職業 + +### Frontend +- `src/App.tsx` - 主狀態管理 +- `src/hooks/useAttribute.ts` - Attribute Agent Hook +- `src/hooks/useExpertTransformation.ts` - Expert Transformation Hook +- `src/components/TransformationInputPanel.tsx` - 轉換控制面板 +- `src/types/index.ts` - 類型定義 diff --git a/backend/app/data/conceptnet_occupations_en.json b/backend/app/data/conceptnet_occupations_en.json new file mode 100644 index 0000000..074294a --- /dev/null +++ b/backend/app/data/conceptnet_occupations_en.json @@ -0,0 +1,9 @@ +{ + "metadata": { + "source": "conceptnet", + "language": "en", + "fetched_at": "2025-12-04T07:26:30.695936+00:00", + "total_count": 0 + }, + "occupations": [] +} \ No newline at end of file diff --git a/backend/app/data/conceptnet_occupations_zh.json b/backend/app/data/conceptnet_occupations_zh.json new file mode 100644 index 0000000..a469269 --- /dev/null +++ b/backend/app/data/conceptnet_occupations_zh.json @@ -0,0 +1,9 @@ +{ + "metadata": { + "source": "conceptnet", + "language": "zh", + "fetched_at": "2025-12-04T07:26:26.994914+00:00", + "total_count": 0 + }, + "occupations": [] +} \ No newline at end of file diff --git a/backend/app/data/curated_occupations_en.json b/backend/app/data/curated_occupations_en.json new file mode 100644 index 0000000..b821282 --- /dev/null +++ b/backend/app/data/curated_occupations_en.json @@ -0,0 +1,216 @@ +{ + "metadata": { + "source": "curated", + "language": "en", + "created_at": "2025-12-04", + "total_count": 210, + "description": "Curated common professional occupations with specific domains" + }, + "occupations": [ + {"name": "Surgeon", "domain": "Healthcare"}, + {"name": "Internist", "domain": "Healthcare"}, + {"name": "Dentist", "domain": "Healthcare"}, + {"name": "Ophthalmologist", "domain": "Healthcare"}, + {"name": "Psychiatrist", "domain": "Healthcare"}, + {"name": "Pediatrician", "domain": "Healthcare"}, + {"name": "Nurse", "domain": "Healthcare"}, + {"name": "Pharmacist", "domain": "Healthcare"}, + {"name": "Clinical Psychologist", "domain": "Healthcare"}, + {"name": "Physical Therapist", "domain": "Healthcare"}, + {"name": "Occupational Therapist", "domain": "Healthcare"}, + {"name": "Nutritionist", "domain": "Healthcare"}, + {"name": "Traditional Chinese Medicine Doctor", "domain": "Healthcare"}, + {"name": "Veterinarian", "domain": "Healthcare"}, + + {"name": "Software Engineer", "domain": "Information Technology"}, + {"name": "Frontend Developer", "domain": "Information Technology"}, + {"name": "Backend Developer", "domain": "Information Technology"}, + {"name": "Data Scientist", "domain": "Information Technology"}, + {"name": "Data Engineer", "domain": "Information Technology"}, + {"name": "Machine Learning Engineer", "domain": "Information Technology"}, + {"name": "Cybersecurity Engineer", "domain": "Information Technology"}, + {"name": "DevOps Engineer", "domain": "Information Technology"}, + {"name": "UI Designer", "domain": "Information Technology"}, + {"name": "UX Designer", "domain": "Information Technology"}, + {"name": "Product Manager", "domain": "Information Technology"}, + {"name": "Systems Analyst", "domain": "Information Technology"}, + {"name": "Network Engineer", "domain": "Information Technology"}, + {"name": "Cloud Architect", "domain": "Information Technology"}, + + {"name": "Accountant", "domain": "Finance & Business"}, + {"name": "Financial Analyst", "domain": "Finance & Business"}, + {"name": "Investment Manager", "domain": "Finance & Business"}, + {"name": "Risk Manager", "domain": "Finance & Business"}, + {"name": "Actuary", "domain": "Finance & Business"}, + {"name": "Bank Manager", "domain": "Finance & Business"}, + {"name": "Securities Analyst", "domain": "Finance & Business"}, + {"name": "Tax Consultant", "domain": "Finance & Business"}, + {"name": "Business Consultant", "domain": "Finance & Business"}, + {"name": "HR Manager", "domain": "Finance & Business"}, + {"name": "Marketing Manager", "domain": "Finance & Business"}, + {"name": "Sales Manager", "domain": "Finance & Business"}, + {"name": "Procurement Manager", "domain": "Finance & Business"}, + {"name": "Entrepreneur", "domain": "Finance & Business"}, + + {"name": "Lawyer", "domain": "Law & Policy"}, + {"name": "Judge", "domain": "Law & Policy"}, + {"name": "Prosecutor", "domain": "Law & Policy"}, + {"name": "Notary", "domain": "Law & Policy"}, + {"name": "Legal Counsel", "domain": "Law & Policy"}, + {"name": "IP Attorney", "domain": "Law & Policy"}, + {"name": "Policy Analyst", "domain": "Law & Policy"}, + {"name": "Diplomat", "domain": "Law & Policy"}, + {"name": "Civil Servant", "domain": "Law & Policy"}, + {"name": "Legislator", "domain": "Law & Policy"}, + {"name": "Mediator", "domain": "Law & Policy"}, + {"name": "Legal Scholar", "domain": "Law & Policy"}, + + {"name": "University Professor", "domain": "Education & Academia"}, + {"name": "High School Teacher", "domain": "Education & Academia"}, + {"name": "Middle School Teacher", "domain": "Education & Academia"}, + {"name": "Elementary School Teacher", "domain": "Education & Academia"}, + {"name": "Preschool Teacher", "domain": "Education & Academia"}, + {"name": "Special Education Teacher", "domain": "Education & Academia"}, + {"name": "Tutor", "domain": "Education & Academia"}, + {"name": "Researcher", "domain": "Education & Academia"}, + {"name": "Librarian", "domain": "Education & Academia"}, + {"name": "Education Administrator", "domain": "Education & Academia"}, + {"name": "Academic Editor", "domain": "Education & Academia"}, + {"name": "Education Consultant", "domain": "Education & Academia"}, + {"name": "Speech Therapist", "domain": "Education & Academia"}, + + {"name": "Painter", "domain": "Arts & Creativity"}, + {"name": "Sculptor", "domain": "Arts & Creativity"}, + {"name": "Musician", "domain": "Arts & Creativity"}, + {"name": "Composer", "domain": "Arts & Creativity"}, + {"name": "Conductor", "domain": "Arts & Creativity"}, + {"name": "Dancer", "domain": "Arts & Creativity"}, + {"name": "Actor", "domain": "Arts & Creativity"}, + {"name": "Film Director", "domain": "Arts & Creativity"}, + {"name": "Screenwriter", "domain": "Arts & Creativity"}, + {"name": "Photographer", "domain": "Arts & Creativity"}, + {"name": "Illustrator", "domain": "Arts & Creativity"}, + {"name": "Animator", "domain": "Arts & Creativity"}, + {"name": "Graphic Designer", "domain": "Arts & Creativity"}, + {"name": "Fashion Designer", "domain": "Arts & Creativity"}, + {"name": "Jewelry Designer", "domain": "Arts & Creativity"}, + + {"name": "Mechanical Engineer", "domain": "Engineering & Manufacturing"}, + {"name": "Electrical Engineer", "domain": "Engineering & Manufacturing"}, + {"name": "Electronics Engineer", "domain": "Engineering & Manufacturing"}, + {"name": "Chemical Engineer", "domain": "Engineering & Manufacturing"}, + {"name": "Materials Engineer", "domain": "Engineering & Manufacturing"}, + {"name": "Industrial Engineer", "domain": "Engineering & Manufacturing"}, + {"name": "Automation Engineer", "domain": "Engineering & Manufacturing"}, + {"name": "Quality Control Engineer", "domain": "Engineering & Manufacturing"}, + {"name": "Process Engineer", "domain": "Engineering & Manufacturing"}, + {"name": "R&D Engineer", "domain": "Engineering & Manufacturing"}, + {"name": "Production Manager", "domain": "Engineering & Manufacturing"}, + {"name": "Factory Manager", "domain": "Engineering & Manufacturing"}, + {"name": "Technician", "domain": "Engineering & Manufacturing"}, + + {"name": "Architect", "domain": "Architecture & Space"}, + {"name": "Interior Designer", "domain": "Architecture & Space"}, + {"name": "Landscape Designer", "domain": "Architecture & Space"}, + {"name": "Urban Planner", "domain": "Architecture & Space"}, + {"name": "Structural Engineer", "domain": "Architecture & Space"}, + {"name": "Civil Engineer", "domain": "Architecture & Space"}, + {"name": "Construction Engineer", "domain": "Architecture & Space"}, + {"name": "Site Supervisor", "domain": "Architecture & Space"}, + {"name": "Surveyor", "domain": "Architecture & Space"}, + {"name": "Architectural Drafter", "domain": "Architecture & Space"}, + {"name": "Exhibition Designer", "domain": "Architecture & Space"}, + {"name": "Lighting Designer", "domain": "Architecture & Space"}, + + {"name": "Journalist", "domain": "Media & Communications"}, + {"name": "News Anchor", "domain": "Media & Communications"}, + {"name": "Editor", "domain": "Media & Communications"}, + {"name": "Copy Editor", "domain": "Media & Communications"}, + {"name": "Video Editor", "domain": "Media & Communications"}, + {"name": "PR Specialist", "domain": "Media & Communications"}, + {"name": "Advertising Planner", "domain": "Media & Communications"}, + {"name": "Social Media Manager", "domain": "Media & Communications"}, + {"name": "Content Creator", "domain": "Media & Communications"}, + {"name": "Podcast Host", "domain": "Media & Communications"}, + {"name": "Publisher", "domain": "Media & Communications"}, + {"name": "Translator", "domain": "Media & Communications"}, + {"name": "Interpreter", "domain": "Media & Communications"}, + + {"name": "Agronomist", "domain": "Agriculture & Environment"}, + {"name": "Horticulturist", "domain": "Agriculture & Environment"}, + {"name": "Livestock Specialist", "domain": "Agriculture & Environment"}, + {"name": "Aquaculture Specialist", "domain": "Agriculture & Environment"}, + {"name": "Environmental Engineer", "domain": "Agriculture & Environment"}, + {"name": "Ecologist", "domain": "Agriculture & Environment"}, + {"name": "Forest Ranger", "domain": "Agriculture & Environment"}, + {"name": "Meteorologist", "domain": "Agriculture & Environment"}, + {"name": "Geologist", "domain": "Agriculture & Environment"}, + {"name": "Environmental Inspector", "domain": "Agriculture & Environment"}, + {"name": "Sustainability Consultant", "domain": "Agriculture & Environment"}, + {"name": "Organic Farmer", "domain": "Agriculture & Environment"}, + + {"name": "Executive Chef", "domain": "Hospitality & Service"}, + {"name": "Pastry Chef", "domain": "Hospitality & Service"}, + {"name": "Bartender", "domain": "Hospitality & Service"}, + {"name": "Sommelier", "domain": "Hospitality & Service"}, + {"name": "Restaurant Manager", "domain": "Hospitality & Service"}, + {"name": "Hotel Manager", "domain": "Hospitality & Service"}, + {"name": "Travel Planner", "domain": "Hospitality & Service"}, + {"name": "Tour Guide", "domain": "Hospitality & Service"}, + {"name": "Barista", "domain": "Hospitality & Service"}, + {"name": "Food Critic", "domain": "Hospitality & Service"}, + {"name": "Wedding Planner", "domain": "Hospitality & Service"}, + {"name": "Event Planner", "domain": "Hospitality & Service"}, + + {"name": "Sports Coach", "domain": "Sports & Fitness"}, + {"name": "Personal Trainer", "domain": "Sports & Fitness"}, + {"name": "Yoga Instructor", "domain": "Sports & Fitness"}, + {"name": "Athletic Trainer", "domain": "Sports & Fitness"}, + {"name": "Physical Education Teacher", "domain": "Sports & Fitness"}, + {"name": "Sports Psychologist", "domain": "Sports & Fitness"}, + {"name": "Sports Nutritionist", "domain": "Sports & Fitness"}, + {"name": "Professional Athlete", "domain": "Sports & Fitness"}, + {"name": "Referee", "domain": "Sports & Fitness"}, + {"name": "Strength Coach", "domain": "Sports & Fitness"}, + {"name": "Sports Agent", "domain": "Sports & Fitness"}, + + {"name": "Social Worker", "domain": "Social Services"}, + {"name": "Counselor", "domain": "Social Services"}, + {"name": "Guidance Counselor", "domain": "Social Services"}, + {"name": "Volunteer Coordinator", "domain": "Social Services"}, + {"name": "Nonprofit Manager", "domain": "Social Services"}, + {"name": "Community Organizer", "domain": "Social Services"}, + {"name": "Elderly Care Worker", "domain": "Social Services"}, + {"name": "Youth Counselor", "domain": "Social Services"}, + {"name": "Family Therapist", "domain": "Social Services"}, + {"name": "Career Counselor", "domain": "Social Services"}, + {"name": "Addiction Counselor", "domain": "Social Services"}, + + {"name": "Pilot", "domain": "Transportation & Logistics"}, + {"name": "Ship Captain", "domain": "Transportation & Logistics"}, + {"name": "Train Operator", "domain": "Transportation & Logistics"}, + {"name": "Air Traffic Controller", "domain": "Transportation & Logistics"}, + {"name": "Logistics Manager", "domain": "Transportation & Logistics"}, + {"name": "Supply Chain Manager", "domain": "Transportation & Logistics"}, + {"name": "Warehouse Manager", "domain": "Transportation & Logistics"}, + {"name": "Customs Broker", "domain": "Transportation & Logistics"}, + {"name": "Traffic Engineer", "domain": "Transportation & Logistics"}, + {"name": "Port Authority Officer", "domain": "Transportation & Logistics"}, + + {"name": "Physicist", "domain": "Scientific Research"}, + {"name": "Chemist", "domain": "Scientific Research"}, + {"name": "Biologist", "domain": "Scientific Research"}, + {"name": "Astronomer", "domain": "Scientific Research"}, + {"name": "Mathematician", "domain": "Scientific Research"}, + {"name": "Statistician", "domain": "Scientific Research"}, + {"name": "Geneticist", "domain": "Scientific Research"}, + {"name": "Neuroscientist", "domain": "Scientific Research"}, + {"name": "Oceanographer", "domain": "Scientific Research"}, + {"name": "Archaeologist", "domain": "Scientific Research"}, + {"name": "Anthropologist", "domain": "Scientific Research"}, + {"name": "Sociologist", "domain": "Scientific Research"}, + {"name": "Economist", "domain": "Scientific Research"}, + {"name": "Historian", "domain": "Scientific Research"}, + {"name": "Philosopher", "domain": "Scientific Research"} + ] +} diff --git a/backend/app/data/curated_occupations_zh.json b/backend/app/data/curated_occupations_zh.json new file mode 100644 index 0000000..55b2b30 --- /dev/null +++ b/backend/app/data/curated_occupations_zh.json @@ -0,0 +1,216 @@ +{ + "metadata": { + "source": "curated", + "language": "zh", + "created_at": "2025-12-04", + "total_count": 210, + "description": "精選常見專家職業,含具體專業領域" + }, + "occupations": [ + {"name": "外科醫師", "domain": "醫療與健康"}, + {"name": "內科醫師", "domain": "醫療與健康"}, + {"name": "牙醫師", "domain": "醫療與健康"}, + {"name": "眼科醫師", "domain": "醫療與健康"}, + {"name": "精神科醫師", "domain": "醫療與健康"}, + {"name": "小兒科醫師", "domain": "醫療與健康"}, + {"name": "護理師", "domain": "醫療與健康"}, + {"name": "藥師", "domain": "醫療與健康"}, + {"name": "臨床心理師", "domain": "醫療與健康"}, + {"name": "物理治療師", "domain": "醫療與健康"}, + {"name": "職能治療師", "domain": "醫療與健康"}, + {"name": "營養師", "domain": "醫療與健康"}, + {"name": "中醫師", "domain": "醫療與健康"}, + {"name": "獸醫師", "domain": "醫療與健康"}, + + {"name": "軟體工程師", "domain": "資訊科技"}, + {"name": "前端工程師", "domain": "資訊科技"}, + {"name": "後端工程師", "domain": "資訊科技"}, + {"name": "資料科學家", "domain": "資訊科技"}, + {"name": "資料工程師", "domain": "資訊科技"}, + {"name": "機器學習工程師", "domain": "資訊科技"}, + {"name": "資安工程師", "domain": "資訊科技"}, + {"name": "DevOps工程師", "domain": "資訊科技"}, + {"name": "UI設計師", "domain": "資訊科技"}, + {"name": "UX設計師", "domain": "資訊科技"}, + {"name": "產品經理", "domain": "資訊科技"}, + {"name": "系統分析師", "domain": "資訊科技"}, + {"name": "網路工程師", "domain": "資訊科技"}, + {"name": "雲端架構師", "domain": "資訊科技"}, + + {"name": "會計師", "domain": "金融與商業"}, + {"name": "財務分析師", "domain": "金融與商業"}, + {"name": "投資經理", "domain": "金融與商業"}, + {"name": "風險管理師", "domain": "金融與商業"}, + {"name": "精算師", "domain": "金融與商業"}, + {"name": "銀行經理", "domain": "金融與商業"}, + {"name": "證券分析師", "domain": "金融與商業"}, + {"name": "稅務顧問", "domain": "金融與商業"}, + {"name": "企業顧問", "domain": "金融與商業"}, + {"name": "人資經理", "domain": "金融與商業"}, + {"name": "行銷經理", "domain": "金融與商業"}, + {"name": "業務經理", "domain": "金融與商業"}, + {"name": "採購經理", "domain": "金融與商業"}, + {"name": "創業家", "domain": "金融與商業"}, + + {"name": "律師", "domain": "法律與政策"}, + {"name": "法官", "domain": "法律與政策"}, + {"name": "檢察官", "domain": "法律與政策"}, + {"name": "公證人", "domain": "法律與政策"}, + {"name": "法務專員", "domain": "法律與政策"}, + {"name": "智財律師", "domain": "法律與政策"}, + {"name": "政策分析師", "domain": "法律與政策"}, + {"name": "外交官", "domain": "法律與政策"}, + {"name": "公務員", "domain": "法律與政策"}, + {"name": "立法委員", "domain": "法律與政策"}, + {"name": "調解員", "domain": "法律與政策"}, + {"name": "法律學者", "domain": "法律與政策"}, + + {"name": "大學教授", "domain": "教育與學術"}, + {"name": "高中教師", "domain": "教育與學術"}, + {"name": "國中教師", "domain": "教育與學術"}, + {"name": "小學教師", "domain": "教育與學術"}, + {"name": "幼教老師", "domain": "教育與學術"}, + {"name": "特教老師", "domain": "教育與學術"}, + {"name": "補習班老師", "domain": "教育與學術"}, + {"name": "研究員", "domain": "教育與學術"}, + {"name": "圖書館員", "domain": "教育與學術"}, + {"name": "教育行政人員", "domain": "教育與學術"}, + {"name": "學術編輯", "domain": "教育與學術"}, + {"name": "教育顧問", "domain": "教育與學術"}, + {"name": "語言治療師", "domain": "教育與學術"}, + + {"name": "畫家", "domain": "藝術與創意"}, + {"name": "雕塑家", "domain": "藝術與創意"}, + {"name": "音樂家", "domain": "藝術與創意"}, + {"name": "作曲家", "domain": "藝術與創意"}, + {"name": "指揮家", "domain": "藝術與創意"}, + {"name": "舞蹈家", "domain": "藝術與創意"}, + {"name": "演員", "domain": "藝術與創意"}, + {"name": "導演", "domain": "藝術與創意"}, + {"name": "編劇", "domain": "藝術與創意"}, + {"name": "攝影師", "domain": "藝術與創意"}, + {"name": "插畫家", "domain": "藝術與創意"}, + {"name": "動畫師", "domain": "藝術與創意"}, + {"name": "平面設計師", "domain": "藝術與創意"}, + {"name": "時尚設計師", "domain": "藝術與創意"}, + {"name": "珠寶設計師", "domain": "藝術與創意"}, + + {"name": "機械工程師", "domain": "工程與製造"}, + {"name": "電機工程師", "domain": "工程與製造"}, + {"name": "電子工程師", "domain": "工程與製造"}, + {"name": "化學工程師", "domain": "工程與製造"}, + {"name": "材料工程師", "domain": "工程與製造"}, + {"name": "工業工程師", "domain": "工程與製造"}, + {"name": "自動化工程師", "domain": "工程與製造"}, + {"name": "品管工程師", "domain": "工程與製造"}, + {"name": "製程工程師", "domain": "工程與製造"}, + {"name": "研發工程師", "domain": "工程與製造"}, + {"name": "生產經理", "domain": "工程與製造"}, + {"name": "工廠廠長", "domain": "工程與製造"}, + {"name": "技師", "domain": "工程與製造"}, + + {"name": "建築師", "domain": "建築與空間"}, + {"name": "室內設計師", "domain": "建築與空間"}, + {"name": "景觀設計師", "domain": "建築與空間"}, + {"name": "都市規劃師", "domain": "建築與空間"}, + {"name": "結構工程師", "domain": "建築與空間"}, + {"name": "土木工程師", "domain": "建築與空間"}, + {"name": "營造工程師", "domain": "建築與空間"}, + {"name": "工地主任", "domain": "建築與空間"}, + {"name": "測量師", "domain": "建築與空間"}, + {"name": "建築繪圖員", "domain": "建築與空間"}, + {"name": "展場設計師", "domain": "建築與空間"}, + {"name": "燈光設計師", "domain": "建築與空間"}, + + {"name": "記者", "domain": "媒體與傳播"}, + {"name": "主播", "domain": "媒體與傳播"}, + {"name": "編輯", "domain": "媒體與傳播"}, + {"name": "文字編輯", "domain": "媒體與傳播"}, + {"name": "影片剪輯師", "domain": "媒體與傳播"}, + {"name": "公關專員", "domain": "媒體與傳播"}, + {"name": "廣告企劃", "domain": "媒體與傳播"}, + {"name": "社群經理", "domain": "媒體與傳播"}, + {"name": "內容創作者", "domain": "媒體與傳播"}, + {"name": "播客主持人", "domain": "媒體與傳播"}, + {"name": "出版人", "domain": "媒體與傳播"}, + {"name": "翻譯師", "domain": "媒體與傳播"}, + {"name": "口譯員", "domain": "媒體與傳播"}, + + {"name": "農藝師", "domain": "農業與環境"}, + {"name": "園藝師", "domain": "農業與環境"}, + {"name": "畜牧專家", "domain": "農業與環境"}, + {"name": "水產養殖師", "domain": "農業與環境"}, + {"name": "環境工程師", "domain": "農業與環境"}, + {"name": "生態學家", "domain": "農業與環境"}, + {"name": "森林保育員", "domain": "農業與環境"}, + {"name": "氣象學家", "domain": "農業與環境"}, + {"name": "地質學家", "domain": "農業與環境"}, + {"name": "環保稽查員", "domain": "農業與環境"}, + {"name": "永續發展顧問", "domain": "農業與環境"}, + {"name": "有機農場主", "domain": "農業與環境"}, + + {"name": "主廚", "domain": "餐飲與服務"}, + {"name": "西點師傅", "domain": "餐飲與服務"}, + {"name": "調酒師", "domain": "餐飲與服務"}, + {"name": "侍酒師", "domain": "餐飲與服務"}, + {"name": "餐廳經理", "domain": "餐飲與服務"}, + {"name": "飯店經理", "domain": "餐飲與服務"}, + {"name": "旅遊規劃師", "domain": "餐飲與服務"}, + {"name": "導遊", "domain": "餐飲與服務"}, + {"name": "咖啡師", "domain": "餐飲與服務"}, + {"name": "美食評論家", "domain": "餐飲與服務"}, + {"name": "婚禮策劃師", "domain": "餐飲與服務"}, + {"name": "活動企劃", "domain": "餐飲與服務"}, + + {"name": "運動教練", "domain": "運動與健身"}, + {"name": "健身教練", "domain": "運動與健身"}, + {"name": "瑜珈老師", "domain": "運動與健身"}, + {"name": "運動防護員", "domain": "運動與健身"}, + {"name": "體育老師", "domain": "運動與健身"}, + {"name": "運動心理師", "domain": "運動與健身"}, + {"name": "運動營養師", "domain": "運動與健身"}, + {"name": "職業運動員", "domain": "運動與健身"}, + {"name": "裁判", "domain": "運動與健身"}, + {"name": "體能訓練師", "domain": "運動與健身"}, + {"name": "運動經紀人", "domain": "運動與健身"}, + + {"name": "社工師", "domain": "社會服務"}, + {"name": "心理諮商師", "domain": "社會服務"}, + {"name": "輔導員", "domain": "社會服務"}, + {"name": "志工協調員", "domain": "社會服務"}, + {"name": "非營利組織經理", "domain": "社會服務"}, + {"name": "社區營造員", "domain": "社會服務"}, + {"name": "長照服務員", "domain": "社會服務"}, + {"name": "青少年輔導員", "domain": "社會服務"}, + {"name": "家庭治療師", "domain": "社會服務"}, + {"name": "職涯諮詢師", "domain": "社會服務"}, + {"name": "戒癮輔導員", "domain": "社會服務"}, + + {"name": "飛行員", "domain": "交通與物流"}, + {"name": "船長", "domain": "交通與物流"}, + {"name": "火車駕駛", "domain": "交通與物流"}, + {"name": "航空管制員", "domain": "交通與物流"}, + {"name": "物流經理", "domain": "交通與物流"}, + {"name": "供應鏈經理", "domain": "交通與物流"}, + {"name": "倉儲經理", "domain": "交通與物流"}, + {"name": "報關員", "domain": "交通與物流"}, + {"name": "交通工程師", "domain": "交通與物流"}, + {"name": "港務人員", "domain": "交通與物流"}, + + {"name": "物理學家", "domain": "科學研究"}, + {"name": "化學家", "domain": "科學研究"}, + {"name": "生物學家", "domain": "科學研究"}, + {"name": "天文學家", "domain": "科學研究"}, + {"name": "數學家", "domain": "科學研究"}, + {"name": "統計學家", "domain": "科學研究"}, + {"name": "基因學家", "domain": "科學研究"}, + {"name": "神經科學家", "domain": "科學研究"}, + {"name": "海洋學家", "domain": "科學研究"}, + {"name": "考古學家", "domain": "科學研究"}, + {"name": "人類學家", "domain": "科學研究"}, + {"name": "社會學家", "domain": "科學研究"}, + {"name": "經濟學家", "domain": "科學研究"}, + {"name": "歷史學家", "domain": "科學研究"}, + {"name": "哲學家", "domain": "科學研究"} + ] +} diff --git a/backend/app/data/dbpedia_occupations_en.json b/backend/app/data/dbpedia_occupations_en.json new file mode 100644 index 0000000..fdf43da --- /dev/null +++ b/backend/app/data/dbpedia_occupations_en.json @@ -0,0 +1,8666 @@ +{ + "metadata": { + "source": "dbpedia", + "language": "en", + "fetched_at": "2025-12-04T07:42:55.917109+00:00", + "total_count": 2164 + }, + "occupations": [ + { + "name": "68W", + "domain": "Professional Field" + }, + { + "name": "A2 (theater)", + "domain": "Professional Field" + }, + { + "name": "AFAB queen", + "domain": "Professional Field" + }, + { + "name": "ALJ", + "domain": "Professional Field" + }, + { + "name": "API writer", + "domain": "Professional Field" + }, + { + "name": "Abbé", + "domain": "Professional Field" + }, + { + "name": "Able seaman", + "domain": "Professional Field" + }, + { + "name": "Abortion doula", + "domain": "Professional Field" + }, + { + "name": "Absentee business owner", + "domain": "Professional Field" + }, + { + "name": "Absentee landlord", + "domain": "Professional Field" + }, + { + "name": "Academic", + "domain": "Professional Field" + }, + { + "name": "Academic advising", + "domain": "Professional Field" + }, + { + "name": "Accelerator physicist", + "domain": "Professional Field" + }, + { + "name": "Account manager", + "domain": "Professional Field" + }, + { + "name": "Accountant", + "domain": "Professional Field" + }, + { + "name": "Accounting analyst", + "domain": "Professional Field" + }, + { + "name": "Acting coach", + "domain": "Professional Field" + }, + { + "name": "Acting instructor", + "domain": "Professional Field" + }, + { + "name": "Actor", + "domain": "Professional Field" + }, + { + "name": "Actor-manager", + "domain": "Professional Field" + }, + { + "name": "Actress", + "domain": "Professional Field" + }, + { + "name": "Actuary", + "domain": "Professional Field" + }, + { + "name": "Acupuncturist", + "domain": "Professional Field" + }, + { + "name": "Adel (official)", + "domain": "Professional Field" + }, + { + "name": "Adjunct professor", + "domain": "Professional Field" + }, + { + "name": "Administrative and Diplomatic Officer", + "domain": "Professional Field" + }, + { + "name": "Administrative assistant", + "domain": "Professional Field" + }, + { + "name": "Administrative law judge", + "domain": "Professional Field" + }, + { + "name": "Adult educator", + "domain": "Professional Field" + }, + { + "name": "Adult-gerontology nurse practitioner", + "domain": "Professional Field" + }, + { + "name": "Advanced Technician in Aviation non civil servant", + "domain": "Professional Field" + }, + { + "name": "Advanced practice nurse", + "domain": "Professional Field" + }, + { + "name": "Adviser", + "domain": "Professional Field" + }, + { + "name": "Aerial photographer", + "domain": "Professional Field" + }, + { + "name": "Aerialist", + "domain": "Professional Field" + }, + { + "name": "Aeronautical operations technician", + "domain": "Professional Field" + }, + { + "name": "Aerospace engineer", + "domain": "Professional Field" + }, + { + "name": "Africanist (discipline)", + "domain": "Professional Field" + }, + { + "name": "Agricultural engineer", + "domain": "Professional Field" + }, + { + "name": "Agriculturist", + "domain": "Professional Field" + }, + { + "name": "Aikidoka", + "domain": "Professional Field" + }, + { + "name": "Air observer", + "domain": "Professional Field" + }, + { + "name": "Air traffic controller", + "domain": "Professional Field" + }, + { + "name": "Air warfare officer – command, control and communications", + "domain": "Professional Field" + }, + { + "name": "Aircraft maintenance technician", + "domain": "Professional Field" + }, + { + "name": "Aircraft marshalling", + "domain": "Professional Field" + }, + { + "name": "Aircraft pilot", + "domain": "Professional Field" + }, + { + "name": "Airman", + "domain": "Professional Field" + }, + { + "name": "Airsmith", + "domain": "Professional Field" + }, + { + "name": "Akhund", + "domain": "Professional Field" + }, + { + "name": "Alanorarius", + "domain": "Professional Field" + }, + { + "name": "Almoner", + "domain": "Professional Field" + }, + { + "name": "Alpine skier", + "domain": "Professional Field" + }, + { + "name": "Alta cappella", + "domain": "Professional Field" + }, + { + "name": "Alternative model", + "domain": "Professional Field" + }, + { + "name": "Ama (diving)", + "domain": "Professional Field" + }, + { + "name": "Amah (occupation)", + "domain": "Professional Field" + }, + { + "name": "Andrologist", + "domain": "Professional Field" + }, + { + "name": "Animal nutritionist", + "domain": "Professional Field" + }, + { + "name": "Animal painter", + "domain": "Professional Field" + }, + { + "name": "Animalier", + "domain": "Professional Field" + }, + { + "name": "Animation department", + "domain": "Professional Field" + }, + { + "name": "Animator", + "domain": "Professional Field" + }, + { + "name": "Anime composer", + "domain": "Professional Field" + }, + { + "name": "Announcer", + "domain": "Professional Field" + }, + { + "name": "Anthropologist", + "domain": "Professional Field" + }, + { + "name": "Antiquarian", + "domain": "Professional Field" + }, + { + "name": "Aoidos", + "domain": "Professional Field" + }, + { + "name": "Apologist", + "domain": "Professional Field" + }, + { + "name": "Apparatchik", + "domain": "Professional Field" + }, + { + "name": "Apparitor", + "domain": "Professional Field" + }, + { + "name": "Application analyst", + "domain": "Professional Field" + }, + { + "name": "Applied mathematician", + "domain": "Professional Field" + }, + { + "name": "Applied science technologist", + "domain": "Professional Field" + }, + { + "name": "Appraiser", + "domain": "Professional Field" + }, + { + "name": "Approved social worker", + "domain": "Professional Field" + }, + { + "name": "Aquanaut", + "domain": "Professional Field" + }, + { + "name": "Aquarist", + "domain": "Professional Field" + }, + { + "name": "Arabber", + "domain": "Professional Field" + }, + { + "name": "Arabist", + "domain": "Professional Field" + }, + { + "name": "Arbiter (chess)", + "domain": "Professional Field" + }, + { + "name": "Arborist", + "domain": "Professional Field" + }, + { + "name": "Archaeologist", + "domain": "Professional Field" + }, + { + "name": "Archchaplain", + "domain": "Professional Field" + }, + { + "name": "Archdruid", + "domain": "Professional Field" + }, + { + "name": "Architect", + "domain": "Professional Field" + }, + { + "name": "Architectural designer", + "domain": "Professional Field" + }, + { + "name": "Architectural engineer (PE)", + "domain": "Professional Field" + }, + { + "name": "Architectural historian", + "domain": "Professional Field" + }, + { + "name": "Architectural illustrator", + "domain": "Professional Field" + }, + { + "name": "Architectural photographers", + "domain": "Professional Field" + }, + { + "name": "Architectural technologist", + "domain": "Professional Field" + }, + { + "name": "Archivist", + "domain": "Professional Field" + }, + { + "name": "Armed-forces artificer", + "domain": "Professional Field" + }, + { + "name": "Armourer", + "domain": "Professional Field" + }, + { + "name": "Aromachologist", + "domain": "Professional Field" + }, + { + "name": "Arriero", + "domain": "Professional Field" + }, + { + "name": "Art agent", + "domain": "Professional Field" + }, + { + "name": "Art critic", + "domain": "Professional Field" + }, + { + "name": "Art curator", + "domain": "Professional Field" + }, + { + "name": "Art dealer", + "domain": "Professional Field" + }, + { + "name": "Art director", + "domain": "Professional Field" + }, + { + "name": "Art handler", + "domain": "Professional Field" + }, + { + "name": "Art historian", + "domain": "Professional Field" + }, + { + "name": "Art theorist", + "domain": "Professional Field" + }, + { + "name": "Articled clerk", + "domain": "Professional Field" + }, + { + "name": "Artisan", + "domain": "Professional Field" + }, + { + "name": "Artist's Assistant", + "domain": "Professional Field" + }, + { + "name": "Artistic director", + "domain": "Professional Field" + }, + { + "name": "Artistic gymnast", + "domain": "Professional Field" + }, + { + "name": "Assayer", + "domain": "Professional Field" + }, + { + "name": "Assistant director", + "domain": "Professional Field" + }, + { + "name": "Assistant inspector general of prisons", + "domain": "Professional Field" + }, + { + "name": "Assistant manager", + "domain": "Professional Field" + }, + { + "name": "Assistant pastor", + "domain": "Professional Field" + }, + { + "name": "Assistant physician", + "domain": "Professional Field" + }, + { + "name": "Assistant referee (association football)", + "domain": "Professional Field" + }, + { + "name": "Assistant teacher", + "domain": "Professional Field" + }, + { + "name": "Association football player", + "domain": "Professional Field" + }, + { + "name": "Assyriologist", + "domain": "Professional Field" + }, + { + "name": "Astrobiologist", + "domain": "Professional Field" + }, + { + "name": "Astrologer", + "domain": "Professional Field" + }, + { + "name": "Astronaut-politician", + "domain": "Professional Field" + }, + { + "name": "Astronomer", + "domain": "Professional Field" + }, + { + "name": "Astrophotographer", + "domain": "Professional Field" + }, + { + "name": "Athlete", + "domain": "Professional Field" + }, + { + "name": "Athletic director", + "domain": "Professional Field" + }, + { + "name": "Atomic spies", + "domain": "Professional Field" + }, + { + "name": "Auctioneer", + "domain": "Professional Field" + }, + { + "name": "Audio engineer", + "domain": "Professional Field" + }, + { + "name": "Audiology", + "domain": "Professional Field" + }, + { + "name": "Auditor", + "domain": "Professional Field" + }, + { + "name": "Auto mechanic", + "domain": "Professional Field" + }, + { + "name": "Automation technician", + "domain": "Professional Field" + }, + { + "name": "Automobile repair technician", + "domain": "Professional Field" + }, + { + "name": "Automobile salesperson", + "domain": "Professional Field" + }, + { + "name": "Av Beit Din", + "domain": "Professional Field" + }, + { + "name": "Avian veterinarian", + "domain": "Professional Field" + }, + { + "name": "Aviation boatswain's mate", + "domain": "Professional Field" + }, + { + "name": "Aviation electronics technician (United States Navy)", + "domain": "Professional Field" + }, + { + "name": "Aviation medical examiner", + "domain": "Professional Field" + }, + { + "name": "Aviation structural mechanic", + "domain": "Professional Field" + }, + { + "name": "Background artist", + "domain": "Professional Field" + }, + { + "name": "Bacteriologist", + "domain": "Professional Field" + }, + { + "name": "Bail bondsman", + "domain": "Professional Field" + }, + { + "name": "Bailiff", + "domain": "Professional Field" + }, + { + "name": "Baker", + "domain": "Professional Field" + }, + { + "name": "Bakuto", + "domain": "Professional Field" + }, + { + "name": "Balanit", + "domain": "Professional Field" + }, + { + "name": "Ballerina", + "domain": "Professional Field" + }, + { + "name": "Ballet dancer", + "domain": "Professional Field" + }, + { + "name": "Ballet master", + "domain": "Professional Field" + }, + { + "name": "Bandleader", + "domain": "Professional Field" + }, + { + "name": "Bandmaster", + "domain": "Professional Field" + }, + { + "name": "Bank examiner", + "domain": "Professional Field" + }, + { + "name": "Bank officer", + "domain": "Professional Field" + }, + { + "name": "Bank teller", + "domain": "Professional Field" + }, + { + "name": "Banker", + "domain": "Professional Field" + }, + { + "name": "Banksman", + "domain": "Professional Field" + }, + { + "name": "Barback", + "domain": "Professional Field" + }, + { + "name": "Barbapedana", + "domain": "Professional Field" + }, + { + "name": "Barber", + "domain": "Professional Field" + }, + { + "name": "Barbouzes", + "domain": "Professional Field" + }, + { + "name": "Barefoot lawyer", + "domain": "Professional Field" + }, + { + "name": "Bargirl", + "domain": "Professional Field" + }, + { + "name": "Barista", + "domain": "Professional Field" + }, + { + "name": "Barker (occupation)", + "domain": "Professional Field" + }, + { + "name": "Barracks emperor", + "domain": "Professional Field" + }, + { + "name": "Barrelman", + "domain": "Professional Field" + }, + { + "name": "Barrow boy", + "domain": "Professional Field" + }, + { + "name": "Bartender", + "domain": "Professional Field" + }, + { + "name": "Baseball player", + "domain": "Professional Field" + }, + { + "name": "Basketball player", + "domain": "Professional Field" + }, + { + "name": "Bazaari", + "domain": "Professional Field" + }, + { + "name": "Beamter", + "domain": "Professional Field" + }, + { + "name": "Beauty YouTuber", + "domain": "Professional Field" + }, + { + "name": "Bedel", + "domain": "Professional Field" + }, + { + "name": "Beekeeper", + "domain": "Professional Field" + }, + { + "name": "Beer sommelier", + "domain": "Professional Field" + }, + { + "name": "Befriender", + "domain": "Professional Field" + }, + { + "name": "Bellhop", + "domain": "Professional Field" + }, + { + "name": "Bench jeweler", + "domain": "Professional Field" + }, + { + "name": "Bendahara", + "domain": "Professional Field" + }, + { + "name": "Benshi", + "domain": "Professional Field" + }, + { + "name": "Bergmeister", + "domain": "Professional Field" + }, + { + "name": "Bespoke tailor", + "domain": "Professional Field" + }, + { + "name": "Best boy", + "domain": "Professional Field" + }, + { + "name": "Beta reader", + "domain": "Professional Field" + }, + { + "name": "Betel nut beauty", + "domain": "Professional Field" + }, + { + "name": "Bhagat", + "domain": "Professional Field" + }, + { + "name": "Bhumka", + "domain": "Professional Field" + }, + { + "name": "Biblical grammarians", + "domain": "Professional Field" + }, + { + "name": "Bibliographer", + "domain": "Professional Field" + }, + { + "name": "Bibliometrician", + "domain": "Professional Field" + }, + { + "name": "Bicycle mechanic", + "domain": "Professional Field" + }, + { + "name": "Bikini barista", + "domain": "Professional Field" + }, + { + "name": "Biochemist", + "domain": "Professional Field" + }, + { + "name": "Biological pharmacist", + "domain": "Professional Field" + }, + { + "name": "Biologist", + "domain": "Professional Field" + }, + { + "name": "Biomedical equipment technician", + "domain": "Professional Field" + }, + { + "name": "Biomedical scientist", + "domain": "Professional Field" + }, + { + "name": "Biostatistician", + "domain": "Professional Field" + }, + { + "name": "Black hat (computer security)", + "domain": "Professional Field" + }, + { + "name": "Bladesmith", + "domain": "Professional Field" + }, + { + "name": "Blogger", + "domain": "Professional Field" + }, + { + "name": "Body piercer", + "domain": "Professional Field" + }, + { + "name": "Bodyguard", + "domain": "Professional Field" + }, + { + "name": "Boilermaker", + "domain": "Professional Field" + }, + { + "name": "Bondage rigger", + "domain": "Professional Field" + }, + { + "name": "Book peddler", + "domain": "Professional Field" + }, + { + "name": "Bookbinder", + "domain": "Professional Field" + }, + { + "name": "Bookmaker", + "domain": "Professional Field" + }, + { + "name": "Boom operator (media)", + "domain": "Professional Field" + }, + { + "name": "Botanist", + "domain": "Professional Field" + }, + { + "name": "Bounty hunter", + "domain": "Professional Field" + }, + { + "name": "Bow maker", + "domain": "Professional Field" + }, + { + "name": "Bowler (ten-pin)", + "domain": "Professional Field" + }, + { + "name": "Bowyer", + "domain": "Professional Field" + }, + { + "name": "Boxer (boxing)", + "domain": "Professional Field" + }, + { + "name": "Boxing judge", + "domain": "Professional Field" + }, + { + "name": "Branch manager", + "domain": "Professional Field" + }, + { + "name": "Brazilianist", + "domain": "Professional Field" + }, + { + "name": "Breakdancer", + "domain": "Professional Field" + }, + { + "name": "Breeder", + "domain": "Professional Field" + }, + { + "name": "Brehon", + "domain": "Professional Field" + }, + { + "name": "Brewmaster", + "domain": "Professional Field" + }, + { + "name": "Bricklayer", + "domain": "Professional Field" + }, + { + "name": "Bridge tender", + "domain": "Professional Field" + }, + { + "name": "Brigh Brigaid", + "domain": "Professional Field" + }, + { + "name": "Broadcast designer", + "domain": "Professional Field" + }, + { + "name": "Broadcast engineering", + "domain": "Professional Field" + }, + { + "name": "Broker", + "domain": "Professional Field" + }, + { + "name": "Broker-dealer", + "domain": "Professional Field" + }, + { + "name": "Broomsquire", + "domain": "Professional Field" + }, + { + "name": "Bryozoologist", + "domain": "Professional Field" + }, + { + "name": "Building engineer", + "domain": "Professional Field" + }, + { + "name": "Building estimator", + "domain": "Professional Field" + }, + { + "name": "Building inspector", + "domain": "Professional Field" + }, + { + "name": "Bullfighter", + "domain": "Professional Field" + }, + { + "name": "Bureaucrat", + "domain": "Professional Field" + }, + { + "name": "Bus conductor", + "domain": "Professional Field" + }, + { + "name": "Bus driver", + "domain": "Professional Field" + }, + { + "name": "Bus monitor", + "domain": "Professional Field" + }, + { + "name": "Business analyst", + "domain": "Professional Field" + }, + { + "name": "Business broker", + "domain": "Professional Field" + }, + { + "name": "Business consultant", + "domain": "Professional Field" + }, + { + "name": "Business executive", + "domain": "Professional Field" + }, + { + "name": "Business magnate", + "domain": "Professional Field" + }, + { + "name": "Business manager", + "domain": "Professional Field" + }, + { + "name": "Business mediator", + "domain": "Professional Field" + }, + { + "name": "Business theorist", + "domain": "Professional Field" + }, + { + "name": "Businessperson", + "domain": "Professional Field" + }, + { + "name": "Busser", + "domain": "Professional Field" + }, + { + "name": "Butcher", + "domain": "Professional Field" + }, + { + "name": "Butler", + "domain": "Professional Field" + }, + { + "name": "Buttero", + "domain": "Professional Field" + }, + { + "name": "Buyer", + "domain": "Professional Field" + }, + { + "name": "CG artist", + "domain": "Professional Field" + }, + { + "name": "CPTE Certified Penetration Testing Engineer", + "domain": "Professional Field" + }, + { + "name": "Cabaretist", + "domain": "Professional Field" + }, + { + "name": "Call girl", + "domain": "Professional Field" + }, + { + "name": "Caller (dancing)", + "domain": "Professional Field" + }, + { + "name": "Calligrapher", + "domain": "Professional Field" + }, + { + "name": "Campaign manager", + "domain": "Professional Field" + }, + { + "name": "Campanologist", + "domain": "Professional Field" + }, + { + "name": "Cancellarii", + "domain": "Professional Field" + }, + { + "name": "Cantor (Christianity)", + "domain": "Professional Field" + }, + { + "name": "Cantore al liuto", + "domain": "Professional Field" + }, + { + "name": "Canut", + "domain": "Professional Field" + }, + { + "name": "Capitoul", + "domain": "Professional Field" + }, + { + "name": "Capsule Communicator", + "domain": "Professional Field" + }, + { + "name": "Car finance", + "domain": "Professional Field" + }, + { + "name": "Carabinier", + "domain": "Professional Field" + }, + { + "name": "Cardiac nursing", + "domain": "Professional Field" + }, + { + "name": "Cardiologist", + "domain": "Professional Field" + }, + { + "name": "Careers advisor", + "domain": "Professional Field" + }, + { + "name": "Caretaker manager", + "domain": "Professional Field" + }, + { + "name": "Caribbeanist", + "domain": "Professional Field" + }, + { + "name": "Caripi", + "domain": "Professional Field" + }, + { + "name": "Carpenter (theatre)", + "domain": "Professional Field" + }, + { + "name": "Cartographer", + "domain": "Professional Field" + }, + { + "name": "Cartoonist", + "domain": "Professional Field" + }, + { + "name": "Caseworker", + "domain": "Professional Field" + }, + { + "name": "Cashier", + "domain": "Professional Field" + }, + { + "name": "Casino host", + "domain": "Professional Field" + }, + { + "name": "Cast member", + "domain": "Professional Field" + }, + { + "name": "Castellan", + "domain": "Professional Field" + }, + { + "name": "Casual courier", + "domain": "Professional Field" + }, + { + "name": "Caucus chair", + "domain": "Professional Field" + }, + { + "name": "Celebrity chef", + "domain": "Professional Field" + }, + { + "name": "Celebrity endorser", + "domain": "Professional Field" + }, + { + "name": "Ceramic engineering", + "domain": "Professional Field" + }, + { + "name": "Certificated bailiff", + "domain": "Professional Field" + }, + { + "name": "Certified Business Manager", + "domain": "Professional Field" + }, + { + "name": "Certified California Municipal Treasurer", + "domain": "Professional Field" + }, + { + "name": "Certified Community Association Manager", + "domain": "Professional Field" + }, + { + "name": "Certified Consulting Meteorologist", + "domain": "Professional Field" + }, + { + "name": "Certified General Accountant", + "domain": "Professional Field" + }, + { + "name": "Certified General Accountants Association of Canada", + "domain": "Professional Field" + }, + { + "name": "Certified Government Financial Manager", + "domain": "Professional Field" + }, + { + "name": "Certified Hotel Administrator", + "domain": "Professional Field" + }, + { + "name": "Certified IRB Professional", + "domain": "Professional Field" + }, + { + "name": "Certified Insurance Counselor", + "domain": "Professional Field" + }, + { + "name": "Certified Internet Web Professional", + "domain": "Professional Field" + }, + { + "name": "Certified MBA", + "domain": "Professional Field" + }, + { + "name": "Certified Management Accountant", + "domain": "Professional Field" + }, + { + "name": "Certified Meeting Professional", + "domain": "Professional Field" + }, + { + "name": "Certified National Accountant", + "domain": "Professional Field" + }, + { + "name": "Certified Practising Accountant", + "domain": "Professional Field" + }, + { + "name": "Certified Professional in Supply Management", + "domain": "Professional Field" + }, + { + "name": "Certified Project Management Professional", + "domain": "Professional Field" + }, + { + "name": "Certified Property Manager", + "domain": "Professional Field" + }, + { + "name": "Certified Public Accountant", + "domain": "Professional Field" + }, + { + "name": "Certified Relocation and Transition Specialist", + "domain": "Professional Field" + }, + { + "name": "Certified Risk Analyst", + "domain": "Professional Field" + }, + { + "name": "Certified Sarbanes-Oxley Professional", + "domain": "Professional Field" + }, + { + "name": "Certified Securities Investment Advisor", + "domain": "Professional Field" + }, + { + "name": "Certified Verbatim Reporter", + "domain": "Professional Field" + }, + { + "name": "Certified anesthesia technician", + "domain": "Professional Field" + }, + { + "name": "Certified anesthesia technologist", + "domain": "Professional Field" + }, + { + "name": "Certified audio engineer", + "domain": "Professional Field" + }, + { + "name": "Certified broadcast networking engineer", + "domain": "Professional Field" + }, + { + "name": "Certified broadcast networking technologist", + "domain": "Professional Field" + }, + { + "name": "Certified broadcast radio engineer", + "domain": "Professional Field" + }, + { + "name": "Certified broadcast technologist", + "domain": "Professional Field" + }, + { + "name": "Certified broadcast television engineer", + "domain": "Professional Field" + }, + { + "name": "Certified diabetes educator", + "domain": "Professional Field" + }, + { + "name": "Certified digital radio broadcast specialist", + "domain": "Professional Field" + }, + { + "name": "Certified engineering technologist", + "domain": "Professional Field" + }, + { + "name": "Certified engineering technician", + "domain": "Professional Field" + }, + { + "name": "Certified forensic computer examiner", + "domain": "Professional Field" + }, + { + "name": "Certified health physicist", + "domain": "Professional Field" + }, + { + "name": "Certified in Financial Forensics", + "domain": "Professional Field" + }, + { + "name": "Certified in neonatal pediatric transport", + "domain": "Professional Field" + }, + { + "name": "Certified information technology professional", + "domain": "Professional Field" + }, + { + "name": "Certified interconnect designer", + "domain": "Professional Field" + }, + { + "name": "Certified management consultant", + "domain": "Professional Field" + }, + { + "name": "Certified measurement and verification professional", + "domain": "Professional Field" + }, + { + "name": "Certified medical reimbursement specialist", + "domain": "Professional Field" + }, + { + "name": "Certified mortgage consultant", + "domain": "Professional Field" + }, + { + "name": "Certified mortgage planner", + "domain": "Professional Field" + }, + { + "name": "Certified nurse-midwife", + "domain": "Professional Field" + }, + { + "name": "Certified penetration testing engineer", + "domain": "Professional Field" + }, + { + "name": "Certified professional broadcast engineer", + "domain": "Professional Field" + }, + { + "name": "Certified radio operator", + "domain": "Professional Field" + }, + { + "name": "Certified registered nurse anesthetist", + "domain": "Professional Field" + }, + { + "name": "Certified resident manager", + "domain": "Professional Field" + }, + { + "name": "Certified senior broadcast radio engineer", + "domain": "Professional Field" + }, + { + "name": "Certified senior broadcast television engineer", + "domain": "Professional Field" + }, + { + "name": "Certified social engineering prevention specialist", + "domain": "Professional Field" + }, + { + "name": "Certified software manager", + "domain": "Professional Field" + }, + { + "name": "Certified teacher", + "domain": "Professional Field" + }, + { + "name": "Certified television operator", + "domain": "Professional Field" + }, + { + "name": "Certified video engineer", + "domain": "Professional Field" + }, + { + "name": "Certified wireless network administrator", + "domain": "Professional Field" + }, + { + "name": "Certified wireless network expert", + "domain": "Professional Field" + }, + { + "name": "Certified wireless security professional", + "domain": "Professional Field" + }, + { + "name": "Chair-maker", + "domain": "Professional Field" + }, + { + "name": "Chamberer", + "domain": "Professional Field" + }, + { + "name": "Chamberlain (office)", + "domain": "Professional Field" + }, + { + "name": "Change management analyst", + "domain": "Professional Field" + }, + { + "name": "Chapman (occupation)", + "domain": "Professional Field" + }, + { + "name": "Character actor", + "domain": "Professional Field" + }, + { + "name": "Charcoal burner", + "domain": "Professional Field" + }, + { + "name": "Chargé de mission", + "domain": "Professional Field" + }, + { + "name": "Chartered Building Surveyor", + "domain": "Professional Field" + }, + { + "name": "Chartered Certified Accountant", + "domain": "Professional Field" + }, + { + "name": "Chartered Cost Accountant", + "domain": "Professional Field" + }, + { + "name": "Chartered Mathematician", + "domain": "Professional Field" + }, + { + "name": "Chartered Statistician", + "domain": "Professional Field" + }, + { + "name": "Chartered Surveyor", + "domain": "Professional Field" + }, + { + "name": "Chartered accountant", + "domain": "Professional Field" + }, + { + "name": "Charwoman", + "domain": "Professional Field" + }, + { + "name": "Cheerleader", + "domain": "Professional Field" + }, + { + "name": "Chef", + "domain": "Professional Field" + }, + { + "name": "Chef de cuisine", + "domain": "Professional Field" + }, + { + "name": "Chef de partie", + "domain": "Professional Field" + }, + { + "name": "Chemical engineer", + "domain": "Professional Field" + }, + { + "name": "Chemical technologist", + "domain": "Professional Field" + }, + { + "name": "Chemist", + "domain": "Professional Field" + }, + { + "name": "Chemist in Training", + "domain": "Professional Field" + }, + { + "name": "Chess player", + "domain": "Professional Field" + }, + { + "name": "Chief Court Mistress", + "domain": "Professional Field" + }, + { + "name": "Chief Scientist of the United States Air Force", + "domain": "Professional Field" + }, + { + "name": "Chief Veterinary Officer (United Kingdom)", + "domain": "Professional Field" + }, + { + "name": "Chief content officer", + "domain": "Professional Field" + }, + { + "name": "Chief executive officer", + "domain": "Professional Field" + }, + { + "name": "Chief financial officer", + "domain": "Professional Field" + }, + { + "name": "Chief happiness officer", + "domain": "Professional Field" + }, + { + "name": "Chief harbourmaster", + "domain": "Professional Field" + }, + { + "name": "Chief information officer", + "domain": "Professional Field" + }, + { + "name": "Chief information security officer", + "domain": "Professional Field" + }, + { + "name": "Chief judge (United States)", + "domain": "Professional Field" + }, + { + "name": "Chief knowledge officer", + "domain": "Professional Field" + }, + { + "name": "Chief mechanical engineer", + "domain": "Professional Field" + }, + { + "name": "Chief of the General Staff (Slovakia)", + "domain": "Professional Field" + }, + { + "name": "Chief operating officer", + "domain": "Professional Field" + }, + { + "name": "Chief physician", + "domain": "Professional Field" + }, + { + "name": "Chief project engineer", + "domain": "Professional Field" + }, + { + "name": "Chief scientific officer", + "domain": "Professional Field" + }, + { + "name": "Chief services officer", + "domain": "Professional Field" + }, + { + "name": "Chief steward", + "domain": "Professional Field" + }, + { + "name": "Chief technology officer", + "domain": "Professional Field" + }, + { + "name": "Child actor", + "domain": "Professional Field" + }, + { + "name": "Child advocacy", + "domain": "Professional Field" + }, + { + "name": "Child and Youth Care", + "domain": "Professional Field" + }, + { + "name": "Child life specialist", + "domain": "Professional Field" + }, + { + "name": "Child model", + "domain": "Professional Field" + }, + { + "name": "Child psychologist", + "domain": "Professional Field" + }, + { + "name": "Children's writer", + "domain": "Professional Field" + }, + { + "name": "Chimney sweep", + "domain": "Professional Field" + }, + { + "name": "China watcher", + "domain": "Professional Field" + }, + { + "name": "Chinese idol", + "domain": "Professional Field" + }, + { + "name": "Chinese intellectualism", + "domain": "Professional Field" + }, + { + "name": "Chocolatier", + "domain": "Professional Field" + }, + { + "name": "Choreographer", + "domain": "Professional Field" + }, + { + "name": "Christian theologian", + "domain": "Professional Field" + }, + { + "name": "Church music in Germany", + "domain": "Professional Field" + }, + { + "name": "Churchwarden", + "domain": "Professional Field" + }, + { + "name": "Cigar maker", + "domain": "Professional Field" + }, + { + "name": "Circuit rider (religious)", + "domain": "Professional Field" + }, + { + "name": "Circus clown", + "domain": "Professional Field" + }, + { + "name": "City manager", + "domain": "Professional Field" + }, + { + "name": "Civil engineer", + "domain": "Professional Field" + }, + { + "name": "Civil law notary", + "domain": "Professional Field" + }, + { + "name": "Civil surgeon", + "domain": "Professional Field" + }, + { + "name": "Claims adjuster", + "domain": "Professional Field" + }, + { + "name": "Cleaner", + "domain": "Professional Field" + }, + { + "name": "Clerical worker", + "domain": "Professional Field" + }, + { + "name": "Clerk", + "domain": "Professional Field" + }, + { + "name": "Clerk (choral)", + "domain": "Professional Field" + }, + { + "name": "Clerk (legislature)", + "domain": "Professional Field" + }, + { + "name": "Clerk of the chapel", + "domain": "Professional Field" + }, + { + "name": "Clerk of the peace", + "domain": "Professional Field" + }, + { + "name": "Climber (climbing)", + "domain": "Professional Field" + }, + { + "name": "Clinic escort", + "domain": "Professional Field" + }, + { + "name": "Clinical Associate (Psychology)", + "domain": "Professional Field" + }, + { + "name": "Clinical biologist", + "domain": "Professional Field" + }, + { + "name": "Clinical nurse specialist", + "domain": "Professional Field" + }, + { + "name": "Clinical professor", + "domain": "Professional Field" + }, + { + "name": "Clinical psychologist", + "domain": "Professional Field" + }, + { + "name": "Clinical research associate", + "domain": "Professional Field" + }, + { + "name": "Clinical research coordinator", + "domain": "Professional Field" + }, + { + "name": "Clinical supervision", + "domain": "Professional Field" + }, + { + "name": "Clinician", + "domain": "Professional Field" + }, + { + "name": "Clockmaker", + "domain": "Professional Field" + }, + { + "name": "Clogmaker", + "domain": "Professional Field" + }, + { + "name": "Cloth merchant", + "domain": "Professional Field" + }, + { + "name": "Cnidariologist", + "domain": "Professional Field" + }, + { + "name": "Co-driver", + "domain": "Professional Field" + }, + { + "name": "Coach (baseball)", + "domain": "Professional Field" + }, + { + "name": "Coach (basketball)", + "domain": "Professional Field" + }, + { + "name": "Coach (ice hockey)", + "domain": "Professional Field" + }, + { + "name": "Coach (sport)", + "domain": "Professional Field" + }, + { + "name": "Coachbuilder", + "domain": "Professional Field" + }, + { + "name": "Coachwork", + "domain": "Professional Field" + }, + { + "name": "Coal merchant", + "domain": "Professional Field" + }, + { + "name": "Coarb", + "domain": "Professional Field" + }, + { + "name": "Cocktail waitress", + "domain": "Professional Field" + }, + { + "name": "Cognitive psychologist", + "domain": "Professional Field" + }, + { + "name": "Coleopterologist", + "domain": "Professional Field" + }, + { + "name": "Collection manager", + "domain": "Professional Field" + }, + { + "name": "College Student Personnel", + "domain": "Professional Field" + }, + { + "name": "Color commentator", + "domain": "Professional Field" + }, + { + "name": "Colorist", + "domain": "Professional Field" + }, + { + "name": "Columnist", + "domain": "Professional Field" + }, + { + "name": "Comedian", + "domain": "Professional Field" + }, + { + "name": "Comics artist", + "domain": "Professional Field" + }, + { + "name": "Comics creator", + "domain": "Professional Field" + }, + { + "name": "Commander (Royal Navy)", + "domain": "Professional Field" + }, + { + "name": "Commercial astronaut", + "domain": "Professional Field" + }, + { + "name": "Commercial director", + "domain": "Professional Field" + }, + { + "name": "Commissaire de police", + "domain": "Professional Field" + }, + { + "name": "Commissionaire", + "domain": "Professional Field" + }, + { + "name": "Commissioner of Crown Lands (Province of Canada)", + "domain": "Professional Field" + }, + { + "name": "Commissioner of the NFL", + "domain": "Professional Field" + }, + { + "name": "Commissioner of the National Football League", + "domain": "Professional Field" + }, + { + "name": "Committee of Canadian Architectural Councils", + "domain": "Professional Field" + }, + { + "name": "Commodity broker", + "domain": "Professional Field" + }, + { + "name": "Common carrier", + "domain": "Professional Field" + }, + { + "name": "Communications manager", + "domain": "Professional Field" + }, + { + "name": "Communications officer", + "domain": "Professional Field" + }, + { + "name": "Communicologist", + "domain": "Professional Field" + }, + { + "name": "Community association manager", + "domain": "Professional Field" + }, + { + "name": "Community health worker", + "domain": "Professional Field" + }, + { + "name": "Community interpreting", + "domain": "Professional Field" + }, + { + "name": "Companies law", + "domain": "Professional Field" + }, + { + "name": "Companion (caregiving)", + "domain": "Professional Field" + }, + { + "name": "Competitive diver", + "domain": "Professional Field" + }, + { + "name": "Comptroller", + "domain": "Professional Field" + }, + { + "name": "Computational scientist", + "domain": "Professional Field" + }, + { + "name": "Computer (occupation)", + "domain": "Professional Field" + }, + { + "name": "Computer operator", + "domain": "Professional Field" + }, + { + "name": "Computer repair technician", + "domain": "Professional Field" + }, + { + "name": "Computer scientist", + "domain": "Professional Field" + }, + { + "name": "Conceptual artist", + "domain": "Professional Field" + }, + { + "name": "Conchologist", + "domain": "Professional Field" + }, + { + "name": "Concierge", + "domain": "Professional Field" + }, + { + "name": "Concrete finisher", + "domain": "Professional Field" + }, + { + "name": "Condottiero", + "domain": "Professional Field" + }, + { + "name": "Conductor (rail)", + "domain": "Professional Field" + }, + { + "name": "Conferencier", + "domain": "Professional Field" + }, + { + "name": "Confucianist", + "domain": "Professional Field" + }, + { + "name": "Congressional staff", + "domain": "Professional Field" + }, + { + "name": "Connoisseur", + "domain": "Professional Field" + }, + { + "name": "Conservation officer", + "domain": "Professional Field" + }, + { + "name": "Conservation scientist", + "domain": "Professional Field" + }, + { + "name": "Conservation technician", + "domain": "Professional Field" + }, + { + "name": "Conservator-restorer", + "domain": "Professional Field" + }, + { + "name": "Consignor", + "domain": "Professional Field" + }, + { + "name": "Construction worker", + "domain": "Professional Field" + }, + { + "name": "Consul general", + "domain": "Professional Field" + }, + { + "name": "Consultancy", + "domain": "Professional Field" + }, + { + "name": "Consultant", + "domain": "Professional Field" + }, + { + "name": "Consultant (medicine)", + "domain": "Professional Field" + }, + { + "name": "Content designer", + "domain": "Professional Field" + }, + { + "name": "Contract attorney", + "domain": "Professional Field" + }, + { + "name": "Contracting Officer's Technical Representative", + "domain": "Professional Field" + }, + { + "name": "Contributing editor", + "domain": "Professional Field" + }, + { + "name": "Conveyancer", + "domain": "Professional Field" + }, + { + "name": "Cook (domestic worker)", + "domain": "Professional Field" + }, + { + "name": "Cook (profession)", + "domain": "Professional Field" + }, + { + "name": "Coppersmith", + "domain": "Professional Field" + }, + { + "name": "Copy typist", + "domain": "Professional Field" + }, + { + "name": "Copyist", + "domain": "Professional Field" + }, + { + "name": "Copywriter", + "domain": "Professional Field" + }, + { + "name": "Cordwainer", + "domain": "Professional Field" + }, + { + "name": "Coroplast (artisan)", + "domain": "Professional Field" + }, + { + "name": "Corporate trainer", + "domain": "Professional Field" + }, + { + "name": "Corporate travel management", + "domain": "Professional Field" + }, + { + "name": "Corps de l'armement", + "domain": "Professional Field" + }, + { + "name": "Corps of drums", + "domain": "Professional Field" + }, + { + "name": "Corrector", + "domain": "Professional Field" + }, + { + "name": "Corregedor", + "domain": "Professional Field" + }, + { + "name": "Correspondent", + "domain": "Professional Field" + }, + { + "name": "Corsetmaker", + "domain": "Professional Field" + }, + { + "name": "Cosmetologist", + "domain": "Professional Field" + }, + { + "name": "Cosmologist", + "domain": "Professional Field" + }, + { + "name": "Cost analyst", + "domain": "Professional Field" + }, + { + "name": "Costume design", + "domain": "Professional Field" + }, + { + "name": "Counseling statements in the United States", + "domain": "Professional Field" + }, + { + "name": "Counselor-in-training", + "domain": "Professional Field" + }, + { + "name": "Counting agent", + "domain": "Professional Field" + }, + { + "name": "Coupletist", + "domain": "Professional Field" + }, + { + "name": "Coureur des bois", + "domain": "Professional Field" + }, + { + "name": "Court painter", + "domain": "Professional Field" + }, + { + "name": "Court reporter", + "domain": "Professional Field" + }, + { + "name": "Cowboy", + "domain": "Professional Field" + }, + { + "name": "Cowman (profession)", + "domain": "Professional Field" + }, + { + "name": "Coxswain", + "domain": "Professional Field" + }, + { + "name": "Creative consultant", + "domain": "Professional Field" + }, + { + "name": "Creative director", + "domain": "Professional Field" + }, + { + "name": "Creative executive", + "domain": "Professional Field" + }, + { + "name": "Credit broker", + "domain": "Professional Field" + }, + { + "name": "Credit management", + "domain": "Professional Field" + }, + { + "name": "Crewman", + "domain": "Professional Field" + }, + { + "name": "Cricketer", + "domain": "Professional Field" + }, + { + "name": "Crime scene cleanup", + "domain": "Professional Field" + }, + { + "name": "Criminal psychologist", + "domain": "Professional Field" + }, + { + "name": "Criminologist", + "domain": "Professional Field" + }, + { + "name": "Critic", + "domain": "Professional Field" + }, + { + "name": "Croatian studies", + "domain": "Professional Field" + }, + { + "name": "Cronista", + "domain": "Professional Field" + }, + { + "name": "Crossing sweeper", + "domain": "Professional Field" + }, + { + "name": "Croupier", + "domain": "Professional Field" + }, + { + "name": "Crown prosecutor", + "domain": "Professional Field" + }, + { + "name": "Crown prosecutor (New Zealand)", + "domain": "Professional Field" + }, + { + "name": "Cruise director", + "domain": "Professional Field" + }, + { + "name": "Cryonic technician", + "domain": "Professional Field" + }, + { + "name": "Cryptologic technician", + "domain": "Professional Field" + }, + { + "name": "Crystallographer", + "domain": "Professional Field" + }, + { + "name": "Csikós", + "domain": "Professional Field" + }, + { + "name": "Culinary specialist (United States Navy)", + "domain": "Professional Field" + }, + { + "name": "Cultural critic", + "domain": "Professional Field" + }, + { + "name": "Cultural institutions studies", + "domain": "Professional Field" + }, + { + "name": "Cultural manager", + "domain": "Professional Field" + }, + { + "name": "Cunning folk", + "domain": "Professional Field" + }, + { + "name": "Cunning folk in Britain", + "domain": "Professional Field" + }, + { + "name": "Curator", + "domain": "Professional Field" + }, + { + "name": "Currier", + "domain": "Professional Field" + }, + { + "name": "Custodial participant", + "domain": "Professional Field" + }, + { + "name": "Customer engineer", + "domain": "Professional Field" + }, + { + "name": "Customer representative", + "domain": "Professional Field" + }, + { + "name": "Customs broker", + "domain": "Professional Field" + }, + { + "name": "Customs house agent", + "domain": "Professional Field" + }, + { + "name": "Customs officer", + "domain": "Professional Field" + }, + { + "name": "Cyberneticist", + "domain": "Professional Field" + }, + { + "name": "Cynologist", + "domain": "Professional Field" + }, + { + "name": "DTP artist", + "domain": "Professional Field" + }, + { + "name": "Da'i", + "domain": "Professional Field" + }, + { + "name": "Dabbawala", + "domain": "Professional Field" + }, + { + "name": "Daeryeong Suksu", + "domain": "Professional Field" + }, + { + "name": "Dalang (puppeteer)", + "domain": "Professional Field" + }, + { + "name": "Damage controlman", + "domain": "Professional Field" + }, + { + "name": "Dance double", + "domain": "Professional Field" + }, + { + "name": "Dancer", + "domain": "Professional Field" + }, + { + "name": "Dangerous Goods Safety Advisor", + "domain": "Professional Field" + }, + { + "name": "Danseur noble", + "domain": "Professional Field" + }, + { + "name": "Data administration", + "domain": "Professional Field" + }, + { + "name": "Data architect", + "domain": "Professional Field" + }, + { + "name": "Data custodian", + "domain": "Professional Field" + }, + { + "name": "Data entry clerk", + "domain": "Professional Field" + }, + { + "name": "Data janitor", + "domain": "Professional Field" + }, + { + "name": "Data scientist", + "domain": "Professional Field" + }, + { + "name": "Data steward", + "domain": "Professional Field" + }, + { + "name": "Database administrator", + "domain": "Professional Field" + }, + { + "name": "Dating coach", + "domain": "Professional Field" + }, + { + "name": "Day labor", + "domain": "Professional Field" + }, + { + "name": "Dayan (rabbinic judge)", + "domain": "Professional Field" + }, + { + "name": "Deaconess", + "domain": "Professional Field" + }, + { + "name": "Dead-end job", + "domain": "Professional Field" + }, + { + "name": "Dean of women", + "domain": "Professional Field" + }, + { + "name": "Death midwife", + "domain": "Professional Field" + }, + { + "name": "Debunker", + "domain": "Professional Field" + }, + { + "name": "Defense attorney", + "domain": "Professional Field" + }, + { + "name": "Delegate (American politics)", + "domain": "Professional Field" + }, + { + "name": "Demographic marketer", + "domain": "Professional Field" + }, + { + "name": "Dental assistant", + "domain": "Professional Field" + }, + { + "name": "Dental technician", + "domain": "Professional Field" + }, + { + "name": "Dental therapist", + "domain": "Professional Field" + }, + { + "name": "Deputy Vice Chancellor", + "domain": "Professional Field" + }, + { + "name": "Deputy commissioner", + "domain": "Professional Field" + }, + { + "name": "Deputy commissioner of police", + "domain": "Professional Field" + }, + { + "name": "Deputy head teacher", + "domain": "Professional Field" + }, + { + "name": "Derrickhand", + "domain": "Professional Field" + }, + { + "name": "Design director", + "domain": "Professional Field" + }, + { + "name": "Design engineer", + "domain": "Professional Field" + }, + { + "name": "Designer", + "domain": "Professional Field" + }, + { + "name": "Detection dog", + "domain": "Professional Field" + }, + { + "name": "Detective", + "domain": "Professional Field" + }, + { + "name": "Devadasi", + "domain": "Professional Field" + }, + { + "name": "Development executive", + "domain": "Professional Field" + }, + { + "name": "Diabetologist", + "domain": "Professional Field" + }, + { + "name": "Dialect coach", + "domain": "Professional Field" + }, + { + "name": "Dialogue editor", + "domain": "Professional Field" + }, + { + "name": "Diamantaire", + "domain": "Professional Field" + }, + { + "name": "Diction coach", + "domain": "Professional Field" + }, + { + "name": "Diener", + "domain": "Professional Field" + }, + { + "name": "Dievdirbys", + "domain": "Professional Field" + }, + { + "name": "Digital Champions", + "domain": "Professional Field" + }, + { + "name": "Digital artist", + "domain": "Professional Field" + }, + { + "name": "Digital creator", + "domain": "Professional Field" + }, + { + "name": "Digital marketing engineer", + "domain": "Professional Field" + }, + { + "name": "Digital marketing expert", + "domain": "Professional Field" + }, + { + "name": "Digital matte artist", + "domain": "Professional Field" + }, + { + "name": "Digital strategy manager", + "domain": "Professional Field" + }, + { + "name": "Diocesan administrator", + "domain": "Professional Field" + }, + { + "name": "Diocesan priest", + "domain": "Professional Field" + }, + { + "name": "Diplom-Verwaltungswirt (FH)", + "domain": "Professional Field" + }, + { + "name": "Diplomat", + "domain": "Professional Field" + }, + { + "name": "Diplomatist", + "domain": "Professional Field" + }, + { + "name": "Directeur sportif", + "domain": "Professional Field" + }, + { + "name": "Director (business)", + "domain": "Professional Field" + }, + { + "name": "Director (colonial)", + "domain": "Professional Field" + }, + { + "name": "Director of audiography", + "domain": "Professional Field" + }, + { + "name": "Director of bands", + "domain": "Professional Field" + }, + { + "name": "Director of communications", + "domain": "Professional Field" + }, + { + "name": "Director of football", + "domain": "Professional Field" + }, + { + "name": "Director of network programming", + "domain": "Professional Field" + }, + { + "name": "Dishwasher (occupation)", + "domain": "Professional Field" + }, + { + "name": "Dispatcher", + "domain": "Professional Field" + }, + { + "name": "Diving instructor", + "domain": "Professional Field" + }, + { + "name": "Diving supervisor", + "domain": "Professional Field" + }, + { + "name": "Dockworker", + "domain": "Professional Field" + }, + { + "name": "Document controller", + "domain": "Professional Field" + }, + { + "name": "Documentalist", + "domain": "Professional Field" + }, + { + "name": "Documentarian", + "domain": "Professional Field" + }, + { + "name": "Dog breeder", + "domain": "Professional Field" + }, + { + "name": "Dog groomer", + "domain": "Professional Field" + }, + { + "name": "Dog trainer", + "domain": "Professional Field" + }, + { + "name": "Dog writer", + "domain": "Professional Field" + }, + { + "name": "Domestic worker", + "domain": "Professional Field" + }, + { + "name": "Dominatrix", + "domain": "Professional Field" + }, + { + "name": "Doorman (profession)", + "domain": "Professional Field" + }, + { + "name": "Double agent", + "domain": "Professional Field" + }, + { + "name": "Doula", + "domain": "Professional Field" + }, + { + "name": "Dowser", + "domain": "Professional Field" + }, + { + "name": "Drafter", + "domain": "Professional Field" + }, + { + "name": "Dragoman", + "domain": "Professional Field" + }, + { + "name": "Dramaturge", + "domain": "Professional Field" + }, + { + "name": "Draper", + "domain": "Professional Field" + }, + { + "name": "Drapery painter", + "domain": "Professional Field" + }, + { + "name": "Drawer (artist)", + "domain": "Professional Field" + }, + { + "name": "Drayman", + "domain": "Professional Field" + }, + { + "name": "Dressage judge", + "domain": "Professional Field" + }, + { + "name": "Dressmaker", + "domain": "Professional Field" + }, + { + "name": "Driller (oil)", + "domain": "Professional Field" + }, + { + "name": "Driving instructor", + "domain": "Professional Field" + }, + { + "name": "Drover (Australian)", + "domain": "Professional Field" + }, + { + "name": "Drumkeeper", + "domain": "Professional Field" + }, + { + "name": "Drysalter", + "domain": "Professional Field" + }, + { + "name": "Dub (filming)", + "domain": "Professional Field" + }, + { + "name": "Dulcimerist", + "domain": "Professional Field" + }, + { + "name": "Dyer (occupation)", + "domain": "Professional Field" + }, + { + "name": "E-Science librarianship", + "domain": "Professional Field" + }, + { + "name": "Earth scientist", + "domain": "Professional Field" + }, + { + "name": "Ecclesiastical judge", + "domain": "Professional Field" + }, + { + "name": "Eclipse chasing", + "domain": "Professional Field" + }, + { + "name": "Ecohydrologist", + "domain": "Professional Field" + }, + { + "name": "Ecologist", + "domain": "Professional Field" + }, + { + "name": "Econometrician", + "domain": "Professional Field" + }, + { + "name": "Economist", + "domain": "Professional Field" + }, + { + "name": "Editorial cartoonist", + "domain": "Professional Field" + }, + { + "name": "Educational consultant", + "domain": "Professional Field" + }, + { + "name": "Educational psychologist", + "domain": "Professional Field" + }, + { + "name": "Educational robotics", + "domain": "Professional Field" + }, + { + "name": "Educational specialist", + "domain": "Professional Field" + }, + { + "name": "Educational technologist", + "domain": "Professional Field" + }, + { + "name": "Educational theorist", + "domain": "Professional Field" + }, + { + "name": "Educator", + "domain": "Professional Field" + }, + { + "name": "Egyptologist", + "domain": "Professional Field" + }, + { + "name": "Election agent", + "domain": "Professional Field" + }, + { + "name": "Electrical contractor", + "domain": "Professional Field" + }, + { + "name": "Electrical drafters", + "domain": "Professional Field" + }, + { + "name": "Electrical engineer", + "domain": "Professional Field" + }, + { + "name": "Electrical technologist", + "domain": "Professional Field" + }, + { + "name": "Electrician", + "domain": "Professional Field" + }, + { + "name": "Electrician (theatre)", + "domain": "Professional Field" + }, + { + "name": "Electro-technical officer", + "domain": "Professional Field" + }, + { + "name": "Electronic engineer", + "domain": "Professional Field" + }, + { + "name": "Electronics technician", + "domain": "Professional Field" + }, + { + "name": "Electronics technician (United States Navy)", + "domain": "Professional Field" + }, + { + "name": "Electronics technician (armed forces)", + "domain": "Professional Field" + }, + { + "name": "Elevator mechanic", + "domain": "Professional Field" + }, + { + "name": "Elevator operator", + "domain": "Professional Field" + }, + { + "name": "Emergency medical dispatcher", + "domain": "Professional Field" + }, + { + "name": "Emergency medical responder", + "domain": "Professional Field" + }, + { + "name": "Emergency physician", + "domain": "Professional Field" + }, + { + "name": "Emperor", + "domain": "Professional Field" + }, + { + "name": "Employment counsellor", + "domain": "Professional Field" + }, + { + "name": "Encyclopédistes", + "domain": "Professional Field" + }, + { + "name": "Endocrinologist", + "domain": "Professional Field" + }, + { + "name": "Endodontist", + "domain": "Professional Field" + }, + { + "name": "Engagé", + "domain": "Professional Field" + }, + { + "name": "Engine officer", + "domain": "Professional Field" + }, + { + "name": "Engine tuning", + "domain": "Professional Field" + }, + { + "name": "Engineer", + "domain": "Professional Field" + }, + { + "name": "Engineer's degree", + "domain": "Professional Field" + }, + { + "name": "Engineering geologist", + "domain": "Professional Field" + }, + { + "name": "Engineering technician", + "domain": "Professional Field" + }, + { + "name": "Engineering technologist", + "domain": "Professional Field" + }, + { + "name": "Engraver", + "domain": "Professional Field" + }, + { + "name": "Enterprise architect", + "domain": "Professional Field" + }, + { + "name": "Entomologist", + "domain": "Professional Field" + }, + { + "name": "Environment artist", + "domain": "Professional Field" + }, + { + "name": "Environmental consultant", + "domain": "Professional Field" + }, + { + "name": "Environmental health officer", + "domain": "Professional Field" + }, + { + "name": "Environmentalist", + "domain": "Professional Field" + }, + { + "name": "Epidemiologist", + "domain": "Professional Field" + }, + { + "name": "Epileptologist", + "domain": "Professional Field" + }, + { + "name": "Equerry", + "domain": "Professional Field" + }, + { + "name": "Equine dentistry", + "domain": "Professional Field" + }, + { + "name": "Equipment manager", + "domain": "Professional Field" + }, + { + "name": "Erenagh", + "domain": "Professional Field" + }, + { + "name": "Erotic photography model", + "domain": "Professional Field" + }, + { + "name": "Esperantologist", + "domain": "Professional Field" + }, + { + "name": "Essayist", + "domain": "Professional Field" + }, + { + "name": "Estate agent", + "domain": "Professional Field" + }, + { + "name": "Ethicist", + "domain": "Professional Field" + }, + { + "name": "Eurocrat", + "domain": "Professional Field" + }, + { + "name": "Event manager", + "domain": "Professional Field" + }, + { + "name": "Event technician", + "domain": "Professional Field" + }, + { + "name": "Evolutionary biologist", + "domain": "Professional Field" + }, + { + "name": "Ewery", + "domain": "Professional Field" + }, + { + "name": "Executioner", + "domain": "Professional Field" + }, + { + "name": "Executive magistrates of the Roman Republic", + "domain": "Professional Field" + }, + { + "name": "Executor", + "domain": "Professional Field" + }, + { + "name": "Exhibition designer", + "domain": "Professional Field" + }, + { + "name": "Exoplanetologist", + "domain": "Professional Field" + }, + { + "name": "Exotic animal veterinarian", + "domain": "Professional Field" + }, + { + "name": "Expeditor", + "domain": "Professional Field" + }, + { + "name": "Expert witness", + "domain": "Professional Field" + }, + { + "name": "External auditor", + "domain": "Professional Field" + }, + { + "name": "Externship", + "domain": "Professional Field" + }, + { + "name": "Extra (acting)", + "domain": "Professional Field" + }, + { + "name": "Eye surgeon", + "domain": "Professional Field" + }, + { + "name": "FAO Goodwill Ambassador", + "domain": "Professional Field" + }, + { + "name": "Fabergé workmaster", + "domain": "Professional Field" + }, + { + "name": "Fabric restoration", + "domain": "Professional Field" + }, + { + "name": "Fachwirt", + "domain": "Professional Field" + }, + { + "name": "Facility operations", + "domain": "Professional Field" + }, + { + "name": "Factor (agent)", + "domain": "Professional Field" + }, + { + "name": "Factory inspector", + "domain": "Professional Field" + }, + { + "name": "Family nurse practitioner", + "domain": "Professional Field" + }, + { + "name": "Fangshi", + "domain": "Professional Field" + }, + { + "name": "Faqīh", + "domain": "Professional Field" + }, + { + "name": "Farmworker", + "domain": "Professional Field" + }, + { + "name": "Farrier", + "domain": "Professional Field" + }, + { + "name": "Fashion editor", + "domain": "Professional Field" + }, + { + "name": "Fashion entrepreneur", + "domain": "Professional Field" + }, + { + "name": "Fashion forecasting", + "domain": "Professional Field" + }, + { + "name": "Fashion influencer", + "domain": "Professional Field" + }, + { + "name": "Fedayeen", + "domain": "Professional Field" + }, + { + "name": "Fehirde", + "domain": "Professional Field" + }, + { + "name": "Female guards in Nazi concentration camps", + "domain": "Professional Field" + }, + { + "name": "Fendersmith", + "domain": "Professional Field" + }, + { + "name": "Fetish model", + "domain": "Professional Field" + }, + { + "name": "Feuerwerker", + "domain": "Professional Field" + }, + { + "name": "Field agent", + "domain": "Professional Field" + }, + { + "name": "Figure skater", + "domain": "Professional Field" + }, + { + "name": "Filibuster (military)", + "domain": "Professional Field" + }, + { + "name": "Filling station attendant", + "domain": "Professional Field" + }, + { + "name": "Film director", + "domain": "Professional Field" + }, + { + "name": "Film editor", + "domain": "Professional Field" + }, + { + "name": "Film scholar", + "domain": "Professional Field" + }, + { + "name": "Film theorist", + "domain": "Professional Field" + }, + { + "name": "Filí", + "domain": "Professional Field" + }, + { + "name": "Financial Secretary (Hong Kong)", + "domain": "Professional Field" + }, + { + "name": "Financial analyst", + "domain": "Professional Field" + }, + { + "name": "Financial planner", + "domain": "Professional Field" + }, + { + "name": "Financier", + "domain": "Professional Field" + }, + { + "name": "Fire boss", + "domain": "Professional Field" + }, + { + "name": "Fire marshal", + "domain": "Professional Field" + }, + { + "name": "Firefighter", + "domain": "Professional Field" + }, + { + "name": "Fireman (steam engine)", + "domain": "Professional Field" + }, + { + "name": "First officer (aviation)", + "domain": "Professional Field" + }, + { + "name": "Fisherman", + "domain": "Professional Field" + }, + { + "name": "Fishmonger", + "domain": "Professional Field" + }, + { + "name": "Fishwife", + "domain": "Professional Field" + }, + { + "name": "Fit model", + "domain": "Professional Field" + }, + { + "name": "Fixer (person)", + "domain": "Professional Field" + }, + { + "name": "Flagman (rail)", + "domain": "Professional Field" + }, + { + "name": "Flatter", + "domain": "Professional Field" + }, + { + "name": "Flatulist", + "domain": "Professional Field" + }, + { + "name": "Flight attendant", + "domain": "Professional Field" + }, + { + "name": "Flight controller", + "domain": "Professional Field" + }, + { + "name": "Flight dispatcher", + "domain": "Professional Field" + }, + { + "name": "Flight instructor", + "domain": "Professional Field" + }, + { + "name": "Flight nurse", + "domain": "Professional Field" + }, + { + "name": "Flight surgeon", + "domain": "Professional Field" + }, + { + "name": "Floor trader", + "domain": "Professional Field" + }, + { + "name": "Floral designer", + "domain": "Professional Field" + }, + { + "name": "Florist", + "domain": "Professional Field" + }, + { + "name": "Fly crew", + "domain": "Professional Field" + }, + { + "name": "Flying ace", + "domain": "Professional Field" + }, + { + "name": "Focus puller", + "domain": "Professional Field" + }, + { + "name": "Folk healer", + "domain": "Professional Field" + }, + { + "name": "Food critic", + "domain": "Professional Field" + }, + { + "name": "Food taster", + "domain": "Professional Field" + }, + { + "name": "Forcado", + "domain": "Professional Field" + }, + { + "name": "Foreign Service officer", + "domain": "Professional Field" + }, + { + "name": "Foreign area officer", + "domain": "Professional Field" + }, + { + "name": "Foreign-language assistant", + "domain": "Professional Field" + }, + { + "name": "Forensic accountant", + "domain": "Professional Field" + }, + { + "name": "Forensic biologist", + "domain": "Professional Field" + }, + { + "name": "Forensic entomologist", + "domain": "Professional Field" + }, + { + "name": "Forensic psychologist", + "domain": "Professional Field" + }, + { + "name": "Forensic scientist", + "domain": "Professional Field" + }, + { + "name": "Forensic technician", + "domain": "Professional Field" + }, + { + "name": "Forester", + "domain": "Professional Field" + }, + { + "name": "Fossil preparator", + "domain": "Professional Field" + }, + { + "name": "Fountaineer", + "domain": "Professional Field" + }, + { + "name": "Framer", + "domain": "Professional Field" + }, + { + "name": "Franelero", + "domain": "Professional Field" + }, + { + "name": "Freight broker", + "domain": "Professional Field" + }, + { + "name": "Freight conductor", + "domain": "Professional Field" + }, + { + "name": "French civil service", + "domain": "Professional Field" + }, + { + "name": "French corsairs", + "domain": "Professional Field" + }, + { + "name": "French moralists", + "domain": "Professional Field" + }, + { + "name": "Fullo", + "domain": "Professional Field" + }, + { + "name": "Functionary", + "domain": "Professional Field" + }, + { + "name": "Funeral director", + "domain": "Professional Field" + }, + { + "name": "Furrier", + "domain": "Professional Field" + }, + { + "name": "Fusiliers marins", + "domain": "Professional Field" + }, + { + "name": "Futurist", + "domain": "Professional Field" + }, + { + "name": "Gabbai", + "domain": "Professional Field" + }, + { + "name": "Gaberlunzie", + "domain": "Professional Field" + }, + { + "name": "Game designer", + "domain": "Professional Field" + }, + { + "name": "Game director", + "domain": "Professional Field" + }, + { + "name": "Game show host", + "domain": "Professional Field" + }, + { + "name": "Game warden", + "domain": "Professional Field" + }, + { + "name": "Ganadhara", + "domain": "Professional Field" + }, + { + "name": "Garde champêtre", + "domain": "Professional Field" + }, + { + "name": "Garde manger", + "domain": "Professional Field" + }, + { + "name": "Garden designer", + "domain": "Professional Field" + }, + { + "name": "Gardener", + "domain": "Professional Field" + }, + { + "name": "Gardian", + "domain": "Professional Field" + }, + { + "name": "Gasfitter", + "domain": "Professional Field" + }, + { + "name": "Gate agent", + "domain": "Professional Field" + }, + { + "name": "Gatekeeper", + "domain": "Professional Field" + }, + { + "name": "Geisha", + "domain": "Professional Field" + }, + { + "name": "Geji", + "domain": "Professional Field" + }, + { + "name": "Gemcutter", + "domain": "Professional Field" + }, + { + "name": "Gemologist", + "domain": "Professional Field" + }, + { + "name": "Genealogist", + "domain": "Professional Field" + }, + { + "name": "General contractor", + "domain": "Professional Field" + }, + { + "name": "General manager", + "domain": "Professional Field" + }, + { + "name": "General manager (American football)", + "domain": "Professional Field" + }, + { + "name": "General practitioner", + "domain": "Professional Field" + }, + { + "name": "Generalmusikdirektor", + "domain": "Professional Field" + }, + { + "name": "Geneticist", + "domain": "Professional Field" + }, + { + "name": "Gentilhombre de cámara con ejercicio", + "domain": "Professional Field" + }, + { + "name": "Gentilhombres de cámara con ejercicio", + "domain": "Professional Field" + }, + { + "name": "Geodesist", + "domain": "Professional Field" + }, + { + "name": "Geographer", + "domain": "Professional Field" + }, + { + "name": "Geologist", + "domain": "Professional Field" + }, + { + "name": "Geotechnical engineer", + "domain": "Professional Field" + }, + { + "name": "Geriatrician", + "domain": "Professional Field" + }, + { + "name": "Gerichtsassessor", + "domain": "Professional Field" + }, + { + "name": "Germanist", + "domain": "Professional Field" + }, + { + "name": "Gestalt psychologists", + "domain": "Professional Field" + }, + { + "name": "Gestor", + "domain": "Professional Field" + }, + { + "name": "Ghost singer", + "domain": "Professional Field" + }, + { + "name": "Gillie", + "domain": "Professional Field" + }, + { + "name": "Glass engraver", + "domain": "Professional Field" + }, + { + "name": "Glazier", + "domain": "Professional Field" + }, + { + "name": "Glossator", + "domain": "Professional Field" + }, + { + "name": "Go professional", + "domain": "Professional Field" + }, + { + "name": "Goalkeeper coach", + "domain": "Professional Field" + }, + { + "name": "Goatherd", + "domain": "Professional Field" + }, + { + "name": "Goldsmith", + "domain": "Professional Field" + }, + { + "name": "Golfer", + "domain": "Professional Field" + }, + { + "name": "Gossip columnist", + "domain": "Professional Field" + }, + { + "name": "Governess", + "domain": "Professional Field" + }, + { + "name": "Government scholar", + "domain": "Professional Field" + }, + { + "name": "Government scientist", + "domain": "Professional Field" + }, + { + "name": "Governor", + "domain": "Professional Field" + }, + { + "name": "Governor of the Bank of Canada", + "domain": "Professional Field" + }, + { + "name": "Graduate assistant", + "domain": "Professional Field" + }, + { + "name": "Grandmaster (martial arts)", + "domain": "Professional Field" + }, + { + "name": "Granthi", + "domain": "Professional Field" + }, + { + "name": "Graphic design occupations", + "domain": "Professional Field" + }, + { + "name": "Graphic designer", + "domain": "Professional Field" + }, + { + "name": "Gravedigger", + "domain": "Professional Field" + }, + { + "name": "Gravure idol", + "domain": "Professional Field" + }, + { + "name": "Greenskeeper", + "domain": "Professional Field" + }, + { + "name": "Greffier", + "domain": "Professional Field" + }, + { + "name": "Grey hat", + "domain": "Professional Field" + }, + { + "name": "Greyhound trainer", + "domain": "Professional Field" + }, + { + "name": "Gridiron football player", + "domain": "Professional Field" + }, + { + "name": "Griot", + "domain": "Professional Field" + }, + { + "name": "Grocer", + "domain": "Professional Field" + }, + { + "name": "Grubber", + "domain": "Professional Field" + }, + { + "name": "Gruppenkommandeur", + "domain": "Professional Field" + }, + { + "name": "Guide", + "domain": "Professional Field" + }, + { + "name": "Gunnie", + "domain": "Professional Field" + }, + { + "name": "Gunsmith", + "domain": "Professional Field" + }, + { + "name": "Gymnast", + "domain": "Professional Field" + }, + { + "name": "Gynaecologist", + "domain": "Professional Field" + }, + { + "name": "Gyōji", + "domain": "Professional Field" + }, + { + "name": "Haberdasher", + "domain": "Professional Field" + }, + { + "name": "Hair colorist", + "domain": "Professional Field" + }, + { + "name": "Hairdresser", + "domain": "Professional Field" + }, + { + "name": "Hammer thrower", + "domain": "Professional Field" + }, + { + "name": "Hand model", + "domain": "Professional Field" + }, + { + "name": "Handball player", + "domain": "Professional Field" + }, + { + "name": "Handmaiden", + "domain": "Professional Field" + }, + { + "name": "Handyman", + "domain": "Professional Field" + }, + { + "name": "Harbourmaster", + "domain": "Professional Field" + }, + { + "name": "Hardware architect", + "domain": "Professional Field" + }, + { + "name": "Harpsichordist", + "domain": "Professional Field" + }, + { + "name": "Hawker (trade)", + "domain": "Professional Field" + }, + { + "name": "Head coach", + "domain": "Professional Field" + }, + { + "name": "Head gardener", + "domain": "Professional Field" + }, + { + "name": "Head writer", + "domain": "Professional Field" + }, + { + "name": "Health Care Manager", + "domain": "Professional Field" + }, + { + "name": "Health economist", + "domain": "Professional Field" + }, + { + "name": "Health professional", + "domain": "Professional Field" + }, + { + "name": "Health visitor", + "domain": "Professional Field" + }, + { + "name": "Healthcare scientist", + "domain": "Professional Field" + }, + { + "name": "Heavy equipment operator", + "domain": "Professional Field" + }, + { + "name": "Hebraist", + "domain": "Professional Field" + }, + { + "name": "Heilpraktiker", + "domain": "Professional Field" + }, + { + "name": "Helicopter pilot", + "domain": "Professional Field" + }, + { + "name": "Hello Girls", + "domain": "Professional Field" + }, + { + "name": "Helmsman", + "domain": "Professional Field" + }, + { + "name": "Hematologist", + "domain": "Professional Field" + }, + { + "name": "Herbalist", + "domain": "Professional Field" + }, + { + "name": "Heresiarch", + "domain": "Professional Field" + }, + { + "name": "Hewer", + "domain": "Professional Field" + }, + { + "name": "Hikeshi", + "domain": "Professional Field" + }, + { + "name": "Hispanist", + "domain": "Professional Field" + }, + { + "name": "Historian", + "domain": "Professional Field" + }, + { + "name": "History teacher", + "domain": "Professional Field" + }, + { + "name": "Hittitologist", + "domain": "Professional Field" + }, + { + "name": "Hofmeister (office)", + "domain": "Professional Field" + }, + { + "name": "Homeopath", + "domain": "Professional Field" + }, + { + "name": "Homme de lettres", + "domain": "Professional Field" + }, + { + "name": "Hong Kong Civil Service", + "domain": "Professional Field" + }, + { + "name": "Horror host", + "domain": "Professional Field" + }, + { + "name": "Horse trainer", + "domain": "Professional Field" + }, + { + "name": "Horse-breeder", + "domain": "Professional Field" + }, + { + "name": "Horticulturist", + "domain": "Professional Field" + }, + { + "name": "Hospodar", + "domain": "Professional Field" + }, + { + "name": "Hotel manager", + "domain": "Professional Field" + }, + { + "name": "Hourly worker", + "domain": "Professional Field" + }, + { + "name": "House model", + "domain": "Professional Field" + }, + { + "name": "House painter and decorator", + "domain": "Professional Field" + }, + { + "name": "Housekeeper (domestic worker)", + "domain": "Professional Field" + }, + { + "name": "Housemaster", + "domain": "Professional Field" + }, + { + "name": "Huissier de justice", + "domain": "Professional Field" + }, + { + "name": "Hulubalang", + "domain": "Professional Field" + }, + { + "name": "Humorist", + "domain": "Professional Field" + }, + { + "name": "Hwawon", + "domain": "Professional Field" + }, + { + "name": "Hydrographer of the Navy", + "domain": "Professional Field" + }, + { + "name": "IT assistant", + "domain": "Professional Field" + }, + { + "name": "Ice dancer", + "domain": "Professional Field" + }, + { + "name": "Ice hockey player", + "domain": "Professional Field" + }, + { + "name": "Iceman (occupation)", + "domain": "Professional Field" + }, + { + "name": "Illustrator", + "domain": "Professional Field" + }, + { + "name": "Immigration consultant", + "domain": "Professional Field" + }, + { + "name": "Immigration officer", + "domain": "Professional Field" + }, + { + "name": "Impersonation", + "domain": "Professional Field" + }, + { + "name": "Impersonator", + "domain": "Professional Field" + }, + { + "name": "Impressionist (entertainment)", + "domain": "Professional Field" + }, + { + "name": "Independent financial adviser", + "domain": "Professional Field" + }, + { + "name": "Industrialist", + "domain": "Professional Field" + }, + { + "name": "Influencer", + "domain": "Professional Field" + }, + { + "name": "Information Systems Professional", + "domain": "Professional Field" + }, + { + "name": "Information professional", + "domain": "Professional Field" + }, + { + "name": "Information scientist", + "domain": "Professional Field" + }, + { + "name": "Information systems technician", + "domain": "Professional Field" + }, + { + "name": "Information systems technician (United States Navy)", + "domain": "Professional Field" + }, + { + "name": "Informational interview", + "domain": "Professional Field" + }, + { + "name": "Ingénieur des études et de l'exploitation de l'aviation civile", + "domain": "Professional Field" + }, + { + "name": "Inker", + "domain": "Professional Field" + }, + { + "name": "Innkeeper", + "domain": "Professional Field" + }, + { + "name": "Innovator", + "domain": "Professional Field" + }, + { + "name": "Insolvency practitioner", + "domain": "Professional Field" + }, + { + "name": "Inspector", + "domain": "Professional Field" + }, + { + "name": "Inspektor", + "domain": "Professional Field" + }, + { + "name": "Instructional design coordinator", + "domain": "Professional Field" + }, + { + "name": "Instrument mechanic", + "domain": "Professional Field" + }, + { + "name": "Instrumentalist", + "domain": "Professional Field" + }, + { + "name": "Insurance investigator", + "domain": "Professional Field" + }, + { + "name": "Intellectual", + "domain": "Professional Field" + }, + { + "name": "Intelligence officer", + "domain": "Professional Field" + }, + { + "name": "Intensivist", + "domain": "Professional Field" + }, + { + "name": "Intercity bus driver", + "domain": "Professional Field" + }, + { + "name": "Intermediary", + "domain": "Professional Field" + }, + { + "name": "Intern Architect Program", + "domain": "Professional Field" + }, + { + "name": "Internal auditor", + "domain": "Professional Field" + }, + { + "name": "International lawyer", + "domain": "Professional Field" + }, + { + "name": "Intimacy coordinator", + "domain": "Professional Field" + }, + { + "name": "Investigative journalist", + "domain": "Professional Field" + }, + { + "name": "Ironworker", + "domain": "Professional Field" + }, + { + "name": "Italian Senior Civil Service", + "domain": "Professional Field" + }, + { + "name": "Itamae", + "domain": "Professional Field" + }, + { + "name": "Itinerant preacher", + "domain": "Professional Field" + }, + { + "name": "Itinerant teacher", + "domain": "Professional Field" + }, + { + "name": "Jackaroo", + "domain": "Professional Field" + }, + { + "name": "Janitor", + "domain": "Professional Field" + }, + { + "name": "Japanese idol", + "domain": "Professional Field" + }, + { + "name": "Japanning", + "domain": "Professional Field" + }, + { + "name": "Jazz pianist", + "domain": "Professional Field" + }, + { + "name": "Jazz saxophonist", + "domain": "Professional Field" + }, + { + "name": "Jazz trombonist", + "domain": "Professional Field" + }, + { + "name": "Jinete", + "domain": "Professional Field" + }, + { + "name": "Jizamurai", + "domain": "Professional Field" + }, + { + "name": "Jobber (fuel)", + "domain": "Professional Field" + }, + { + "name": "Jockey", + "domain": "Professional Field" + }, + { + "name": "Journalist", + "domain": "Professional Field" + }, + { + "name": "Journeyman", + "domain": "Professional Field" + }, + { + "name": "Journo-influencer", + "domain": "Professional Field" + }, + { + "name": "Judge authority", + "domain": "Professional Field" + }, + { + "name": "Judicial officer", + "domain": "Professional Field" + }, + { + "name": "Judicial scrivener", + "domain": "Professional Field" + }, + { + "name": "Judoka", + "domain": "Professional Field" + }, + { + "name": "Junior idol", + "domain": "Professional Field" + }, + { + "name": "Justice and public safety practitioner", + "domain": "Professional Field" + }, + { + "name": "Justice of the peace", + "domain": "Professional Field" + }, + { + "name": "Kapo", + "domain": "Professional Field" + }, + { + "name": "Keeper of Mineralogy, Natural History Museum", + "domain": "Professional Field" + }, + { + "name": "Keyboardist", + "domain": "Professional Field" + }, + { + "name": "Khananda", + "domain": "Professional Field" + }, + { + "name": "Khatun", + "domain": "Professional Field" + }, + { + "name": "Kholmogory bone carving", + "domain": "Professional Field" + }, + { + "name": "Kibbutz volunteer", + "domain": "Professional Field" + }, + { + "name": "Kinesiologist", + "domain": "Professional Field" + }, + { + "name": "King", + "domain": "Professional Field" + }, + { + "name": "King of the Romans", + "domain": "Professional Field" + }, + { + "name": "Kira (title)", + "domain": "Professional Field" + }, + { + "name": "Kitchen maid (domestic worker)", + "domain": "Professional Field" + }, + { + "name": "Knight", + "domain": "Professional Field" + }, + { + "name": "Knocker-up", + "domain": "Professional Field" + }, + { + "name": "Knowledge engineer", + "domain": "Professional Field" + }, + { + "name": "Kohen", + "domain": "Professional Field" + }, + { + "name": "Kolbar", + "domain": "Professional Field" + }, + { + "name": "Kommerkiarios", + "domain": "Professional Field" + }, + { + "name": "Korean idol", + "domain": "Professional Field" + }, + { + "name": "Kotwal", + "domain": "Professional Field" + }, + { + "name": "Kunoichi", + "domain": "Professional Field" + }, + { + "name": "Laboratory technician", + "domain": "Professional Field" + }, + { + "name": "Lackey (manservant)", + "domain": "Professional Field" + }, + { + "name": "Lady's companion", + "domain": "Professional Field" + }, + { + "name": "Lady's maid", + "domain": "Professional Field" + }, + { + "name": "Lady-in-waiting", + "domain": "Professional Field" + }, + { + "name": "Land surveyor", + "domain": "Professional Field" + }, + { + "name": "Landing signal officer", + "domain": "Professional Field" + }, + { + "name": "Landscape architect", + "domain": "Professional Field" + }, + { + "name": "Landscape designer", + "domain": "Professional Field" + }, + { + "name": "Landscape manager", + "domain": "Professional Field" + }, + { + "name": "Language program director", + "domain": "Professional Field" + }, + { + "name": "Lapidary", + "domain": "Professional Field" + }, + { + "name": "Largeworker", + "domain": "Professional Field" + }, + { + "name": "Latvian diplomatic service in exile", + "domain": "Professional Field" + }, + { + "name": "Law clerk", + "domain": "Professional Field" + }, + { + "name": "Law enforcement officer", + "domain": "Professional Field" + }, + { + "name": "Law of agency", + "domain": "Professional Field" + }, + { + "name": "Lay clerk", + "domain": "Professional Field" + }, + { + "name": "Lay ecclesial ministry", + "domain": "Professional Field" + }, + { + "name": "Leadman", + "domain": "Professional Field" + }, + { + "name": "Legal document assistant", + "domain": "Professional Field" + }, + { + "name": "Legislative assistant", + "domain": "Professional Field" + }, + { + "name": "Legist", + "domain": "Professional Field" + }, + { + "name": "Letterer", + "domain": "Professional Field" + }, + { + "name": "Letting agent", + "domain": "Professional Field" + }, + { + "name": "Level designer", + "domain": "Professional Field" + }, + { + "name": "Lexicographer", + "domain": "Professional Field" + }, + { + "name": "Lexicologist", + "domain": "Professional Field" + }, + { + "name": "Liaison officer", + "domain": "Professional Field" + }, + { + "name": "Librarian", + "domain": "Professional Field" + }, + { + "name": "Library and information scientist", + "domain": "Professional Field" + }, + { + "name": "Librettist", + "domain": "Professional Field" + }, + { + "name": "Licensed behavior analyst", + "domain": "Professional Field" + }, + { + "name": "Licensed lay minister", + "domain": "Professional Field" + }, + { + "name": "Licensed practical nurse", + "domain": "Professional Field" + }, + { + "name": "Life coach", + "domain": "Professional Field" + }, + { + "name": "Lifeguard", + "domain": "Professional Field" + }, + { + "name": "Lifestyle guru", + "domain": "Professional Field" + }, + { + "name": "Light board operator", + "domain": "Professional Field" + }, + { + "name": "Lighthouse keeper", + "domain": "Professional Field" + }, + { + "name": "Lighting design", + "domain": "Professional Field" + }, + { + "name": "Lighting technician", + "domain": "Professional Field" + }, + { + "name": "Limner", + "domain": "Professional Field" + }, + { + "name": "Line officer", + "domain": "Professional Field" + }, + { + "name": "Line producer", + "domain": "Professional Field" + }, + { + "name": "Line technician (automotive)", + "domain": "Professional Field" + }, + { + "name": "Line technician (aviation)", + "domain": "Professional Field" + }, + { + "name": "Lineworker", + "domain": "Professional Field" + }, + { + "name": "Linguist", + "domain": "Professional Field" + }, + { + "name": "List of Major League Baseball players (Li–Lz)", + "domain": "Professional Field" + }, + { + "name": "List of Muay Thai practitioners", + "domain": "Professional Field" + }, + { + "name": "List of language creators", + "domain": "Professional Field" + }, + { + "name": "List of mental health occupations", + "domain": "Professional Field" + }, + { + "name": "List of spymasters", + "domain": "Professional Field" + }, + { + "name": "Literary agent", + "domain": "Professional Field" + }, + { + "name": "Literary editor", + "domain": "Professional Field" + }, + { + "name": "Literary estate", + "domain": "Professional Field" + }, + { + "name": "Literary translation", + "domain": "Professional Field" + }, + { + "name": "Llamero", + "domain": "Professional Field" + }, + { + "name": "Loadmaster", + "domain": "Professional Field" + }, + { + "name": "Loan officer", + "domain": "Professional Field" + }, + { + "name": "Loan shark", + "domain": "Professional Field" + }, + { + "name": "Lobbyist", + "domain": "Professional Field" + }, + { + "name": "Lobster fishing", + "domain": "Professional Field" + }, + { + "name": "Lock keeper", + "domain": "Professional Field" + }, + { + "name": "Locksmith", + "domain": "Professional Field" + }, + { + "name": "Logician", + "domain": "Professional Field" + }, + { + "name": "Logothete", + "domain": "Professional Field" + }, + { + "name": "Lord of the manor", + "domain": "Professional Field" + }, + { + "name": "Louse-feeder", + "domain": "Professional Field" + }, + { + "name": "Lumberjack", + "domain": "Professional Field" + }, + { + "name": "Luthier", + "domain": "Professional Field" + }, + { + "name": "Machinist", + "domain": "Professional Field" + }, + { + "name": "Magician's assistant", + "domain": "Professional Field" + }, + { + "name": "Mahout", + "domain": "Professional Field" + }, + { + "name": "Maid", + "domain": "Professional Field" + }, + { + "name": "Maid of the Bedchamber", + "domain": "Professional Field" + }, + { + "name": "Mail carrier", + "domain": "Professional Field" + }, + { + "name": "Majordomo", + "domain": "Professional Field" + }, + { + "name": "Make-up artist", + "domain": "Professional Field" + }, + { + "name": "Makhdoom", + "domain": "Professional Field" + }, + { + "name": "Male prostitute", + "domain": "Professional Field" + }, + { + "name": "Male stripper", + "domain": "Professional Field" + }, + { + "name": "Malletier", + "domain": "Professional Field" + }, + { + "name": "Man-at-arms", + "domain": "Professional Field" + }, + { + "name": "Manager (Gaelic games)", + "domain": "Professional Field" + }, + { + "name": "Manager (association football)", + "domain": "Professional Field" + }, + { + "name": "Manager (baseball)", + "domain": "Professional Field" + }, + { + "name": "Manager (professional wrestling)", + "domain": "Professional Field" + }, + { + "name": "Managing editor", + "domain": "Professional Field" + }, + { + "name": "Mandarin (bureaucrat)", + "domain": "Professional Field" + }, + { + "name": "Manga artist", + "domain": "Professional Field" + }, + { + "name": "Marine biologist", + "domain": "Professional Field" + }, + { + "name": "Marine surveyor", + "domain": "Professional Field" + }, + { + "name": "Maritime pilot", + "domain": "Professional Field" + }, + { + "name": "Market researcher", + "domain": "Professional Field" + }, + { + "name": "Marketer", + "domain": "Professional Field" + }, + { + "name": "Marksman", + "domain": "Professional Field" + }, + { + "name": "Marriage officiant", + "domain": "Professional Field" + }, + { + "name": "Marshal of the Realm (Denmark)", + "domain": "Professional Field" + }, + { + "name": "Marxology", + "domain": "Professional Field" + }, + { + "name": "Massage therapist", + "domain": "Professional Field" + }, + { + "name": "Master (judiciary)", + "domain": "Professional Field" + }, + { + "name": "Master blender", + "domain": "Professional Field" + }, + { + "name": "Master builder", + "domain": "Professional Field" + }, + { + "name": "Master electrician", + "domain": "Professional Field" + }, + { + "name": "Master of Science in Engineering", + "domain": "Professional Field" + }, + { + "name": "Master of ceremonies", + "domain": "Professional Field" + }, + { + "name": "Mastering engineer", + "domain": "Professional Field" + }, + { + "name": "Matador", + "domain": "Professional Field" + }, + { + "name": "Matagi", + "domain": "Professional Field" + }, + { + "name": "Mate (naval officer)", + "domain": "Professional Field" + }, + { + "name": "Mathematical physicist", + "domain": "Professional Field" + }, + { + "name": "Mathematician", + "domain": "Professional Field" + }, + { + "name": "Matron", + "domain": "Professional Field" + }, + { + "name": "Mayanist", + "domain": "Professional Field" + }, + { + "name": "Mayor of the Halifax Regional Municipality", + "domain": "Professional Field" + }, + { + "name": "Maître d'hôtel", + "domain": "Professional Field" + }, + { + "name": "Mechanic", + "domain": "Professional Field" + }, + { + "name": "Mechanical engineer", + "domain": "Professional Field" + }, + { + "name": "Mechanician", + "domain": "Professional Field" + }, + { + "name": "Medalist", + "domain": "Professional Field" + }, + { + "name": "Meddah", + "domain": "Professional Field" + }, + { + "name": "Media consultant", + "domain": "Professional Field" + }, + { + "name": "Media presenter", + "domain": "Professional Field" + }, + { + "name": "Media proprietor", + "domain": "Professional Field" + }, + { + "name": "Media relations", + "domain": "Professional Field" + }, + { + "name": "Medical assistant (disambiguation)", + "domain": "Professional Field" + }, + { + "name": "Medical director", + "domain": "Professional Field" + }, + { + "name": "Medical education manager", + "domain": "Professional Field" + }, + { + "name": "Medical examiner", + "domain": "Professional Field" + }, + { + "name": "Medical ghostwriter", + "domain": "Professional Field" + }, + { + "name": "Medical physicist", + "domain": "Professional Field" + }, + { + "name": "Medical practice consultants", + "domain": "Professional Field" + }, + { + "name": "Medical science liaison", + "domain": "Professional Field" + }, + { + "name": "Medical sociologist", + "domain": "Professional Field" + }, + { + "name": "Medical technologist", + "domain": "Professional Field" + }, + { + "name": "Medicine man", + "domain": "Professional Field" + }, + { + "name": "Meeting and convention planner", + "domain": "Professional Field" + }, + { + "name": "Meister", + "domain": "Professional Field" + }, + { + "name": "Melamed", + "domain": "Professional Field" + }, + { + "name": "Mental health counselor", + "domain": "Professional Field" + }, + { + "name": "Mental health nurse", + "domain": "Professional Field" + }, + { + "name": "Mental health professional", + "domain": "Professional Field" + }, + { + "name": "Mercenary", + "domain": "Professional Field" + }, + { + "name": "Merchant", + "domain": "Professional Field" + }, + { + "name": "Meshimori onna", + "domain": "Professional Field" + }, + { + "name": "Meshulach", + "domain": "Professional Field" + }, + { + "name": "Metalsmith", + "domain": "Professional Field" + }, + { + "name": "Meteorologist", + "domain": "Professional Field" + }, + { + "name": "Methodological advisor", + "domain": "Professional Field" + }, + { + "name": "Metrologist", + "domain": "Professional Field" + }, + { + "name": "Microbiologist", + "domain": "Professional Field" + }, + { + "name": "Microscopist", + "domain": "Professional Field" + }, + { + "name": "Middle management", + "domain": "Professional Field" + }, + { + "name": "Middle office", + "domain": "Professional Field" + }, + { + "name": "Military advisor", + "domain": "Professional Field" + }, + { + "name": "Military attaché", + "domain": "Professional Field" + }, + { + "name": "Military interpreter (France)", + "domain": "Professional Field" + }, + { + "name": "Military nurse", + "domain": "Professional Field" + }, + { + "name": "Military personnel", + "domain": "Professional Field" + }, + { + "name": "Milk delivery", + "domain": "Professional Field" + }, + { + "name": "Milkmaid", + "domain": "Professional Field" + }, + { + "name": "Miller", + "domain": "Professional Field" + }, + { + "name": "Millers", + "domain": "Professional Field" + }, + { + "name": "Milliner", + "domain": "Professional Field" + }, + { + "name": "Millwright", + "domain": "Professional Field" + }, + { + "name": "Mime", + "domain": "Professional Field" + }, + { + "name": "Mime artist", + "domain": "Professional Field" + }, + { + "name": "Miner", + "domain": "Professional Field" + }, + { + "name": "Mining engineer", + "domain": "Professional Field" + }, + { + "name": "Missionary", + "domain": "Professional Field" + }, + { + "name": "Mistress of the Robes", + "domain": "Professional Field" + }, + { + "name": "Mixing engineer", + "domain": "Professional Field" + }, + { + "name": "Mobile Electronic Certified Professional", + "domain": "Professional Field" + }, + { + "name": "Mochilero (drug courier)", + "domain": "Professional Field" + }, + { + "name": "Model (art)", + "domain": "Professional Field" + }, + { + "name": "Model (person)", + "domain": "Professional Field" + }, + { + "name": "Model maker", + "domain": "Professional Field" + }, + { + "name": "Mohel", + "domain": "Professional Field" + }, + { + "name": "Moldmaker", + "domain": "Professional Field" + }, + { + "name": "Money changer", + "domain": "Professional Field" + }, + { + "name": "Money mule", + "domain": "Professional Field" + }, + { + "name": "Monologist", + "domain": "Professional Field" + }, + { + "name": "Monthly nurse", + "domain": "Professional Field" + }, + { + "name": "Mortgage broker", + "domain": "Professional Field" + }, + { + "name": "Motivational speaker", + "domain": "Professional Field" + }, + { + "name": "Motivational speaking", + "domain": "Professional Field" + }, + { + "name": "Motorcycle courier", + "domain": "Professional Field" + }, + { + "name": "Motorman (rail transportation)", + "domain": "Professional Field" + }, + { + "name": "Mount maker", + "domain": "Professional Field" + }, + { + "name": "Mountain guide", + "domain": "Professional Field" + }, + { + "name": "Mountain man", + "domain": "Professional Field" + }, + { + "name": "Mountaineer", + "domain": "Professional Field" + }, + { + "name": "Movement director", + "domain": "Professional Field" + }, + { + "name": "Mud clerk", + "domain": "Professional Field" + }, + { + "name": "Muezzin", + "domain": "Professional Field" + }, + { + "name": "Muhaddith", + "domain": "Professional Field" + }, + { + "name": "Muhtasib", + "domain": "Professional Field" + }, + { + "name": "Mukhtar", + "domain": "Professional Field" + }, + { + "name": "Multilingual writer", + "domain": "Professional Field" + }, + { + "name": "Municipal clerk", + "domain": "Professional Field" + }, + { + "name": "Munshi", + "domain": "Professional Field" + }, + { + "name": "Murshid", + "domain": "Professional Field" + }, + { + "name": "Musahharati", + "domain": "Professional Field" + }, + { + "name": "Museum attendant", + "domain": "Professional Field" + }, + { + "name": "Museum docent", + "domain": "Professional Field" + }, + { + "name": "Music editor", + "domain": "Professional Field" + }, + { + "name": "Music executive", + "domain": "Professional Field" + }, + { + "name": "Music promoter", + "domain": "Professional Field" + }, + { + "name": "Music theorist", + "domain": "Professional Field" + }, + { + "name": "Music video director", + "domain": "Professional Field" + }, + { + "name": "Muwaqqit", + "domain": "Professional Field" + }, + { + "name": "Méhariste", + "domain": "Professional Field" + }, + { + "name": "Müderris", + "domain": "Professional Field" + }, + { + "name": "Münzherr", + "domain": "Professional Field" + }, + { + "name": "Nail technician", + "domain": "Professional Field" + }, + { + "name": "Nanny", + "domain": "Professional Field" + }, + { + "name": "Nanoscientist", + "domain": "Professional Field" + }, + { + "name": "Narrative designer", + "domain": "Professional Field" + }, + { + "name": "Natural horsemanship", + "domain": "Professional Field" + }, + { + "name": "Natural resource management", + "domain": "Professional Field" + }, + { + "name": "Naturopath", + "domain": "Professional Field" + }, + { + "name": "Navajo Code Talker", + "domain": "Professional Field" + }, + { + "name": "Naval aviator (United States)", + "domain": "Professional Field" + }, + { + "name": "Naval flight officer", + "domain": "Professional Field" + }, + { + "name": "Naval officer", + "domain": "Professional Field" + }, + { + "name": "Naval surgeon", + "domain": "Professional Field" + }, + { + "name": "Navigator", + "domain": "Professional Field" + }, + { + "name": "Navvy", + "domain": "Professional Field" + }, + { + "name": "Navy boat crew", + "domain": "Professional Field" + }, + { + "name": "Navy diver (United States Navy)", + "domain": "Professional Field" + }, + { + "name": "Nawashi", + "domain": "Professional Field" + }, + { + "name": "Nazi concentration camp commandant", + "domain": "Professional Field" + }, + { + "name": "Nazi hunter", + "domain": "Professional Field" + }, + { + "name": "Neonatal Nurse Practitioner-Board Certified", + "domain": "Professional Field" + }, + { + "name": "Neonatal nurse practitioner", + "domain": "Professional Field" + }, + { + "name": "Neonatologist", + "domain": "Professional Field" + }, + { + "name": "Nephrologist", + "domain": "Professional Field" + }, + { + "name": "Network administrator", + "domain": "Professional Field" + }, + { + "name": "Network planning and design", + "domain": "Professional Field" + }, + { + "name": "Neurohospitalist", + "domain": "Professional Field" + }, + { + "name": "Neuropsychiatrist", + "domain": "Professional Field" + }, + { + "name": "Neuropsychologist", + "domain": "Professional Field" + }, + { + "name": "Neuroscientist", + "domain": "Professional Field" + }, + { + "name": "New media artist", + "domain": "Professional Field" + }, + { + "name": "News analyst", + "domain": "Professional Field" + }, + { + "name": "News director", + "domain": "Professional Field" + }, + { + "name": "News presenter", + "domain": "Professional Field" + }, + { + "name": "News producer", + "domain": "Professional Field" + }, + { + "name": "Newspaper hawker", + "domain": "Professional Field" + }, + { + "name": "Night porter", + "domain": "Professional Field" + }, + { + "name": "Ninja", + "domain": "Professional Field" + }, + { + "name": "Nocturnist", + "domain": "Professional Field" + }, + { + "name": "Non-consultant hospital doctor", + "domain": "Professional Field" + }, + { + "name": "Nose gunner", + "domain": "Professional Field" + }, + { + "name": "Notary public", + "domain": "Professional Field" + }, + { + "name": "Noter", + "domain": "Professional Field" + }, + { + "name": "Novelist", + "domain": "Professional Field" + }, + { + "name": "Novice", + "domain": "Professional Field" + }, + { + "name": "Novice master", + "domain": "Professional Field" + }, + { + "name": "Nuclear engineer", + "domain": "Professional Field" + }, + { + "name": "Nuclear medicine physician", + "domain": "Professional Field" + }, + { + "name": "Numerical analyst", + "domain": "Professional Field" + }, + { + "name": "Numerologist", + "domain": "Professional Field" + }, + { + "name": "Numismatist", + "domain": "Professional Field" + }, + { + "name": "Nurse midwife", + "domain": "Professional Field" + }, + { + "name": "Nurse practitioner", + "domain": "Professional Field" + }, + { + "name": "Nurse scientist", + "domain": "Professional Field" + }, + { + "name": "Nurse writer", + "domain": "Professional Field" + }, + { + "name": "Nursing Associate", + "domain": "Professional Field" + }, + { + "name": "Nursing management", + "domain": "Professional Field" + }, + { + "name": "Objects conservator", + "domain": "Professional Field" + }, + { + "name": "Oblate", + "domain": "Professional Field" + }, + { + "name": "Observer (meteorological)", + "domain": "Professional Field" + }, + { + "name": "Obstetric hospitalist", + "domain": "Professional Field" + }, + { + "name": "Occupational therapist", + "domain": "Professional Field" + }, + { + "name": "Ocean governance", + "domain": "Professional Field" + }, + { + "name": "Oceanographer", + "domain": "Professional Field" + }, + { + "name": "Ocularist", + "domain": "Professional Field" + }, + { + "name": "Office lady", + "domain": "Professional Field" + }, + { + "name": "Office management", + "domain": "Professional Field" + }, + { + "name": "Officer", + "domain": "Professional Field" + }, + { + "name": "Officer of arms", + "domain": "Professional Field" + }, + { + "name": "Officer of the court", + "domain": "Professional Field" + }, + { + "name": "Officer of the deck", + "domain": "Professional Field" + }, + { + "name": "Official (Canadian football)", + "domain": "Professional Field" + }, + { + "name": "Official (basketball)", + "domain": "Professional Field" + }, + { + "name": "Official (gridiron football)", + "domain": "Professional Field" + }, + { + "name": "Official (ice hockey)", + "domain": "Professional Field" + }, + { + "name": "Official (tennis)", + "domain": "Professional Field" + }, + { + "name": "Official assignee", + "domain": "Professional Field" + }, + { + "name": "Officiant", + "domain": "Professional Field" + }, + { + "name": "Offshore installation manager", + "domain": "Professional Field" + }, + { + "name": "Oidor", + "domain": "Professional Field" + }, + { + "name": "Oiler (occupation)", + "domain": "Professional Field" + }, + { + "name": "Ollam", + "domain": "Professional Field" + }, + { + "name": "Oncologist", + "domain": "Professional Field" + }, + { + "name": "Oncology nursing", + "domain": "Professional Field" + }, + { + "name": "Online community manager", + "domain": "Professional Field" + }, + { + "name": "Online producer", + "domain": "Professional Field" + }, + { + "name": "Onmyōji", + "domain": "Professional Field" + }, + { + "name": "Onna-musha", + "domain": "Professional Field" + }, + { + "name": "Onsen geisha", + "domain": "Professional Field" + }, + { + "name": "Operating department practitioner", + "domain": "Professional Field" + }, + { + "name": "Operative Professional", + "domain": "Professional Field" + }, + { + "name": "Operator (profession)", + "domain": "Professional Field" + }, + { + "name": "Opinion writer", + "domain": "Professional Field" + }, + { + "name": "Oprichnik", + "domain": "Professional Field" + }, + { + "name": "Optician", + "domain": "Professional Field" + }, + { + "name": "Options broker", + "domain": "Professional Field" + }, + { + "name": "Orator", + "domain": "Professional Field" + }, + { + "name": "Orchidologist", + "domain": "Professional Field" + }, + { + "name": "Ordinary seaman", + "domain": "Professional Field" + }, + { + "name": "Organ building", + "domain": "Professional Field" + }, + { + "name": "Organist and master of the choristers", + "domain": "Professional Field" + }, + { + "name": "Organizational hologram", + "domain": "Professional Field" + }, + { + "name": "Ornithologist", + "domain": "Professional Field" + }, + { + "name": "Orthodontist", + "domain": "Professional Field" + }, + { + "name": "Orthodox theologian", + "domain": "Professional Field" + }, + { + "name": "Orthopedic oncologist", + "domain": "Professional Field" + }, + { + "name": "Orthoptist", + "domain": "Professional Field" + }, + { + "name": "Osteologist", + "domain": "Professional Field" + }, + { + "name": "Osteopath", + "domain": "Professional Field" + }, + { + "name": "Otin", + "domain": "Professional Field" + }, + { + "name": "Owarai tarento", + "domain": "Professional Field" + }, + { + "name": "Page (assistance occupation)", + "domain": "Professional Field" + }, + { + "name": "Page-turner", + "domain": "Professional Field" + }, + { + "name": "Pai-de-santo", + "domain": "Professional Field" + }, + { + "name": "Paintings conservator", + "domain": "Professional Field" + }, + { + "name": "Paleontologist", + "domain": "Professional Field" + }, + { + "name": "Pamphleteer", + "domain": "Professional Field" + }, + { + "name": "Panel beater", + "domain": "Professional Field" + }, + { + "name": "Paparazzi", + "domain": "Professional Field" + }, + { + "name": "Paperboy", + "domain": "Professional Field" + }, + { + "name": "Papermaker", + "domain": "Professional Field" + }, + { + "name": "Papyrologist", + "domain": "Professional Field" + }, + { + "name": "Paralegal", + "domain": "Professional Field" + }, + { + "name": "Paraveterinary worker", + "domain": "Professional Field" + }, + { + "name": "Park ranger", + "domain": "Professional Field" + }, + { + "name": "Parking enforcement officer", + "domain": "Professional Field" + }, + { + "name": "Parliamentary counsel", + "domain": "Professional Field" + }, + { + "name": "Party organizer", + "domain": "Professional Field" + }, + { + "name": "Passenger pusher", + "domain": "Professional Field" + }, + { + "name": "Pastor", + "domain": "Professional Field" + }, + { + "name": "Pastry chef", + "domain": "Professional Field" + }, + { + "name": "Patent engineer", + "domain": "Professional Field" + }, + { + "name": "Patent examiner", + "domain": "Professional Field" + }, + { + "name": "Pathologist", + "domain": "Professional Field" + }, + { + "name": "Pathologists' assistant", + "domain": "Professional Field" + }, + { + "name": "Pattern day trader", + "domain": "Professional Field" + }, + { + "name": "Patternmaker (clothing)", + "domain": "Professional Field" + }, + { + "name": "Pawnbroker", + "domain": "Professional Field" + }, + { + "name": "Paymaster", + "domain": "Professional Field" + }, + { + "name": "Paytan", + "domain": "Professional Field" + }, + { + "name": "Peace Commissioner", + "domain": "Professional Field" + }, + { + "name": "Peaceworker", + "domain": "Professional Field" + }, + { + "name": "Pedagogue", + "domain": "Professional Field" + }, + { + "name": "Peddler", + "domain": "Professional Field" + }, + { + "name": "Pediatric nurse practitioner", + "domain": "Professional Field" + }, + { + "name": "Pediatrician", + "domain": "Professional Field" + }, + { + "name": "Pedorthist", + "domain": "Professional Field" + }, + { + "name": "Peer support specialist", + "domain": "Professional Field" + }, + { + "name": "Peintre-graveur", + "domain": "Professional Field" + }, + { + "name": "Penciller", + "domain": "Professional Field" + }, + { + "name": "Pendekar", + "domain": "Professional Field" + }, + { + "name": "Performance artist", + "domain": "Professional Field" + }, + { + "name": "Performing artist", + "domain": "Professional Field" + }, + { + "name": "Perfumer", + "domain": "Professional Field" + }, + { + "name": "Periodeutes", + "domain": "Professional Field" + }, + { + "name": "Permanent deacon", + "domain": "Professional Field" + }, + { + "name": "Personal assistant", + "domain": "Professional Field" + }, + { + "name": "Personal chef", + "domain": "Professional Field" + }, + { + "name": "Personal shopper", + "domain": "Professional Field" + }, + { + "name": "Personal stylist", + "domain": "Professional Field" + }, + { + "name": "Personal trainer", + "domain": "Professional Field" + }, + { + "name": "Petroleum geologist", + "domain": "Professional Field" + }, + { + "name": "Phandi", + "domain": "Professional Field" + }, + { + "name": "Pharmaceutical physician", + "domain": "Professional Field" + }, + { + "name": "Pharmaceutical sales representative", + "domain": "Professional Field" + }, + { + "name": "Pharmaceutical technician", + "domain": "Professional Field" + }, + { + "name": "Pharmacologist", + "domain": "Professional Field" + }, + { + "name": "Pharmacy technician", + "domain": "Professional Field" + }, + { + "name": "Philologist", + "domain": "Professional Field" + }, + { + "name": "Philosopher king", + "domain": "Professional Field" + }, + { + "name": "Philosopher of law", + "domain": "Professional Field" + }, + { + "name": "Philosopher of science", + "domain": "Professional Field" + }, + { + "name": "Phlebologist", + "domain": "Professional Field" + }, + { + "name": "Photograph conservator", + "domain": "Professional Field" + }, + { + "name": "Photojournalist", + "domain": "Professional Field" + }, + { + "name": "Physical chemist", + "domain": "Professional Field" + }, + { + "name": "Physical education teacher", + "domain": "Professional Field" + }, + { + "name": "Physician writer", + "domain": "Professional Field" + }, + { + "name": "Physician-scientist", + "domain": "Professional Field" + }, + { + "name": "Physicist", + "domain": "Professional Field" + }, + { + "name": "Physiologist", + "domain": "Professional Field" + }, + { + "name": "Phytologist", + "domain": "Professional Field" + }, + { + "name": "Picador", + "domain": "Professional Field" + }, + { + "name": "Picture editor", + "domain": "Professional Field" + }, + { + "name": "Pilot in command", + "domain": "Professional Field" + }, + { + "name": "Pilot major", + "domain": "Professional Field" + }, + { + "name": "Pin-up model", + "domain": "Professional Field" + }, + { + "name": "Pioneer (military)", + "domain": "Professional Field" + }, + { + "name": "Pipefitter", + "domain": "Professional Field" + }, + { + "name": "Pipelayer", + "domain": "Professional Field" + }, + { + "name": "Pirquinero", + "domain": "Professional Field" + }, + { + "name": "Pit manager", + "domain": "Professional Field" + }, + { + "name": "Pizzaiolo", + "domain": "Professional Field" + }, + { + "name": "Planner", + "domain": "Professional Field" + }, + { + "name": "Plant breeder", + "domain": "Professional Field" + }, + { + "name": "Plant geneticist", + "domain": "Professional Field" + }, + { + "name": "Plant operator", + "domain": "Professional Field" + }, + { + "name": "Planter class", + "domain": "Professional Field" + }, + { + "name": "Plasterer", + "domain": "Professional Field" + }, + { + "name": "Plastic surgeon", + "domain": "Professional Field" + }, + { + "name": "Platelayer", + "domain": "Professional Field" + }, + { + "name": "Playback singer", + "domain": "Professional Field" + }, + { + "name": "Plotter (RAF)", + "domain": "Professional Field" + }, + { + "name": "Plumber", + "domain": "Professional Field" + }, + { + "name": "Plus-size model", + "domain": "Professional Field" + }, + { + "name": "Pniese", + "domain": "Professional Field" + }, + { + "name": "Podcaster", + "domain": "Professional Field" + }, + { + "name": "Podiatrist", + "domain": "Professional Field" + }, + { + "name": "Poet", + "domain": "Professional Field" + }, + { + "name": "Poetess", + "domain": "Professional Field" + }, + { + "name": "Pole vaulter", + "domain": "Professional Field" + }, + { + "name": "Police commissioner", + "domain": "Professional Field" + }, + { + "name": "Police community support officer", + "domain": "Professional Field" + }, + { + "name": "Police custody and security officer", + "domain": "Professional Field" + }, + { + "name": "Police officer", + "domain": "Professional Field" + }, + { + "name": "Political campaign staff", + "domain": "Professional Field" + }, + { + "name": "Political commissar", + "domain": "Professional Field" + }, + { + "name": "Political editor", + "domain": "Professional Field" + }, + { + "name": "Political historian", + "domain": "Professional Field" + }, + { + "name": "Political pundit", + "domain": "Professional Field" + }, + { + "name": "Political scientist", + "domain": "Professional Field" + }, + { + "name": "Political theorist", + "domain": "Professional Field" + }, + { + "name": "Politician", + "domain": "Professional Field" + }, + { + "name": "Polygraph (author)", + "domain": "Professional Field" + }, + { + "name": "Population geneticist", + "domain": "Professional Field" + }, + { + "name": "Pork-knocker", + "domain": "Professional Field" + }, + { + "name": "Pornographer", + "domain": "Professional Field" + }, + { + "name": "Porteadoras", + "domain": "Professional Field" + }, + { + "name": "Porter (carrier)", + "domain": "Professional Field" + }, + { + "name": "Portfolio manager", + "domain": "Professional Field" + }, + { + "name": "Posek", + "domain": "Professional Field" + }, + { + "name": "Postal clerk (United States Navy)", + "domain": "Professional Field" + }, + { + "name": "Postal worker", + "domain": "Professional Field" + }, + { + "name": "Postdoctoral researcher", + "domain": "Professional Field" + }, + { + "name": "Postelnic", + "domain": "Professional Field" + }, + { + "name": "Poster artist", + "domain": "Professional Field" + }, + { + "name": "Power screed", + "domain": "Professional Field" + }, + { + "name": "Praelector", + "domain": "Professional Field" + }, + { + "name": "Preacher", + "domain": "Professional Field" + }, + { + "name": "Predikant", + "domain": "Professional Field" + }, + { + "name": "Prefect", + "domain": "Professional Field" + }, + { + "name": "Preschool teacher", + "domain": "Professional Field" + }, + { + "name": "Preservation administrator", + "domain": "Professional Field" + }, + { + "name": "Preservationist", + "domain": "Professional Field" + }, + { + "name": "Press agent", + "domain": "Professional Field" + }, + { + "name": "Press secretary", + "domain": "Professional Field" + }, + { + "name": "Primary labor market", + "domain": "Professional Field" + }, + { + "name": "Primicerius", + "domain": "Professional Field" + }, + { + "name": "Principal Private Secretary", + "domain": "Professional Field" + }, + { + "name": "Principal investigator", + "domain": "Professional Field" + }, + { + "name": "Printmaker", + "domain": "Professional Field" + }, + { + "name": "Prison officer", + "domain": "Professional Field" + }, + { + "name": "Prison warden", + "domain": "Professional Field" + }, + { + "name": "Private investigator", + "domain": "Professional Field" + }, + { + "name": "Private secretary", + "domain": "Professional Field" + }, + { + "name": "Privateer", + "domain": "Professional Field" + }, + { + "name": "Probation and parole officer", + "domain": "Professional Field" + }, + { + "name": "Probationary firefighter", + "domain": "Professional Field" + }, + { + "name": "Procurator (Catholic canon law)", + "domain": "Professional Field" + }, + { + "name": "Producer (agriculture)", + "domain": "Professional Field" + }, + { + "name": "Product manager", + "domain": "Professional Field" + }, + { + "name": "Product owner", + "domain": "Professional Field" + }, + { + "name": "Production artist", + "domain": "Professional Field" + }, + { + "name": "Production assistant", + "domain": "Professional Field" + }, + { + "name": "Production coordinator", + "domain": "Professional Field" + }, + { + "name": "Production designer", + "domain": "Professional Field" + }, + { + "name": "Production manager (theatre)", + "domain": "Professional Field" + }, + { + "name": "Professional Scouter (Boy Scouts of America)", + "domain": "Professional Field" + }, + { + "name": "Professional athlete", + "domain": "Professional Field" + }, + { + "name": "Professional audio", + "domain": "Professional Field" + }, + { + "name": "Professional conference organiser", + "domain": "Professional Field" + }, + { + "name": "Professional fitness coach", + "domain": "Professional Field" + }, + { + "name": "Professional golfer", + "domain": "Professional Field" + }, + { + "name": "Professional handler", + "domain": "Professional Field" + }, + { + "name": "Professional mourning", + "domain": "Professional Field" + }, + { + "name": "Professional organizer", + "domain": "Professional Field" + }, + { + "name": "Professional shogi player", + "domain": "Professional Field" + }, + { + "name": "Professional submissive", + "domain": "Professional Field" + }, + { + "name": "Professorial lecturer", + "domain": "Professional Field" + }, + { + "name": "Program director", + "domain": "Professional Field" + }, + { + "name": "Programmer", + "domain": "Professional Field" + }, + { + "name": "Project architect", + "domain": "Professional Field" + }, + { + "name": "Project manager", + "domain": "Professional Field" + }, + { + "name": "Promoter (entertainment)", + "domain": "Professional Field" + }, + { + "name": "Promotional model", + "domain": "Professional Field" + }, + { + "name": "Prop design", + "domain": "Professional Field" + }, + { + "name": "Propagandist", + "domain": "Professional Field" + }, + { + "name": "Property developer", + "domain": "Professional Field" + }, + { + "name": "Property manager", + "domain": "Professional Field" + }, + { + "name": "Property master", + "domain": "Professional Field" + }, + { + "name": "Prophet", + "domain": "Professional Field" + }, + { + "name": "Prophets and messengers in Islam", + "domain": "Professional Field" + }, + { + "name": "Prosector", + "domain": "Professional Field" + }, + { + "name": "Prosthetist", + "domain": "Professional Field" + }, + { + "name": "Prostitute", + "domain": "Professional Field" + }, + { + "name": "Protistologist", + "domain": "Professional Field" + }, + { + "name": "Provost (education)", + "domain": "Professional Field" + }, + { + "name": "Psychiatric-mental health nurse practitioner", + "domain": "Professional Field" + }, + { + "name": "Psychiatrist", + "domain": "Professional Field" + }, + { + "name": "Psychoanalyst", + "domain": "Professional Field" + }, + { + "name": "Psycholinguist", + "domain": "Professional Field" + }, + { + "name": "Psychologist", + "domain": "Professional Field" + }, + { + "name": "Psychopathologist", + "domain": "Professional Field" + }, + { + "name": "Psychopedagogue", + "domain": "Professional Field" + }, + { + "name": "Psychotherapist", + "domain": "Professional Field" + }, + { + "name": "Public affairs (military)", + "domain": "Professional Field" + }, + { + "name": "Public analyst", + "domain": "Professional Field" + }, + { + "name": "Public historian", + "domain": "Professional Field" + }, + { + "name": "Public information officer", + "domain": "Professional Field" + }, + { + "name": "Publicist", + "domain": "Professional Field" + }, + { + "name": "Publisher's reader", + "domain": "Professional Field" + }, + { + "name": "Pulmonary scientist", + "domain": "Professional Field" + }, + { + "name": "Pumpman", + "domain": "Professional Field" + }, + { + "name": "Punchcutting", + "domain": "Professional Field" + }, + { + "name": "Pundit", + "domain": "Professional Field" + }, + { + "name": "Pundit (explorer)", + "domain": "Professional Field" + }, + { + "name": "Puppet designer", + "domain": "Professional Field" + }, + { + "name": "Puppeteer", + "domain": "Professional Field" + }, + { + "name": "Purchasing manager", + "domain": "Professional Field" + }, + { + "name": "Purser", + "domain": "Professional Field" + }, + { + "name": "Pyrotechnician", + "domain": "Professional Field" + }, + { + "name": "Qadi", + "domain": "Professional Field" + }, + { + "name": "Qing literati", + "domain": "Professional Field" + }, + { + "name": "Quaestor (European Parliament)", + "domain": "Professional Field" + }, + { + "name": "Qualified Person Responsible For Pharmacovigilance", + "domain": "Professional Field" + }, + { + "name": "Qualified Person for Pharmacovigilance", + "domain": "Professional Field" + }, + { + "name": "Qualified person (European Union)", + "domain": "Professional Field" + }, + { + "name": "Quality control coach", + "domain": "Professional Field" + }, + { + "name": "Quantity surveyor", + "domain": "Professional Field" + }, + { + "name": "Qāriʾ", + "domain": "Professional Field" + }, + { + "name": "Rabbi", + "domain": "Professional Field" + }, + { + "name": "Race director", + "domain": "Professional Field" + }, + { + "name": "Race engineer", + "domain": "Professional Field" + }, + { + "name": "Racing driver", + "domain": "Professional Field" + }, + { + "name": "Radiation therapist", + "domain": "Professional Field" + }, + { + "name": "Radio operator", + "domain": "Professional Field" + }, + { + "name": "Radio personality", + "domain": "Professional Field" + }, + { + "name": "Radio producer", + "domain": "Professional Field" + }, + { + "name": "Radiologist", + "domain": "Professional Field" + }, + { + "name": "Radioman", + "domain": "Professional Field" + }, + { + "name": "Rag-and-bone man", + "domain": "Professional Field" + }, + { + "name": "Ragi (Sikhism)", + "domain": "Professional Field" + }, + { + "name": "Ragpicker", + "domain": "Professional Field" + }, + { + "name": "Rapporteur", + "domain": "Professional Field" + }, + { + "name": "Rasūl", + "domain": "Professional Field" + }, + { + "name": "Rat-catcher", + "domain": "Professional Field" + }, + { + "name": "Reactor operator", + "domain": "Professional Field" + }, + { + "name": "Reader (academic rank)", + "domain": "Professional Field" + }, + { + "name": "Real estate agent", + "domain": "Professional Field" + }, + { + "name": "Real estate appraiser", + "domain": "Professional Field" + }, + { + "name": "Real estate entrepreneur", + "domain": "Professional Field" + }, + { + "name": "Real-life superhero", + "domain": "Professional Field" + }, + { + "name": "Receiver general", + "domain": "Professional Field" + }, + { + "name": "Receivership", + "domain": "Professional Field" + }, + { + "name": "Receptionist", + "domain": "Professional Field" + }, + { + "name": "Records manager", + "domain": "Professional Field" + }, + { + "name": "Recruiting sergeant", + "domain": "Professional Field" + }, + { + "name": "Recurring status", + "domain": "Professional Field" + }, + { + "name": "Referee", + "domain": "Professional Field" + }, + { + "name": "Referee (association football)", + "domain": "Professional Field" + }, + { + "name": "Referee (boxing)", + "domain": "Professional Field" + }, + { + "name": "Referee (futsal)", + "domain": "Professional Field" + }, + { + "name": "Referee (professional wrestling)", + "domain": "Professional Field" + }, + { + "name": "Reference librarian", + "domain": "Professional Field" + }, + { + "name": "Reflexologist", + "domain": "Professional Field" + }, + { + "name": "Regent", + "domain": "Professional Field" + }, + { + "name": "Registered dental nurse", + "domain": "Professional Field" + }, + { + "name": "Registered dietitian", + "domain": "Professional Field" + }, + { + "name": "Registered health information administrator", + "domain": "Professional Field" + }, + { + "name": "Registered professional liability underwriter", + "domain": "Professional Field" + }, + { + "name": "Registered psychiatric nurse", + "domain": "Professional Field" + }, + { + "name": "Registered representative (securities)", + "domain": "Professional Field" + }, + { + "name": "Registered respiratory therapist", + "domain": "Professional Field" + }, + { + "name": "Registrar (cultural property)", + "domain": "Professional Field" + }, + { + "name": "Registrar (education)", + "domain": "Professional Field" + }, + { + "name": "Registrar (law)", + "domain": "Professional Field" + }, + { + "name": "Rehabilitation assistant", + "domain": "Professional Field" + }, + { + "name": "Reiki Master", + "domain": "Professional Field" + }, + { + "name": "Reindeer herders", + "domain": "Professional Field" + }, + { + "name": "Remote area nurse (Australia)", + "domain": "Professional Field" + }, + { + "name": "Remèr", + "domain": "Professional Field" + }, + { + "name": "Reporter", + "domain": "Professional Field" + }, + { + "name": "Rescuer", + "domain": "Professional Field" + }, + { + "name": "Research associate", + "domain": "Professional Field" + }, + { + "name": "Research fellow", + "domain": "Professional Field" + }, + { + "name": "Research professor", + "domain": "Professional Field" + }, + { + "name": "Resident doctor (United Kingdom)", + "domain": "Professional Field" + }, + { + "name": "Resident engineer", + "domain": "Professional Field" + }, + { + "name": "Resident judge", + "domain": "Professional Field" + }, + { + "name": "Resident magistrate", + "domain": "Professional Field" + }, + { + "name": "Respiratory therapist", + "domain": "Professional Field" + }, + { + "name": "Restaurateur", + "domain": "Professional Field" + }, + { + "name": "Retailer", + "domain": "Professional Field" + }, + { + "name": "Reverification", + "domain": "Professional Field" + }, + { + "name": "Rewrite man", + "domain": "Professional Field" + }, + { + "name": "Rheumatologist", + "domain": "Professional Field" + }, + { + "name": "Riding instructor", + "domain": "Professional Field" + }, + { + "name": "Riding mechanic", + "domain": "Professional Field" + }, + { + "name": "Rigger (industry)", + "domain": "Professional Field" + }, + { + "name": "Rikishi", + "domain": "Professional Field" + }, + { + "name": "Riksråd", + "domain": "Professional Field" + }, + { + "name": "Ring announcer", + "domain": "Professional Field" + }, + { + "name": "Ringmaster (circus)", + "domain": "Professional Field" + }, + { + "name": "Road crew", + "domain": "Professional Field" + }, + { + "name": "Road manager", + "domain": "Professional Field" + }, + { + "name": "Roboticist", + "domain": "Professional Field" + }, + { + "name": "Rocket science (finance)", + "domain": "Professional Field" + }, + { + "name": "Rogue trader", + "domain": "Professional Field" + }, + { + "name": "Roman usurper", + "domain": "Professional Field" + }, + { + "name": "Romologist", + "domain": "Professional Field" + }, + { + "name": "Rope access technician", + "domain": "Professional Field" + }, + { + "name": "Ropemaker", + "domain": "Professional Field" + }, + { + "name": "Rosh mesivta", + "domain": "Professional Field" + }, + { + "name": "Rosh yeshiva", + "domain": "Professional Field" + }, + { + "name": "Rower woman", + "domain": "Professional Field" + }, + { + "name": "Royal chef", + "domain": "Professional Field" + }, + { + "name": "Rugby league match officials", + "domain": "Professional Field" + }, + { + "name": "Rugby union match officials", + "domain": "Professional Field" + }, + { + "name": "Rugby union player", + "domain": "Professional Field" + }, + { + "name": "Runemaster", + "domain": "Professional Field" + }, + { + "name": "Runologist", + "domain": "Professional Field" + }, + { + "name": "Répétiteur", + "domain": "Professional Field" + }, + { + "name": "Rāwī", + "domain": "Professional Field" + }, + { + "name": "SEO specialist", + "domain": "Professional Field" + }, + { + "name": "Safety engineer", + "domain": "Professional Field" + }, + { + "name": "Sailmaker", + "domain": "Professional Field" + }, + { + "name": "Sailor", + "domain": "Professional Field" + }, + { + "name": "Sales manager", + "domain": "Professional Field" + }, + { + "name": "Salesman", + "domain": "Professional Field" + }, + { + "name": "Saloon keeper", + "domain": "Professional Field" + }, + { + "name": "Samurai", + "domain": "Professional Field" + }, + { + "name": "Sandal-bearer", + "domain": "Professional Field" + }, + { + "name": "Sandhog", + "domain": "Professional Field" + }, + { + "name": "Sanitation worker", + "domain": "Professional Field" + }, + { + "name": "Scenes of crime officer", + "domain": "Professional Field" + }, + { + "name": "Scenographer", + "domain": "Professional Field" + }, + { + "name": "Scharfrichter", + "domain": "Professional Field" + }, + { + "name": "Scholar-official", + "domain": "Professional Field" + }, + { + "name": "School business manager", + "domain": "Professional Field" + }, + { + "name": "School counselor", + "domain": "Professional Field" + }, + { + "name": "School psychologist", + "domain": "Professional Field" + }, + { + "name": "School social work", + "domain": "Professional Field" + }, + { + "name": "School teacher", + "domain": "Professional Field" + }, + { + "name": "Schoolmaster", + "domain": "Professional Field" + }, + { + "name": "Schout", + "domain": "Professional Field" + }, + { + "name": "Schout-bij-nacht", + "domain": "Professional Field" + }, + { + "name": "Schulklopfer", + "domain": "Professional Field" + }, + { + "name": "Schützen (military)", + "domain": "Professional Field" + }, + { + "name": "Science communicator", + "domain": "Professional Field" + }, + { + "name": "Science technician", + "domain": "Professional Field" + }, + { + "name": "Scientist", + "domain": "Professional Field" + }, + { + "name": "Scissor grinder", + "domain": "Professional Field" + }, + { + "name": "Scorer", + "domain": "Professional Field" + }, + { + "name": "Scout (association football)", + "domain": "Professional Field" + }, + { + "name": "Scout (sport)", + "domain": "Professional Field" + }, + { + "name": "Screen printer", + "domain": "Professional Field" + }, + { + "name": "Script analyst", + "domain": "Professional Field" + }, + { + "name": "Script doctor", + "domain": "Professional Field" + }, + { + "name": "Script supervisor", + "domain": "Professional Field" + }, + { + "name": "Scrutineer", + "domain": "Professional Field" + }, + { + "name": "Scuba diving", + "domain": "Professional Field" + }, + { + "name": "Sea captain", + "domain": "Professional Field" + }, + { + "name": "Second engineer", + "domain": "Professional Field" + }, + { + "name": "Second unit", + "domain": "Professional Field" + }, + { + "name": "Secondman", + "domain": "Professional Field" + }, + { + "name": "Secretary", + "domain": "Professional Field" + }, + { + "name": "Secretary to the Government of Bangladesh", + "domain": "Professional Field" + }, + { + "name": "Secular canon", + "domain": "Professional Field" + }, + { + "name": "Security guard", + "domain": "Professional Field" + }, + { + "name": "Sediari", + "domain": "Professional Field" + }, + { + "name": "Seignory", + "domain": "Professional Field" + }, + { + "name": "Selector (cricket)", + "domain": "Professional Field" + }, + { + "name": "Selector (sport)", + "domain": "Professional Field" + }, + { + "name": "Sell-side analyst", + "domain": "Professional Field" + }, + { + "name": "Semanticist", + "domain": "Professional Field" + }, + { + "name": "Semiotician", + "domain": "Professional Field" + }, + { + "name": "Seneschal", + "domain": "Professional Field" + }, + { + "name": "Senior agent", + "domain": "Professional Field" + }, + { + "name": "Senior house officer", + "domain": "Professional Field" + }, + { + "name": "Senior lecturer", + "domain": "Professional Field" + }, + { + "name": "Senior station officer", + "domain": "Professional Field" + }, + { + "name": "Serjeant-at-arms", + "domain": "Professional Field" + }, + { + "name": "Server administrator", + "domain": "Professional Field" + }, + { + "name": "Sessional lecturer", + "domain": "Professional Field" + }, + { + "name": "Set dresser", + "domain": "Professional Field" + }, + { + "name": "Sex columnist", + "domain": "Professional Field" + }, + { + "name": "Sex therapist", + "domain": "Professional Field" + }, + { + "name": "Sexologist", + "domain": "Professional Field" + }, + { + "name": "Sexual assistance", + "domain": "Professional Field" + }, + { + "name": "Shadow rapporteur", + "domain": "Professional Field" + }, + { + "name": "Shahbandar", + "domain": "Professional Field" + }, + { + "name": "Shakespearean scholar", + "domain": "Professional Field" + }, + { + "name": "Sharper", + "domain": "Professional Field" + }, + { + "name": "Sharpshooter", + "domain": "Professional Field" + }, + { + "name": "Shayar (poet)", + "domain": "Professional Field" + }, + { + "name": "Sheep shearer", + "domain": "Professional Field" + }, + { + "name": "Shepherd", + "domain": "Professional Field" + }, + { + "name": "Sheriff", + "domain": "Professional Field" + }, + { + "name": "Ship chandler", + "domain": "Professional Field" + }, + { + "name": "Ship's company", + "domain": "Professional Field" + }, + { + "name": "Ship-owner", + "domain": "Professional Field" + }, + { + "name": "Shipfitter", + "domain": "Professional Field" + }, + { + "name": "Shipping agency", + "domain": "Professional Field" + }, + { + "name": "Shirabyōshi", + "domain": "Professional Field" + }, + { + "name": "Shop foreman", + "domain": "Professional Field" + }, + { + "name": "Shopkeeper", + "domain": "Professional Field" + }, + { + "name": "Short story writer", + "domain": "Professional Field" + }, + { + "name": "Showgirl", + "domain": "Professional Field" + }, + { + "name": "Showman", + "domain": "Professional Field" + }, + { + "name": "Showrunner", + "domain": "Professional Field" + }, + { + "name": "Sideline reporter", + "domain": "Professional Field" + }, + { + "name": "Sign language interpreter", + "domain": "Professional Field" + }, + { + "name": "Signalman", + "domain": "Professional Field" + }, + { + "name": "Signing agent", + "domain": "Professional Field" + }, + { + "name": "Silkwoman", + "domain": "Professional Field" + }, + { + "name": "Silovik", + "domain": "Professional Field" + }, + { + "name": "Silver surfer (internet user)", + "domain": "Professional Field" + }, + { + "name": "Silversmith", + "domain": "Professional Field" + }, + { + "name": "Site manager", + "domain": "Professional Field" + }, + { + "name": "Sivilingeniør", + "domain": "Professional Field" + }, + { + "name": "Siviløkonom", + "domain": "Professional Field" + }, + { + "name": "Skald", + "domain": "Professional Field" + }, + { + "name": "Skateboarder", + "domain": "Professional Field" + }, + { + "name": "Ski patrol", + "domain": "Professional Field" + }, + { + "name": "Skilled worker", + "domain": "Professional Field" + }, + { + "name": "Skinner (profession)", + "domain": "Professional Field" + }, + { + "name": "Sky marshal", + "domain": "Professional Field" + }, + { + "name": "Skycap", + "domain": "Professional Field" + }, + { + "name": "Slater", + "domain": "Professional Field" + }, + { + "name": "Slave catcher", + "domain": "Professional Field" + }, + { + "name": "Slave catcher (Brazil)", + "domain": "Professional Field" + }, + { + "name": "Sleeper agent", + "domain": "Professional Field" + }, + { + "name": "Sluggard waker", + "domain": "Professional Field" + }, + { + "name": "Smokejumper", + "domain": "Professional Field" + }, + { + "name": "Snake charming", + "domain": "Professional Field" + }, + { + "name": "Sniper", + "domain": "Professional Field" + }, + { + "name": "Soaper", + "domain": "Professional Field" + }, + { + "name": "Social anthropologist", + "domain": "Professional Field" + }, + { + "name": "Social psychologist", + "domain": "Professional Field" + }, + { + "name": "Social worker", + "domain": "Professional Field" + }, + { + "name": "Sociologist", + "domain": "Professional Field" + }, + { + "name": "Sodbuster", + "domain": "Professional Field" + }, + { + "name": "Sofer", + "domain": "Professional Field" + }, + { + "name": "Software analyst", + "domain": "Professional Field" + }, + { + "name": "Software architect", + "domain": "Professional Field" + }, + { + "name": "Software engineer", + "domain": "Professional Field" + }, + { + "name": "Solicitor advocate", + "domain": "Professional Field" + }, + { + "name": "Somatophylakes", + "domain": "Professional Field" + }, + { + "name": "Sommelier", + "domain": "Professional Field" + }, + { + "name": "Song plugger", + "domain": "Professional Field" + }, + { + "name": "Songster", + "domain": "Professional Field" + }, + { + "name": "Sonographer", + "domain": "Professional Field" + }, + { + "name": "Sound editor (filmmaking)", + "domain": "Professional Field" + }, + { + "name": "Sous-chef", + "domain": "Professional Field" + }, + { + "name": "Spearman (military)", + "domain": "Professional Field" + }, + { + "name": "Special Investigations Officer (The Netherlands)", + "domain": "Professional Field" + }, + { + "name": "Special adviser (Norway)", + "domain": "Professional Field" + }, + { + "name": "Special agent", + "domain": "Professional Field" + }, + { + "name": "Special constable", + "domain": "Professional Field" + }, + { + "name": "Special effects supervisor", + "domain": "Professional Field" + }, + { + "name": "Speech and language therapist", + "domain": "Professional Field" + }, + { + "name": "Speechwriter", + "domain": "Professional Field" + }, + { + "name": "Spiritual direction", + "domain": "Professional Field" + }, + { + "name": "Spokesperson", + "domain": "Professional Field" + }, + { + "name": "Sport cyclist", + "domain": "Professional Field" + }, + { + "name": "Sport shooter", + "domain": "Professional Field" + }, + { + "name": "Sporting director", + "domain": "Professional Field" + }, + { + "name": "Sports agent", + "domain": "Professional Field" + }, + { + "name": "Sports analyst", + "domain": "Professional Field" + }, + { + "name": "Sports chaplain", + "domain": "Professional Field" + }, + { + "name": "Sports commentator", + "domain": "Professional Field" + }, + { + "name": "Sports information director", + "domain": "Professional Field" + }, + { + "name": "Sports journalist", + "domain": "Professional Field" + }, + { + "name": "Spotlight operator", + "domain": "Professional Field" + }, + { + "name": "Spy", + "domain": "Professional Field" + }, + { + "name": "Staff writer", + "domain": "Professional Field" + }, + { + "name": "Stage magician", + "domain": "Professional Field" + }, + { + "name": "Stamp dealer", + "domain": "Professional Field" + }, + { + "name": "Stand-up comedian", + "domain": "Professional Field" + }, + { + "name": "State Counsel (Sri Lanka)", + "domain": "Professional Field" + }, + { + "name": "State Public Works Engineering Corps (France)", + "domain": "Professional Field" + }, + { + "name": "State epidemiologist (Sweden)", + "domain": "Professional Field" + }, + { + "name": "Station house officer", + "domain": "Professional Field" + }, + { + "name": "Station master", + "domain": "Professional Field" + }, + { + "name": "Stationary engineer", + "domain": "Professional Field" + }, + { + "name": "Statistician", + "domain": "Professional Field" + }, + { + "name": "Statsfru", + "domain": "Professional Field" + }, + { + "name": "Statutory auditor", + "domain": "Professional Field" + }, + { + "name": "Stavilac", + "domain": "Professional Field" + }, + { + "name": "Steel fixer", + "domain": "Professional Field" + }, + { + "name": "Steel monkey", + "domain": "Professional Field" + }, + { + "name": "Steeplejack", + "domain": "Professional Field" + }, + { + "name": "Steiger (mining)", + "domain": "Professional Field" + }, + { + "name": "Stenographer", + "domain": "Professional Field" + }, + { + "name": "Stereographer", + "domain": "Professional Field" + }, + { + "name": "Steward's assistant", + "domain": "Professional Field" + }, + { + "name": "Stock and station agency", + "domain": "Professional Field" + }, + { + "name": "Stock trader", + "domain": "Professional Field" + }, + { + "name": "Stockbroker", + "domain": "Professional Field" + }, + { + "name": "Stockman (Australia)", + "domain": "Professional Field" + }, + { + "name": "Stodderkonge", + "domain": "Professional Field" + }, + { + "name": "Store manager", + "domain": "Professional Field" + }, + { + "name": "Storm chasing", + "domain": "Professional Field" + }, + { + "name": "Story artist", + "domain": "Professional Field" + }, + { + "name": "Story editor", + "domain": "Professional Field" + }, + { + "name": "Storyboard artist", + "domain": "Professional Field" + }, + { + "name": "Strategist", + "domain": "Professional Field" + }, + { + "name": "Street artist", + "domain": "Professional Field" + }, + { + "name": "Street warden", + "domain": "Professional Field" + }, + { + "name": "Strength and conditioning coach", + "domain": "Professional Field" + }, + { + "name": "Strength athlete", + "domain": "Professional Field" + }, + { + "name": "Stretcher bearer", + "domain": "Professional Field" + }, + { + "name": "Stripper", + "domain": "Professional Field" + }, + { + "name": "Strongman", + "domain": "Professional Field" + }, + { + "name": "Strongwoman", + "domain": "Professional Field" + }, + { + "name": "Structural engineer", + "domain": "Professional Field" + }, + { + "name": "Structurer", + "domain": "Professional Field" + }, + { + "name": "Student affairs", + "domain": "Professional Field" + }, + { + "name": "Student leader", + "domain": "Professional Field" + }, + { + "name": "Student teacher", + "domain": "Professional Field" + }, + { + "name": "Studio executive", + "domain": "Professional Field" + }, + { + "name": "Studio floor manager", + "domain": "Professional Field" + }, + { + "name": "Studio manager", + "domain": "Professional Field" + }, + { + "name": "Stunt coordinator", + "domain": "Professional Field" + }, + { + "name": "Stunt double", + "domain": "Professional Field" + }, + { + "name": "Subject librarian", + "domain": "Professional Field" + }, + { + "name": "Subject-matter expert", + "domain": "Professional Field" + }, + { + "name": "Subprefect", + "domain": "Professional Field" + }, + { + "name": "Subsurface engineer", + "domain": "Professional Field" + }, + { + "name": "Succentor", + "domain": "Professional Field" + }, + { + "name": "Sugar painting", + "domain": "Professional Field" + }, + { + "name": "Sugar-baker", + "domain": "Professional Field" + }, + { + "name": "Suit actor", + "domain": "Professional Field" + }, + { + "name": "Super Sodbuster", + "domain": "Professional Field" + }, + { + "name": "Superintendent (Christianity)", + "domain": "Professional Field" + }, + { + "name": "Superintendent (education)", + "domain": "Professional Field" + }, + { + "name": "Superintendent (jail)", + "domain": "Professional Field" + }, + { + "name": "Supermodel", + "domain": "Professional Field" + }, + { + "name": "Superstar", + "domain": "Professional Field" + }, + { + "name": "Supervisor", + "domain": "Professional Field" + }, + { + "name": "Supporting actor", + "domain": "Professional Field" + }, + { + "name": "Surfboard shaper", + "domain": "Professional Field" + }, + { + "name": "Surgeon-superintendent", + "domain": "Professional Field" + }, + { + "name": "Surgical nursing", + "domain": "Professional Field" + }, + { + "name": "Survey methodologist", + "domain": "Professional Field" + }, + { + "name": "Sustainability consultant", + "domain": "Professional Field" + }, + { + "name": "Swimming pool service technician", + "domain": "Professional Field" + }, + { + "name": "Switchboard operator", + "domain": "Professional Field" + }, + { + "name": "Sword swallowing", + "domain": "Professional Field" + }, + { + "name": "Syndic", + "domain": "Professional Field" + }, + { + "name": "Syntactician", + "domain": "Professional Field" + }, + { + "name": "System administrator", + "domain": "Professional Field" + }, + { + "name": "Systems analyst", + "domain": "Professional Field" + }, + { + "name": "Systems architect", + "domain": "Professional Field" + }, + { + "name": "Systems integrator", + "domain": "Professional Field" + }, + { + "name": "Sėsėn", + "domain": "Professional Field" + }, + { + "name": "Tackler", + "domain": "Professional Field" + }, + { + "name": "Taffeltäckare", + "domain": "Professional Field" + }, + { + "name": "Tagarrabt", + "domain": "Professional Field" + }, + { + "name": "Taikomochi", + "domain": "Professional Field" + }, + { + "name": "Taikonaut", + "domain": "Professional Field" + }, + { + "name": "Tail gunner", + "domain": "Professional Field" + }, + { + "name": "Tailor", + "domain": "Professional Field" + }, + { + "name": "Talent agent", + "domain": "Professional Field" + }, + { + "name": "Tangutologist", + "domain": "Professional Field" + }, + { + "name": "Tanner (occupation)", + "domain": "Professional Field" + }, + { + "name": "Tattoo artist", + "domain": "Professional Field" + }, + { + "name": "Tawananna", + "domain": "Professional Field" + }, + { + "name": "Tax advisor", + "domain": "Professional Field" + }, + { + "name": "Tax collector", + "domain": "Professional Field" + }, + { + "name": "Taxicab driver", + "domain": "Professional Field" + }, + { + "name": "Taxidermist", + "domain": "Professional Field" + }, + { + "name": "Tea lady", + "domain": "Professional Field" + }, + { + "name": "Teacher", + "domain": "Professional Field" + }, + { + "name": "Teaching artist", + "domain": "Professional Field" + }, + { + "name": "Teaching assistant", + "domain": "Professional Field" + }, + { + "name": "Teaching assistant (United Kingdom)", + "domain": "Professional Field" + }, + { + "name": "Teaching associate", + "domain": "Professional Field" + }, + { + "name": "Teaching fellow", + "domain": "Professional Field" + }, + { + "name": "Teamster", + "domain": "Professional Field" + }, + { + "name": "Technical advisor", + "domain": "Professional Field" + }, + { + "name": "Technical director", + "domain": "Professional Field" + }, + { + "name": "Technical writer", + "domain": "Professional Field" + }, + { + "name": "Technician", + "domain": "Professional Field" + }, + { + "name": "Technicien supérieur des études et de l'exploitation de l'aviation civile", + "domain": "Professional Field" + }, + { + "name": "Technicien supérieur de l'aviation", + "domain": "Professional Field" + }, + { + "name": "Technology evangelist", + "domain": "Professional Field" + }, + { + "name": "Technology specialist", + "domain": "Professional Field" + }, + { + "name": "Television actor", + "domain": "Professional Field" + }, + { + "name": "Television director", + "domain": "Professional Field" + }, + { + "name": "Television personalities in Japan", + "domain": "Professional Field" + }, + { + "name": "Television producer", + "domain": "Professional Field" + }, + { + "name": "Television show creator", + "domain": "Professional Field" + }, + { + "name": "Tennis player", + "domain": "Professional Field" + }, + { + "name": "Tenor", + "domain": "Professional Field" + }, + { + "name": "Territorial lord", + "domain": "Professional Field" + }, + { + "name": "Test driver", + "domain": "Professional Field" + }, + { + "name": "Test pilot", + "domain": "Professional Field" + }, + { + "name": "Textile conservator", + "domain": "Professional Field" + }, + { + "name": "Thatcher (profession)", + "domain": "Professional Field" + }, + { + "name": "Theater manager", + "domain": "Professional Field" + }, + { + "name": "Theatre director", + "domain": "Professional Field" + }, + { + "name": "Theatre practitioner", + "domain": "Professional Field" + }, + { + "name": "Theatrical company management", + "domain": "Professional Field" + }, + { + "name": "Theatrical producer", + "domain": "Professional Field" + }, + { + "name": "Theologian", + "domain": "Professional Field" + }, + { + "name": "Thermodynamicist", + "domain": "Professional Field" + }, + { + "name": "Thief-taker", + "domain": "Professional Field" + }, + { + "name": "Thyle", + "domain": "Professional Field" + }, + { + "name": "Thyroidologist", + "domain": "Professional Field" + }, + { + "name": "Tinker", + "domain": "Professional Field" + }, + { + "name": "Tinsmith", + "domain": "Professional Field" + }, + { + "name": "Tipster", + "domain": "Professional Field" + }, + { + "name": "Tirailleur", + "domain": "Professional Field" + }, + { + "name": "Toastmaster", + "domain": "Professional Field" + }, + { + "name": "Tokoyama", + "domain": "Professional Field" + }, + { + "name": "Tolpatch", + "domain": "Professional Field" + }, + { + "name": "Tonmeister", + "domain": "Professional Field" + }, + { + "name": "Tool and die maker", + "domain": "Professional Field" + }, + { + "name": "Tool pusher", + "domain": "Professional Field" + }, + { + "name": "Tour guide", + "domain": "Professional Field" + }, + { + "name": "Tour manager", + "domain": "Professional Field" + }, + { + "name": "Track access controller", + "domain": "Professional Field" + }, + { + "name": "Track and field official", + "domain": "Professional Field" + }, + { + "name": "Trader (finance)", + "domain": "Professional Field" + }, + { + "name": "Traditional birth attendant", + "domain": "Professional Field" + }, + { + "name": "Traffic guard", + "domain": "Professional Field" + }, + { + "name": "Train dispatcher", + "domain": "Professional Field" + }, + { + "name": "Train driver", + "domain": "Professional Field" + }, + { + "name": "Trainee solicitor", + "domain": "Professional Field" + }, + { + "name": "Trainer (business)", + "domain": "Professional Field" + }, + { + "name": "Traiteur (culinary profession)", + "domain": "Professional Field" + }, + { + "name": "Trampolinist", + "domain": "Professional Field" + }, + { + "name": "Translator", + "domain": "Professional Field" + }, + { + "name": "Transplant surgeon", + "domain": "Professional Field" + }, + { + "name": "Transport planning professional (UK)", + "domain": "Professional Field" + }, + { + "name": "Traumatologist", + "domain": "Professional Field" + }, + { + "name": "Travel influencer", + "domain": "Professional Field" + }, + { + "name": "Treasurer", + "domain": "Professional Field" + }, + { + "name": "Tricoteuse", + "domain": "Professional Field" + }, + { + "name": "Trip sitter", + "domain": "Professional Field" + }, + { + "name": "Trobairitz", + "domain": "Professional Field" + }, + { + "name": "Tropeiro", + "domain": "Professional Field" + }, + { + "name": "Truck driver", + "domain": "Professional Field" + }, + { + "name": "Trust fund manager", + "domain": "Professional Field" + }, + { + "name": "Trustee", + "domain": "Professional Field" + }, + { + "name": "Tutor (education)", + "domain": "Professional Field" + }, + { + "name": "Tutoring", + "domain": "Professional Field" + }, + { + "name": "UN Women Goodwill Ambassador", + "domain": "Professional Field" + }, + { + "name": "UNDP Goodwill Ambassador", + "domain": "Professional Field" + }, + { + "name": "UNESCO Artist for Peace", + "domain": "Professional Field" + }, + { + "name": "UNESCO Champion for Sport", + "domain": "Professional Field" + }, + { + "name": "UNESCO Special Envoy", + "domain": "Professional Field" + }, + { + "name": "UNFPA Goodwill Ambassador", + "domain": "Professional Field" + }, + { + "name": "UNICEF Goodwill Ambassador", + "domain": "Professional Field" + }, + { + "name": "UNIDO Goodwill Ambassador", + "domain": "Professional Field" + }, + { + "name": "UNODC Goodwill Ambassador", + "domain": "Professional Field" + }, + { + "name": "Umpire (Australian rules football)", + "domain": "Professional Field" + }, + { + "name": "Umpire (baseball)", + "domain": "Professional Field" + }, + { + "name": "Umpire (cricket)", + "domain": "Professional Field" + }, + { + "name": "Umpire (field hockey)", + "domain": "Professional Field" + }, + { + "name": "Undersuit", + "domain": "Professional Field" + }, + { + "name": "Union representative", + "domain": "Professional Field" + }, + { + "name": "Unit production manager", + "domain": "Professional Field" + }, + { + "name": "Urban planner", + "domain": "Professional Field" + }, + { + "name": "Useful man", + "domain": "Professional Field" + }, + { + "name": "Utility sound technician", + "domain": "Professional Field" + }, + { + "name": "VFX creative director", + "domain": "Professional Field" + }, + { + "name": "Valet", + "domain": "Professional Field" + }, + { + "name": "Valet de chambre", + "domain": "Professional Field" + }, + { + "name": "Vaquero", + "domain": "Professional Field" + }, + { + "name": "Vascular surgeon", + "domain": "Professional Field" + }, + { + "name": "Venereologist", + "domain": "Professional Field" + }, + { + "name": "Ventriloquist", + "domain": "Professional Field" + }, + { + "name": "Verderer", + "domain": "Professional Field" + }, + { + "name": "Versatilist", + "domain": "Professional Field" + }, + { + "name": "Veterinary pharmacist", + "domain": "Professional Field" + }, + { + "name": "Veterinary specialties", + "domain": "Professional Field" + }, + { + "name": "Vexillologist", + "domain": "Professional Field" + }, + { + "name": "Vicar", + "domain": "Professional Field" + }, + { + "name": "Vice-chancellor", + "domain": "Professional Field" + }, + { + "name": "Video assistant referee", + "domain": "Professional Field" + }, + { + "name": "Video blogger", + "domain": "Professional Field" + }, + { + "name": "Video editor", + "domain": "Professional Field" + }, + { + "name": "Video essayist", + "domain": "Professional Field" + }, + { + "name": "Video game designer", + "domain": "Professional Field" + }, + { + "name": "Video game producer", + "domain": "Professional Field" + }, + { + "name": "Video game programmer", + "domain": "Professional Field" + }, + { + "name": "Video jockey", + "domain": "Professional Field" + }, + { + "name": "Videographer", + "domain": "Professional Field" + }, + { + "name": "Vigneron", + "domain": "Professional Field" + }, + { + "name": "Violist", + "domain": "Professional Field" + }, + { + "name": "Virtual assistant (occupation)", + "domain": "Professional Field" + }, + { + "name": "Visitor", + "domain": "Professional Field" + }, + { + "name": "Visual effects art director", + "domain": "Professional Field" + }, + { + "name": "Visual effects supervisor", + "domain": "Professional Field" + }, + { + "name": "Vocalist", + "domain": "Professional Field" + }, + { + "name": "Vocaloid producer", + "domain": "Professional Field" + }, + { + "name": "Voice acting in Japan", + "domain": "Professional Field" + }, + { + "name": "Volapükologist", + "domain": "Professional Field" + }, + { + "name": "Volcanologist", + "domain": "Professional Field" + }, + { + "name": "Vorstandsassistent", + "domain": "Professional Field" + }, + { + "name": "Voyageurs", + "domain": "Professional Field" + }, + { + "name": "Vārttikakāra", + "domain": "Professional Field" + }, + { + "name": "WHO Goodwill Ambassador", + "domain": "Professional Field" + }, + { + "name": "Wainwright (occupation)", + "domain": "Professional Field" + }, + { + "name": "Waiting staff", + "domain": "Professional Field" + }, + { + "name": "War artist", + "domain": "Professional Field" + }, + { + "name": "War correspondent", + "domain": "Professional Field" + }, + { + "name": "War poetry", + "domain": "Professional Field" + }, + { + "name": "Warden", + "domain": "Professional Field" + }, + { + "name": "Wardrobe stylist", + "domain": "Professional Field" + }, + { + "name": "Wardrobe supervisor", + "domain": "Professional Field" + }, + { + "name": "Warehouseman", + "domain": "Professional Field" + }, + { + "name": "Warraq", + "domain": "Professional Field" + }, + { + "name": "Warrior", + "domain": "Professional Field" + }, + { + "name": "Warrior monk", + "domain": "Professional Field" + }, + { + "name": "Washerwoman", + "domain": "Professional Field" + }, + { + "name": "Watchmaker", + "domain": "Professional Field" + }, + { + "name": "Watchman (law enforcement)", + "domain": "Professional Field" + }, + { + "name": "Weapons master", + "domain": "Professional Field" + }, + { + "name": "Weather presenter", + "domain": "Professional Field" + }, + { + "name": "Weaver (occupation)", + "domain": "Professional Field" + }, + { + "name": "Web designer", + "domain": "Professional Field" + }, + { + "name": "Web developer", + "domain": "Professional Field" + }, + { + "name": "Webmaster", + "domain": "Professional Field" + }, + { + "name": "Website content writer", + "domain": "Professional Field" + }, + { + "name": "Website overseer", + "domain": "Professional Field" + }, + { + "name": "Wedding photographer", + "domain": "Professional Field" + }, + { + "name": "Wedding planner", + "domain": "Professional Field" + }, + { + "name": "Welder", + "domain": "Professional Field" + }, + { + "name": "Wet nurse", + "domain": "Professional Field" + }, + { + "name": "Wheelwright", + "domain": "Professional Field" + }, + { + "name": "White hat (computer security)", + "domain": "Professional Field" + }, + { + "name": "Whitesmith", + "domain": "Professional Field" + }, + { + "name": "Wigmaker", + "domain": "Professional Field" + }, + { + "name": "Wildlife art", + "domain": "Professional Field" + }, + { + "name": "Wildlife biologist", + "domain": "Professional Field" + }, + { + "name": "Wildlife inspector", + "domain": "Professional Field" + }, + { + "name": "Window dresser", + "domain": "Professional Field" + }, + { + "name": "Windsurfer", + "domain": "Professional Field" + }, + { + "name": "Wine critic", + "domain": "Professional Field" + }, + { + "name": "Winemaker", + "domain": "Professional Field" + }, + { + "name": "Wiper (occupation)", + "domain": "Professional Field" + }, + { + "name": "Wire editor", + "domain": "Professional Field" + }, + { + "name": "Women photographers", + "domain": "Professional Field" + }, + { + "name": "Women writers", + "domain": "Professional Field" + }, + { + "name": "Women's health nurse practitioner", + "domain": "Professional Field" + }, + { + "name": "Wood engraver", + "domain": "Professional Field" + }, + { + "name": "Wood splitter (occupation)", + "domain": "Professional Field" + }, + { + "name": "Worker-priest", + "domain": "Professional Field" + }, + { + "name": "Worship pastor", + "domain": "Professional Field" + }, + { + "name": "Wrangler (profession)", + "domain": "Professional Field" + }, + { + "name": "Writer", + "domain": "Professional Field" + }, + { + "name": "Writers' assistant", + "domain": "Professional Field" + }, + { + "name": "Yardmaster", + "domain": "Professional Field" + }, + { + "name": "Yobidashi", + "domain": "Professional Field" + }, + { + "name": "Yogi", + "domain": "Professional Field" + }, + { + "name": "Yogini", + "domain": "Professional Field" + }, + { + "name": "Yoriki", + "domain": "Professional Field" + }, + { + "name": "Youth worker", + "domain": "Professional Field" + }, + { + "name": "Youxia", + "domain": "Professional Field" + }, + { + "name": "Zabbaleen", + "domain": "Professional Field" + }, + { + "name": "Zitherist", + "domain": "Professional Field" + }, + { + "name": "Zookeeper", + "domain": "Professional Field" + }, + { + "name": "Zoologist", + "domain": "Professional Field" + }, + { + "name": "Ébéniste", + "domain": "Professional Field" + } + ] +} \ No newline at end of file diff --git a/backend/app/models/schemas.py b/backend/app/models/schemas.py index 25e3648..57730b4 100644 --- a/backend/app/models/schemas.py +++ b/backend/app/models/schemas.py @@ -209,8 +209,9 @@ class ExpertTransformationDAGResult(BaseModel): class ExpertSource(str, Enum): """專家來源類型""" LLM = "llm" + CURATED = "curated" # 精選職業(210筆,含具體領域) + DBPEDIA = "dbpedia" WIKIDATA = "wikidata" - CONCEPTNET = "conceptnet" class ExpertTransformationRequest(BaseModel): @@ -226,7 +227,7 @@ class ExpertTransformationRequest(BaseModel): # Expert source parameters expert_source: ExpertSource = ExpertSource.LLM # 專家來源 - expert_language: str = "zh" # 外部來源的語言 + expert_language: str = "en" # 外部來源的語言 (目前只有英文資料) # LLM parameters model: Optional[str] = None diff --git a/backend/app/prompts/expert_transformation_prompt.py b/backend/app/prompts/expert_transformation_prompt.py index 60d136e..6d989b7 100644 --- a/backend/app/prompts/expert_transformation_prompt.py +++ b/backend/app/prompts/expert_transformation_prompt.py @@ -53,19 +53,32 @@ def get_expert_keyword_generation_prompt( keywords_per_expert: int = 1 ) -> str: """Step 1: 專家視角關鍵字生成""" - experts_info = ", ".join([f"{exp['id']}:{exp['name']}({exp['domain']})" for exp in experts]) + # 建立專家列表,格式更清晰 + experts_list = "\n".join([f"- {exp['id']}: {exp['name']}" for exp in experts]) return f"""/no_think -專家團隊:{experts_info} -屬性:「{attribute}」({category}) +你需要扮演以下專家,為屬性生成創新關鍵字: -每位專家從自己的專業視角為此屬性生成 {keywords_per_expert} 個創新關鍵字(2-6字)。 -關鍵字要反映該專家領域的獨特思考方式。 +【專家名單】 +{experts_list} + +【任務】 +屬性:「{attribute}」(類別:{category}) + +請為每位專家: +1. 先理解該職業的專業背景、知識領域、工作內容 +2. 從該職業的獨特視角思考「{attribute}」 +3. 生成 {keywords_per_expert} 個與該專業相關的創新關鍵字(2-6字) + +關鍵字必須反映該專家的專業思維方式,例如: +- 會計師 看「移動」→「資金流動」「成本效益」 +- 建築師 看「移動」→「動線設計」「空間流動」 +- 心理師 看「移動」→「行為動機」「情緒轉變」 回傳 JSON: {{"keywords": [{{"keyword": "詞彙", "expert_id": "expert-X", "expert_name": "名稱"}}, ...]}} -共需 {len(experts) * keywords_per_expert} 個關鍵字。""" +共需 {len(experts) * keywords_per_expert} 個關鍵字,每個關鍵字必須明顯與對應專家的專業領域相關。""" def get_single_description_prompt( @@ -76,12 +89,17 @@ def get_single_description_prompt( expert_domain: str ) -> str: """Step 2: 為單一關鍵字生成描述""" + # 如果 domain 是通用的,就只用職業名稱 + domain_text = f"({expert_domain})" if expert_domain and expert_domain != "Professional Field" else "" + return f"""/no_think 物件:「{query}」 -專家:{expert_name}({expert_domain}) +專家:{expert_name}{domain_text} 關鍵字:{keyword} -從這位專家的視角,生成一段創新應用描述(15-30字),說明如何將「{keyword}」的概念應用到「{query}」上。 +你是一位{expert_name}。從你的專業視角,生成一段創新應用描述(15-30字),說明如何將「{keyword}」的概念應用到「{query}」上。 + +描述要體現{expert_name}的專業思維和獨特觀點。 回傳 JSON: {{"description": "應用描述"}}""" diff --git a/backend/app/routers/expert_transformation.py b/backend/app/routers/expert_transformation.py index 0019e68..ae78344 100644 --- a/backend/app/routers/expert_transformation.py +++ b/backend/app/routers/expert_transformation.py @@ -37,16 +37,29 @@ async def generate_expert_transformation_events( model = request.model # ========== Step 0: Generate expert team ========== + logger.info(f"[DEBUG] expert_source from request: {request.expert_source}") + logger.info(f"[DEBUG] expert_source value: {request.expert_source.value}") + logger.info(f"[DEBUG] custom_experts: {request.custom_experts}") + yield f"event: expert_start\ndata: {json.dumps({'message': '正在組建專家團隊...', 'source': request.expert_source.value}, ensure_ascii=False)}\n\n" experts: List[ExpertProfile] = [] actual_source = request.expert_source.value + # 過濾出實際有內容的自訂專家(排除空字串) + actual_custom_experts = [ + e.strip() for e in (request.custom_experts or []) + if e and e.strip() + ] + logger.info(f"[DEBUG] actual_custom_experts (filtered): {actual_custom_experts}") + # 決定使用哪種來源生成專家 + # 只有在明確選擇 LLM 或有實際自訂專家時才使用 LLM use_llm = ( request.expert_source == ExpertSource.LLM or - request.custom_experts # 有自訂專家時,使用 LLM 補充 + len(actual_custom_experts) > 0 # 有實際自訂專家時,使用 LLM 補充 ) + logger.info(f"[DEBUG] use_llm decision: {use_llm}") if use_llm: # LLM 生成專家 @@ -55,7 +68,7 @@ async def generate_expert_transformation_events( query=request.query, categories=all_categories, expert_count=request.expert_count, - custom_experts=request.custom_experts + custom_experts=actual_custom_experts if actual_custom_experts else None ) logger.info(f"Expert prompt: {expert_prompt[:200]}") @@ -78,9 +91,9 @@ async def generate_expert_transformation_events( yield f"event: error\ndata: {json.dumps({'error': f'專家團隊生成失敗: {str(e)}'}, ensure_ascii=False)}\n\n" return else: - # 外部來源生成專家 + # 外部來源生成專家 (本地檔案,同步) try: - experts_data, actual_source = await expert_source_service.get_experts( + experts_data, actual_source = expert_source_service.get_experts( source=request.expert_source.value, count=request.expert_count, language=request.expert_language @@ -106,7 +119,7 @@ async def generate_expert_transformation_events( query=request.query, categories=all_categories, expert_count=request.expert_count, - custom_experts=request.custom_experts + custom_experts=actual_custom_experts if actual_custom_experts else None ) expert_response = await ollama_provider.generate( diff --git a/backend/app/services/expert_cache.py b/backend/app/services/expert_cache.py deleted file mode 100644 index 2df8a4d..0000000 --- a/backend/app/services/expert_cache.py +++ /dev/null @@ -1,92 +0,0 @@ -"""Expert 資料快取模組 - -提供 TTL-based 快取機制,減少外部 API 呼叫。 -""" - -import time -from dataclasses import dataclass -from typing import Dict, List, Optional - - -@dataclass -class CacheEntry: - """快取項目""" - data: List[dict] - timestamp: float - - -class ExpertCache: - """TTL 快取,用於儲存外部來源的職業資料""" - - def __init__(self, ttl_seconds: int = 3600): - """ - 初始化快取 - - Args: - ttl_seconds: 快取存活時間(預設 1 小時) - """ - self._cache: Dict[str, CacheEntry] = {} - self._ttl = ttl_seconds - - def get(self, key: str) -> Optional[List[dict]]: - """ - 取得快取資料 - - Args: - key: 快取鍵(如 "wikidata:zh:occupations") - - Returns: - 快取的資料列表,若不存在或已過期則回傳 None - """ - entry = self._cache.get(key) - if entry is None: - return None - - # 檢查是否過期 - if time.time() - entry.timestamp > self._ttl: - del self._cache[key] - return None - - return entry.data - - def set(self, key: str, data: List[dict]) -> None: - """ - 設定快取資料 - - Args: - key: 快取鍵 - data: 要快取的資料列表 - """ - self._cache[key] = CacheEntry( - data=data, - timestamp=time.time() - ) - - def invalidate(self, key: Optional[str] = None) -> None: - """ - 清除快取 - - Args: - key: 要清除的鍵,若為 None 則清除全部 - """ - if key is None: - self._cache.clear() - elif key in self._cache: - del self._cache[key] - - def get_stats(self) -> dict: - """取得快取統計資訊""" - now = time.time() - valid_count = sum( - 1 for entry in self._cache.values() - if now - entry.timestamp <= self._ttl - ) - return { - "total_entries": len(self._cache), - "valid_entries": valid_count, - "ttl_seconds": self._ttl - } - - -# 全域快取實例 -expert_cache = ExpertCache() diff --git a/backend/app/services/expert_source_service.py b/backend/app/services/expert_source_service.py index 29a7037..0011789 100644 --- a/backend/app/services/expert_source_service.py +++ b/backend/app/services/expert_source_service.py @@ -1,293 +1,111 @@ -"""Expert 外部資料來源服務 +"""Expert 本地資料來源服務 -提供從 Wikidata SPARQL 和 ConceptNet API 獲取職業/領域資料的功能。 +從本地 JSON 檔案讀取職業資料,提供隨機選取功能。 """ +import json import logging import random -from abc import ABC, abstractmethod -from typing import List, Optional, Tuple - -import httpx - -from .expert_cache import expert_cache +from pathlib import Path +from typing import List, Tuple logger = logging.getLogger(__name__) +# 資料目錄 +DATA_DIR = Path(__file__).parent.parent / "data" -class ExpertSourceProvider(ABC): - """外部來源提供者抽象類""" - @abstractmethod - async def fetch_occupations( - self, count: int, language: str = "zh" - ) -> List[dict]: +class LocalDataProvider: + """從本地 JSON 檔案讀取職業資料""" + + def __init__(self, source: str): """ - 獲取職業列表 + Args: + source: 資料來源名稱 (dbpedia/wikidata) + """ + self.source = source + self._cache: dict = {} # 記憶體快取 + + def load_occupations(self, language: str = "en") -> List[dict]: + """ + 載入職業資料 Args: - count: 需要的職業數量 - language: 語言代碼 (zh/en) + language: 語言代碼 (en/zh) Returns: - 職業資料列表 [{"name": "...", "domain": "..."}, ...] + 職業列表 [{"name": "...", "domain": "..."}, ...] """ - pass + cache_key = f"{self.source}:{language}" + # 檢查記憶體快取 + if cache_key in self._cache: + return self._cache[cache_key] -class WikidataProvider(ExpertSourceProvider): - """Wikidata SPARQL 查詢提供者""" + # 讀取檔案 + file_path = DATA_DIR / f"{self.source}_occupations_{language}.json" - ENDPOINT = "https://query.wikidata.org/sparql" - - def __init__(self): - self.client = httpx.AsyncClient(timeout=30.0) - - async def fetch_occupations( - self, count: int, language: str = "zh" - ) -> List[dict]: - """從 Wikidata 獲取職業列表""" - cache_key = f"wikidata:{language}:occupations" - - # 檢查快取 - cached = expert_cache.get(cache_key) - if cached: - logger.info(f"Wikidata cache hit: {len(cached)} occupations") - return self._random_select(cached, count) - - # SPARQL 查詢 - query = self._build_sparql_query(language) + if not file_path.exists(): + logger.warning(f"資料檔案不存在: {file_path}") + return [] try: - response = await self.client.get( - self.ENDPOINT, - params={"query": query, "format": "json"}, - headers={"Accept": "application/sparql-results+json"} - ) - response.raise_for_status() + with open(file_path, "r", encoding="utf-8") as f: + data = json.load(f) - data = response.json() - occupations = self._parse_sparql_response(data, language) + occupations = data.get("occupations", []) + logger.info(f"載入 {len(occupations)} 筆 {self.source} {language} 職業") - if occupations: - expert_cache.set(cache_key, occupations) - logger.info(f"Wikidata fetched: {len(occupations)} occupations") - - return self._random_select(occupations, count) + # 存入快取 + self._cache[cache_key] = occupations + return occupations except Exception as e: - logger.error(f"Wikidata query failed: {e}") - raise + logger.error(f"讀取職業資料失敗: {e}") + return [] - def _build_sparql_query(self, language: str) -> str: - """建構 SPARQL 查詢""" - lang_filter = f'FILTER(LANG(?occupationLabel) = "{language}")' - - return f""" - SELECT DISTINCT ?occupation ?occupationLabel ?fieldLabel WHERE {{ - ?occupation wdt:P31 wd:Q28640. - ?occupation rdfs:label ?occupationLabel. - {lang_filter} - - OPTIONAL {{ - ?occupation wdt:P425 ?field. - ?field rdfs:label ?fieldLabel. - FILTER(LANG(?fieldLabel) = "{language}") - }} - }} - LIMIT 500 + def random_select(self, count: int, language: str = "en") -> List[dict]: """ + 隨機選取指定數量的職業 - def _parse_sparql_response(self, data: dict, language: str) -> List[dict]: - """解析 SPARQL 回應""" - results = [] - bindings = data.get("results", {}).get("bindings", []) + Args: + count: 需要的數量 + language: 語言代碼 - for item in bindings: - name = item.get("occupationLabel", {}).get("value", "") - field = item.get("fieldLabel", {}).get("value", "") + Returns: + 隨機選取的職業列表 + """ + all_occupations = self.load_occupations(language) - if name and len(name) >= 2: - results.append({ - "name": name, - "domain": field if field else self._infer_domain(name) - }) + if not all_occupations: + return [] - return results + if len(all_occupations) <= count: + return all_occupations - def _infer_domain(self, occupation_name: str) -> str: - """根據職業名稱推斷領域""" - # 簡單的領域推斷規則 - domain_keywords = { - "醫": "醫療健康", - "師": "專業服務", - "工程": "工程技術", - "設計": "設計創意", - "藝術": "藝術文化", - "運動": "體育運動", - "農": "農業", - "漁": "漁業", - "商": "商業貿易", - "法": "法律", - "教": "教育", - "研究": "學術研究", - } - - for keyword, domain in domain_keywords.items(): - if keyword in occupation_name: - return domain - - return "專業領域" - - def _random_select(self, items: List[dict], count: int) -> List[dict]: - """隨機選取指定數量""" - if len(items) <= count: - return items - return random.sample(items, count) - - async def close(self): - await self.client.aclose() - - -class ConceptNetProvider(ExpertSourceProvider): - """ConceptNet API 查詢提供者""" - - ENDPOINT = "https://api.conceptnet.io" - - def __init__(self): - self.client = httpx.AsyncClient(timeout=30.0) - - async def fetch_occupations( - self, count: int, language: str = "zh" - ) -> List[dict]: - """從 ConceptNet 獲取職業相關概念""" - cache_key = f"conceptnet:{language}:occupations" - - # 檢查快取 - cached = expert_cache.get(cache_key) - if cached: - logger.info(f"ConceptNet cache hit: {len(cached)} concepts") - return self._random_select(cached, count) - - # 查詢職業相關概念 - lang_code = "zh" if language == "zh" else "en" - start_concept = f"/c/{lang_code}/職業" if lang_code == "zh" else f"/c/{lang_code}/occupation" - - try: - occupations = [] - - # 查詢 IsA 關係 - response = await self.client.get( - f"{self.ENDPOINT}/query", - params={ - "start": start_concept, - "rel": "/r/IsA", - "limit": 100 - } - ) - response.raise_for_status() - data = response.json() - occupations.extend(self._parse_conceptnet_response(data, lang_code)) - - # 也查詢 RelatedTo 關係以獲取更多結果 - response2 = await self.client.get( - f"{self.ENDPOINT}/query", - params={ - "node": start_concept, - "rel": "/r/RelatedTo", - "limit": 100 - } - ) - response2.raise_for_status() - data2 = response2.json() - occupations.extend(self._parse_conceptnet_response(data2, lang_code)) - - # 去重 - seen = set() - unique_occupations = [] - for occ in occupations: - if occ["name"] not in seen: - seen.add(occ["name"]) - unique_occupations.append(occ) - - if unique_occupations: - expert_cache.set(cache_key, unique_occupations) - logger.info(f"ConceptNet fetched: {len(unique_occupations)} concepts") - - return self._random_select(unique_occupations, count) - - except Exception as e: - logger.error(f"ConceptNet query failed: {e}") - raise - - def _parse_conceptnet_response(self, data: dict, lang_code: str) -> List[dict]: - """解析 ConceptNet 回應""" - results = [] - edges = data.get("edges", []) - - for edge in edges: - # 取得 start 或 end 節點(取決於查詢方向) - start = edge.get("start", {}) - end = edge.get("end", {}) - - # 選擇非起始節點的概念 - node = end if start.get("@id", "").endswith("職業") or start.get("@id", "").endswith("occupation") else start - - label = node.get("label", "") - term = node.get("term", "") - - # 過濾:確保是目標語言且有意義 - node_id = node.get("@id", "") - if f"/c/{lang_code}/" in node_id and label and len(label) >= 2: - results.append({ - "name": label, - "domain": self._infer_domain_from_edge(edge) - }) - - return results - - def _infer_domain_from_edge(self, edge: dict) -> str: - """從 edge 資訊推斷領域""" - # ConceptNet 的 edge 包含 surfaceText 可能有額外資訊 - surface = edge.get("surfaceText", "") - rel = edge.get("rel", {}).get("label", "") - - if "專業" in surface: - return "專業領域" - elif "技術" in surface: - return "技術領域" - else: - return "知識領域" - - def _random_select(self, items: List[dict], count: int) -> List[dict]: - """隨機選取指定數量""" - if len(items) <= count: - return items - return random.sample(items, count) - - async def close(self): - await self.client.aclose() + return random.sample(all_occupations, count) class ExpertSourceService: """統一的專家來源服務""" def __init__(self): - self.wikidata = WikidataProvider() - self.conceptnet = ConceptNetProvider() + self.curated = LocalDataProvider("curated") # 精選職業 + self.dbpedia = LocalDataProvider("dbpedia") + self.wikidata = LocalDataProvider("wikidata") - async def get_experts( + def get_experts( self, source: str, count: int, - language: str = "zh", + language: str = "en", fallback_to_llm: bool = True ) -> Tuple[List[dict], str]: """ 從指定來源獲取專家資料 Args: - source: 來源類型 ("wikidata" | "conceptnet") + source: 來源類型 ("dbpedia" | "wikidata") count: 需要的專家數量 language: 語言代碼 fallback_to_llm: 失敗時是否允許 fallback(由呼叫者處理) @@ -296,35 +114,87 @@ class ExpertSourceService: (專家資料列表, 實際使用的來源) Raises: - Exception: 當獲取失敗且不 fallback 時 + ValueError: 當獲取失敗且資料為空時 """ - provider = self._get_provider(source) - - try: - experts = await provider.fetch_occupations(count, language) - - if not experts: - raise ValueError(f"No occupations found from {source}") - - return experts, source - - except Exception as e: - logger.warning(f"Failed to fetch from {source}: {e}") - raise - - def _get_provider(self, source: str) -> ExpertSourceProvider: - """根據來源類型取得對應的 provider""" - if source == "wikidata": - return self.wikidata - elif source == "conceptnet": - return self.conceptnet + # 選擇 provider + if source == "curated": + provider = self.curated + # 精選職業支援 zh 和 en,預設使用 zh + if language not in ["zh", "en"]: + language = "zh" + elif source == "wikidata": + provider = self.wikidata else: - raise ValueError(f"Unknown source: {source}") + # 預設使用 dbpedia + provider = self.dbpedia + source = "dbpedia" - async def close(self): - """關閉所有 HTTP clients""" - await self.wikidata.close() - await self.conceptnet.close() + experts = provider.random_select(count, language) + + if not experts: + raise ValueError(f"No occupations found from {source} ({language})") + + logger.info(f"從 {source} 取得 {len(experts)} 位專家") + return experts, source + + def get_available_sources(self) -> List[dict]: + """ + 取得可用的資料來源資訊 + + Returns: + 來源資訊列表 + """ + sources = [] + + # 檢查精選職業(中文) + curated_zh = DATA_DIR / "curated_occupations_zh.json" + if curated_zh.exists(): + with open(curated_zh, "r", encoding="utf-8") as f: + data = json.load(f) + sources.append({ + "source": "curated", + "language": "zh", + "count": data["metadata"]["total_count"], + "created_at": data["metadata"]["created_at"] + }) + + # 檢查精選職業(英文) + curated_en = DATA_DIR / "curated_occupations_en.json" + if curated_en.exists(): + with open(curated_en, "r", encoding="utf-8") as f: + data = json.load(f) + sources.append({ + "source": "curated", + "language": "en", + "count": data["metadata"]["total_count"], + "created_at": data["metadata"]["created_at"] + }) + + # 檢查 DBpedia + dbpedia_en = DATA_DIR / "dbpedia_occupations_en.json" + if dbpedia_en.exists(): + with open(dbpedia_en, "r", encoding="utf-8") as f: + data = json.load(f) + sources.append({ + "source": "dbpedia", + "language": "en", + "count": data["metadata"]["total_count"], + "fetched_at": data["metadata"]["fetched_at"] + }) + + # 檢查 Wikidata + wikidata_zh = DATA_DIR / "wikidata_occupations_zh.json" + if wikidata_zh.exists(): + with open(wikidata_zh, "r", encoding="utf-8") as f: + data = json.load(f) + sources.append({ + "source": "wikidata", + "language": "zh", + "count": data["metadata"]["total_count"], + "fetched_at": data["metadata"]["fetched_at"] + }) + + return sources # 全域服務實例 diff --git a/backend/scripts/fetch_occupations.py b/backend/scripts/fetch_occupations.py new file mode 100644 index 0000000..c951f1c --- /dev/null +++ b/backend/scripts/fetch_occupations.py @@ -0,0 +1,386 @@ +#!/usr/bin/env python3 +""" +職業資料抓取腳本 + +從 Wikidata SPARQL 和 ConceptNet API 抓取職業資料, +儲存為本地 JSON 檔案供應用程式使用。 + +使用方式: + cd backend + python scripts/fetch_occupations.py +""" + +import json +import sys +from datetime import datetime, timezone +from pathlib import Path +from typing import List + +import httpx + +# 輸出目錄 +DATA_DIR = Path(__file__).parent.parent / "app" / "data" + + +def fetch_wikidata_occupations(language: str) -> List[dict]: + """ + 從 Wikidata SPARQL 端點抓取所有職業(使用分頁) + + Args: + language: 語言代碼 (zh/en) + + Returns: + 職業列表 [{"name": "...", "domain": "..."}, ...] + """ + print(f"[Wikidata] 正在抓取 {language} 職業資料(分頁模式)...") + + endpoint = "https://query.wikidata.org/sparql" + page_size = 500 # 每頁筆數 + all_bindings = [] + offset = 0 + + try: + with httpx.Client(timeout=120.0) as client: + while True: + # SPARQL 查詢 - 使用 SERVICE wikibase:label (更高效) + query = f""" + SELECT DISTINCT ?occupation ?occupationLabel ?fieldLabel WHERE {{ + ?occupation wdt:P31 wd:Q28640. + OPTIONAL {{ ?occupation wdt:P425 ?field. }} + SERVICE wikibase:label {{ bd:serviceParam wikibase:language "{language},en". }} + }} + LIMIT {page_size} + OFFSET {offset} + """ + + print(f"[Wikidata] 抓取第 {offset // page_size + 1} 頁 (offset={offset})...") + + response = client.get( + endpoint, + params={"query": query, "format": "json"}, + headers={ + "Accept": "application/sparql-results+json", + "User-Agent": "NoveltySeeking/1.0", + }, + ) + response.raise_for_status() + data = response.json() + + bindings = data.get("results", {}).get("bindings", []) + print(f"[Wikidata] 取得 {len(bindings)} 筆") + + if not bindings: + # 沒有更多資料了 + break + + all_bindings.extend(bindings) + offset += page_size + + # 如果取得的筆數少於 page_size,表示已經是最後一頁 + if len(bindings) < page_size: + break + + print(f"[Wikidata] 總共取得 {len(all_bindings)} 筆原始資料") + + # 解析回應 + occupations = [] + for item in all_bindings: + name = item.get("occupationLabel", {}).get("value", "") + field = item.get("fieldLabel", {}).get("value", "") + + if name and len(name) >= 2: + occupations.append({ + "name": name, + "domain": field if field else infer_domain(name, language), + }) + + # 去重 + seen = set() + unique = [] + for occ in occupations: + if occ["name"] not in seen: + seen.add(occ["name"]) + unique.append(occ) + + print(f"[Wikidata] 去重後: {len(unique)} 筆職業") + return unique + + except Exception as e: + print(f"[Wikidata] 錯誤: {e}") + raise + + +def fetch_conceptnet_occupations(language: str) -> List[dict]: + """ + 從 ConceptNet API 抓取職業相關概念(使用分頁) + + Args: + language: 語言代碼 (zh/en) + + Returns: + 職業列表 [{"name": "...", "domain": "..."}, ...] + """ + print(f"[ConceptNet] 正在抓取 {language} 職業資料(分頁模式)...") + + endpoint = "https://api.conceptnet.io" + lang_code = language + page_size = 100 # ConceptNet 建議的 limit + + # 起始概念 + start_concepts = { + "zh": ["/c/zh/職業", "/c/zh/專業", "/c/zh/工作", "/c/zh/職務"], + "en": ["/c/en/occupation", "/c/en/profession", "/c/en/job", "/c/en/career"], + } + + # 要查詢的關係類型 + relations = ["/r/IsA", "/r/RelatedTo", "/r/HasA", "/r/AtLocation"] + + all_occupations = [] + + try: + with httpx.Client(timeout=60.0) as client: + for concept in start_concepts.get(lang_code, start_concepts["zh"]): + for rel in relations: + offset = 0 + max_pages = 5 # 每個組合最多抓 5 頁 + + for page in range(max_pages): + try: + print(f"[ConceptNet] 查詢 {concept} {rel} (offset={offset})...") + + # 查詢 start 參數 + response = client.get( + f"{endpoint}/query", + params={ + "start": concept, + "rel": rel, + "limit": page_size, + "offset": offset, + }, + ) + + if response.status_code != 200: + print(f"[ConceptNet] HTTP {response.status_code}, 跳過") + break + + data = response.json() + edges = data.get("edges", []) + + if not edges: + break + + parsed = parse_conceptnet_response(data, lang_code) + all_occupations.extend(parsed) + print(f"[ConceptNet] 取得 {len(parsed)} 筆") + + if len(edges) < page_size: + break + + offset += page_size + + except Exception as e: + print(f"[ConceptNet] 錯誤: {e}") + break + + # 去重 + seen = set() + unique = [] + for occ in all_occupations: + if occ["name"] not in seen: + seen.add(occ["name"]) + unique.append(occ) + + print(f"[ConceptNet] 去重後: {len(unique)} 筆概念") + return unique + + except Exception as e: + print(f"[ConceptNet] 錯誤: {e}") + raise + + +def parse_conceptnet_response(data: dict, lang_code: str) -> List[dict]: + """解析 ConceptNet API 回應""" + results = [] + edges = data.get("edges", []) + + for edge in edges: + start = edge.get("start", {}) + end = edge.get("end", {}) + + # 嘗試從兩端取得有意義的概念 + for node in [start, end]: + node_id = node.get("@id", "") + label = node.get("label", "") + + # 過濾:確保是目標語言且有意義 + if f"/c/{lang_code}/" in node_id and label and len(label) >= 2: + # 排除過於泛用的詞 + if label not in ["職業", "工作", "專業", "occupation", "job", "profession"]: + results.append({ + "name": label, + "domain": infer_domain(label, lang_code), + }) + + return results + + +def infer_domain(occupation_name: str, language: str) -> str: + """根據職業名稱推斷領域""" + if language == "zh": + domain_keywords = { + "醫": "醫療健康", + "護": "醫療健康", + "藥": "醫療健康", + "師": "專業服務", + "工程": "工程技術", + "技術": "工程技術", + "設計": "設計創意", + "藝術": "藝術文化", + "音樂": "藝術文化", + "運動": "體育運動", + "農": "農業", + "漁": "漁業", + "商": "商業貿易", + "銷": "商業貿易", + "法": "法律", + "律": "法律", + "教": "教育", + "研究": "學術研究", + "科學": "學術研究", + "廚": "餐飲服務", + "烹": "餐飲服務", + "建築": "建築營造", + "軍": "軍事國防", + "警": "公共安全", + "消防": "公共安全", + "記者": "媒體傳播", + "編輯": "媒體傳播", + "作家": "文學創作", + "程式": "資訊科技", + "軟體": "資訊科技", + "電腦": "資訊科技", + } + else: + domain_keywords = { + "doctor": "Healthcare", + "nurse": "Healthcare", + "medical": "Healthcare", + "engineer": "Engineering", + "technical": "Engineering", + "design": "Design & Creative", + "artist": "Arts & Culture", + "music": "Arts & Culture", + "sport": "Sports", + "athletic": "Sports", + "farm": "Agriculture", + "fish": "Fishery", + "business": "Business", + "sales": "Business", + "law": "Legal", + "attorney": "Legal", + "teach": "Education", + "professor": "Education", + "research": "Academic Research", + "scien": "Academic Research", + "chef": "Culinary", + "cook": "Culinary", + "architect": "Architecture", + "military": "Military", + "police": "Public Safety", + "fire": "Public Safety", + "journal": "Media", + "editor": "Media", + "writer": "Literature", + "author": "Literature", + "program": "Information Technology", + "software": "Information Technology", + "computer": "Information Technology", + "develop": "Information Technology", + } + + name_lower = occupation_name.lower() + for keyword, domain in domain_keywords.items(): + if keyword in name_lower: + return domain + + return "專業領域" if language == "zh" else "Professional Field" + + +def save_json(data: List[dict], source: str, language: str) -> None: + """儲存資料到 JSON 檔案""" + filename = f"{source}_occupations_{language}.json" + filepath = DATA_DIR / filename + + output = { + "metadata": { + "source": source, + "language": language, + "fetched_at": datetime.now(timezone.utc).isoformat(), + "total_count": len(data), + }, + "occupations": data, + } + + with open(filepath, "w", encoding="utf-8") as f: + json.dump(output, f, ensure_ascii=False, indent=2) + + print(f"[儲存] {filepath} ({len(data)} 筆)") + + +def main(): + """主程式""" + print("=" * 60) + print("職業資料抓取腳本") + print(f"輸出目錄: {DATA_DIR}") + print("=" * 60) + print() + + # 確保輸出目錄存在 + DATA_DIR.mkdir(parents=True, exist_ok=True) + + # 抓取 Wikidata + print("--- Wikidata ---") + try: + wikidata_zh = fetch_wikidata_occupations("zh") + save_json(wikidata_zh, "wikidata", "zh") + except Exception as e: + print(f"Wikidata 中文抓取失敗: {e}") + wikidata_zh = [] + + try: + wikidata_en = fetch_wikidata_occupations("en") + save_json(wikidata_en, "wikidata", "en") + except Exception as e: + print(f"Wikidata 英文抓取失敗: {e}") + wikidata_en = [] + + print() + + # 抓取 ConceptNet + print("--- ConceptNet ---") + try: + conceptnet_zh = fetch_conceptnet_occupations("zh") + save_json(conceptnet_zh, "conceptnet", "zh") + except Exception as e: + print(f"ConceptNet 中文抓取失敗: {e}") + conceptnet_zh = [] + + try: + conceptnet_en = fetch_conceptnet_occupations("en") + save_json(conceptnet_en, "conceptnet", "en") + except Exception as e: + print(f"ConceptNet 英文抓取失敗: {e}") + conceptnet_en = [] + + print() + print("=" * 60) + print("抓取完成!") + print(f" Wikidata 中文: {len(wikidata_zh)} 筆") + print(f" Wikidata 英文: {len(wikidata_en)} 筆") + print(f" ConceptNet 中文: {len(conceptnet_zh)} 筆") + print(f" ConceptNet 英文: {len(conceptnet_en)} 筆") + print("=" * 60) + + +if __name__ == "__main__": + main() diff --git a/frontend/src/components/TransformationInputPanel.tsx b/frontend/src/components/TransformationInputPanel.tsx index 761982b..4ffbc11 100644 --- a/frontend/src/components/TransformationInputPanel.tsx +++ b/frontend/src/components/TransformationInputPanel.tsx @@ -7,8 +7,9 @@ const { Title, Text } = Typography; const EXPERT_SOURCE_OPTIONS = [ { label: 'LLM 生成', value: 'llm' as ExpertSource, description: '使用 AI 模型生成專家' }, - { label: 'Wikidata', value: 'wikidata' as ExpertSource, description: '從維基數據查詢職業' }, - { label: 'ConceptNet', value: 'conceptnet' as ExpertSource, description: '從知識圖譜查詢概念' }, + { label: '精選職業', value: 'curated' as ExpertSource, description: '從 210 個常見職業隨機選取(含具體領域)' }, + { label: 'DBpedia', value: 'dbpedia' as ExpertSource, description: '從 DBpedia 隨機選取職業 (2164 筆)' }, + { label: 'Wikidata', value: 'wikidata' as ExpertSource, description: '從 Wikidata 查詢職業 (需等待 API)' }, ]; interface TransformationInputPanelProps { diff --git a/frontend/src/hooks/useExpertTransformation.ts b/frontend/src/hooks/useExpertTransformation.ts index 70c11be..0beb395 100644 --- a/frontend/src/hooks/useExpertTransformation.ts +++ b/frontend/src/hooks/useExpertTransformation.ts @@ -155,7 +155,7 @@ export function useExpertTransformation(options: UseExpertTransformationOptions }); }); }, - [options.model, options.temperature] + [options.model, options.temperature, options.expertSource] ); const transformAll = useCallback( diff --git a/frontend/src/types/index.ts b/frontend/src/types/index.ts index b1a0a88..ee5b82a 100644 --- a/frontend/src/types/index.ts +++ b/frontend/src/types/index.ts @@ -230,7 +230,7 @@ export interface ExpertTransformationDAGResult { results: ExpertTransformationCategoryResult[]; } -export type ExpertSource = 'llm' | 'wikidata' | 'conceptnet'; +export type ExpertSource = 'llm' | 'curated' | 'dbpedia' | 'wikidata'; export interface ExpertTransformationRequest { query: string; @@ -240,7 +240,7 @@ export interface ExpertTransformationRequest { keywords_per_expert: number; // 1-3 custom_experts?: string[]; // ["藥師", "工程師"] expert_source?: ExpertSource; // 專家來源 (default: 'llm') - expert_language?: string; // 外部來源語言 (default: 'zh') + expert_language?: string; // 外部來源語言 (default: 'en') model?: string; temperature?: number; }