HTML 82.1%
Python 14.6%
TypeScript 1.9%
CSS 1%
JavaScript 0.5%
1#!/usr/bin/env python32# =============================================================================3# Job·Ka — Groupe KA4# Auteur : Simon-Pierre Boucher5# Contact : contact@spboucher.ai6# Fichier : scripts/classify_sectors.py7# Rôle : Remplit `sectors` (1-2 étiquettes FR du vocabulaire existant) des8# entrées d'un feeds-*.json qui n'en ont pas — lots de 40 via l'API9# Anthropic (claude-haiku), écrit le fichier en place10# Créé : 2026-08-23 Modifié : 2026-08-2311# =============================================================================12"""Usage : ANTHROPIC_API_KEY=… python3 scripts/classify_sectors.py FEEDS.json"""13from __future__ import annotations1415import json16import os17import sys18from pathlib import Path1920import requests2122VOCAB = ["TI", "Santé", "Commerce de détail", "Secteur public", "Finance",23 "Ingénierie", "Fabrication", "Immobilier", "Assurance",24 "Agroalimentaire", "Jeux vidéo", "Énergie", "Création",25 "Aéronautique", "Placement", "Conseil", "Éducation", "Logistique",26 "Services", "Transport", "Construction", "Pharmaceutique",27 "Divertissement", "Recherche", "Automobile", "SaaS", "Marketing",28 "Distribution", "Médias", "Animation", "Restauration", "IA",29 "Pâtes et papiers", "Services sociaux", "Mode", "Web",30 "Effets visuels", "Administration", "Publicité", "Hôtellerie",31 "Mines", "Ventes", "Gestion immobilière", "Sport", "Juridique",32 "Télécommunications", "Fintech", "Voyage", "Données", "Biotechnologie",33 "Environnement", "Sécurité", "Ressources humaines", "Tourisme",34 "Arts", "Musique", "Camionnage", "Foresterie", "Métallurgie"]3536API = "https://api.anthropic.com/v1/messages"37MODEL = "claude-haiku-4-5-20251001"383940def classify(names: list[str], key: str) -> dict[str, list[str]]:41 prompt = (42 "Voici des employeurs (surtout québécois/canadiens). Pour chacun, "43 "donne 1 ou 2 secteurs d'activité, choisis STRICTEMENT dans ce "44 "vocabulaire :\n" + ", ".join(VOCAB) +45 "\n\nRéponds UNIQUEMENT avec un objet JSON "46 '{"Nom employeur": ["Secteur", ...], ...} — aucun autre texte.\n\n'47 + "\n".join(f"- {n}" for n in names))48 r = requests.post(API, timeout=120, headers={49 "x-api-key": key, "anthropic-version": "2023-06-01",50 "content-type": "application/json"},51 json={"model": MODEL, "max_tokens": 4000,52 "messages": [{"role": "user", "content": prompt}]})53 r.raise_for_status()54 txt = r.json()["content"][0]["text"].strip()55 if txt.startswith("```"):56 txt = txt.strip("`").lstrip("json").strip()57 return json.loads(txt)585960def main() -> None:61 key = os.environ.get("ANTHROPIC_API_KEY")62 if not key:63 sys.exit("ANTHROPIC_API_KEY manquant")64 path = Path(sys.argv[1])65 feeds = json.loads(path.read_text(encoding="utf-8"))66 todo = [f for f in feeds if not f.get("sectors")]67 print(f"[secteurs] {len(todo)} employeurs à classifier")68 for i in range(0, len(todo), 40):69 batch = todo[i:i + 40]70 try:71 got = classify([f["employer"] for f in batch], key)72 except Exception as exc:73 print(f" ! lot {i}: {exc}")74 continue75 for f in batch:76 secs = got.get(f["employer"]) or []77 f["sectors"] = [s for s in secs if s in VOCAB][:2]78 print(f" lot {i // 40 + 1}: {len(got)} classés")79 path.write_text(json.dumps(feeds, ensure_ascii=False, indent=1) + "\n",80 encoding="utf-8")81 missing = sum(1 for f in feeds if not f.get("sectors"))82 print(f"[secteurs] terminé — {missing} sans secteur")838485if __name__ == "__main__":86 main()87