SPB Git

spb/job-ka

Public
3.7 KB · 87 lines python
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
Files · 4e9b08bba5ce6d9aa0b43e4bec5888abcec80199
Menu

Theme