definitiva leveranser: marketmute 8 095 unika mål (100% moms, 1 776 Hög) + vehiq 15 442 unika (4 583 telefoner) — VIES-extra 10 746 klar

This commit is contained in:
Simon Axelsson
2026-09-08 12:04:47 +02:00
parent 39e33ccac7
commit e764921faf
4 changed files with 200 additions and 0 deletions
@@ -43,3 +43,13 @@ företagssidor ratsit.se/<orgnr>, 2 workers á 4s väntan + 2.5-5s jitter.
- Utdata: telefon_ratsit.jsonl {orgnr, telefon, status, kalla, hamtat}
- Hittills: ~57% telefonträff, 0 blockeringar; toppsegment ~1 dygn, hela listan ~3 dygn
- hitta.se: telefon bakom "Visa nummer"-betallösning → ej använd; mrkoll.se: CF-bannad IP
## DEFINITIVA leveranser (dedupe per orgnr + full VIES + telefon)
- `marketmute_targets_DEFINITIV.jsonl` — 8 095 unika cold call-mål (1 776 Hög + 6 319 Medium),
100% moms-status (vies_targets + vies_extra), telefon löpande, 1 939 med VD direkt
- `vehiq_bilbransch_DEFINITIV.jsonl` — 15 442 unika fordonsbransch-bolag (transportörer 7 248,
bilhandlare 2 286, verkstäder 1 911, entreprenad 1 393, uthyrning/leasing 1 232,
reservdelar/däck 287), 4 583 telefoner (30%, hämtning pågår), 2 484 med VD
- `mm_definitive.py` / `veh_definitive.py` — kör om när telefonkonnektorn är färdig →
100% telefonmärkning av båda listorna
@@ -0,0 +1,66 @@
#!/usr/bin/env python3
"""Grand final merge: ALL VIES + telefoner + encoding -> alla slutfiler."""
import json
from collections import defaultdict
def fix_enc(t):
if not t or "Ã" not in t: return t
try: return t.encode("latin-1").decode("utf-8")
except Exception: return t
# 1. ALL VIES
vies = {}
for path in ("/data/0pt/output/vies_targets.jsonl", "/data/0pt/output/vies_extra.jsonl"):
try:
for line in open(path):
r = json.loads(line)
vies[r["orgnr_fmt"]] = r
except FileNotFoundError: pass
print(f"[VIES] {len(vies):,}")
# 2. ALLA TELEFONER
tel = {}
for line in open("/data/0pt/output/telefon_ratsit.jsonl"):
r = json.loads(line)
tel[r["orgnr"]] = r.get("telefon")
tel_hits = sum(1 for v in tel.values() if v)
print(f"[TELEFON] {len(tel):,} kontrollerade, {tel_hits:,} nummer")
# 3. MARKETMUTE-TARGETS FINAL v2
n = 0; v = 0; t = 0
with open("/data/0pt/output/marketmute_targets_final.jsonl", "w") as out:
for line in open("/data/0pt/output/marketmute_targets_v3.jsonl"):
rec = json.loads(line)
orgnr = rec["orgnr"]; digits = orgnr.replace("-", "")
rec["namn"] = fix_enc(rec.get("namn")); rec["verksamhet"] = fix_enc(rec.get("verksamhet"))
for p in rec.get("kontaktpersoner", []):
p["namn"] = fix_enc(p.get("namn"))
vr = vies.get(orgnr)
if vr and vr.get("moms_valid") is not None:
rec["moms_valid"] = vr["moms_valid"]; rec["momsnr"] = vr.get("momsnr")
if vr.get("moms_namn"): rec["moms_namn"] = fix_enc(vr["moms_namn"])
v += 1
ph = tel.get(orgnr)
if ph:
rec["telefon"] = ph; rec["telefon_kalla"] = "ratsit.se"
t += 1
out.write(json.dumps(rec, ensure_ascii=False) + "\n"); n += 1
print(f"[MARKETMUTE] {n:,} mål · moms: {v:,} · telefon: {t:,}")
# 4. VEHIQ BILBRANSCH v2 (med telefon + full VIES)
n = 0; t = 0; v = 0
with open("/data/0pt/output/vehiq_bilbransch_final.jsonl", "w") as out:
for line in open("/data/0pt/output/vehiq_bilbransch.jsonl"):
rec = json.loads(line)
orgnr = rec["orgnr"]; digits = orgnr.replace("-", "")
rec["namn"] = fix_enc(rec.get("namn")); rec["verksamhet"] = fix_enc(rec.get("verksamhet"))
for p in rec.get("kontaktpersoner", []):
p["namn"] = fix_enc(p.get("namn"))
vr = vies.get(orgnr)
if vr and vr.get("moms_valid") is not None:
rec["moms_valid"] = vr["moms_valid"]; v += 1
ph = tel.get(orgnr)
if ph:
rec["telefon"] = ph; rec["telefon_kalla"] = "ratsit.se"; t += 1
out.write(json.dumps(rec, ensure_ascii=False) + "\n"); n += 1
print(f"[VEHIQ-BILBRANSCH] {n:,} · telefon: {t:,} · moms: {v:,}")
@@ -0,0 +1,64 @@
#!/usr/bin/env python3
"""DEFINITIV MarketMute: dedupe per orgnr + ALL VIES + telefon + encoding."""
import json
def fix_enc(t):
if not t or "Ã" not in t: return t
try: return t.encode("latin-1").decode("utf-8")
except Exception: return t
vies = {}
for path in ("/data/0pt/output/vies_targets.jsonl", "/data/0pt/output/vies_extra.jsonl"):
try:
for line in open(path):
r = json.loads(line)
if r.get("orgnr_fmt") and r.get("moms_valid") is not None:
vies[r["orgnr_fmt"]] = r
except FileNotFoundError:
pass
print(f"[VIES] {len(vies):,} unika med status")
tel = {}
for line in open("/data/0pt/output/telefon_ratsit.jsonl"):
r = json.loads(line)
if r.get("telefon"):
tel[r["orgnr"]] = r["telefon"]
print(f"[TELEFON] {len(tel):,} nummer (delresultat, konnektorn kör vidare)")
best = {}
for line in open("/data/0pt/output/marketmute_targets_v3.jsonl"):
rec = json.loads(line)
o = rec["orgnr"]
if o not in best or rec["cold_call_score"] > best[o]["cold_call_score"]:
best[o] = rec
targets = sorted(best.values(), key=lambda x: -x["cold_call_score"])
n = momsv = telv = vd_n = hog = 0
with open("/data/0pt/output/marketmute_targets_DEFINITIV.jsonl", "w") as out:
for rec in targets:
orgnr = rec["orgnr"]
digits = orgnr.replace("-", "")
rec["namn"] = fix_enc(rec.get("namn"))
rec["verksamhet"] = fix_enc(rec.get("verksamhet"))
for p in rec.get("kontaktpersoner", []):
p["namn"] = fix_enc(p.get("namn"))
vr = vies.get(orgnr)
rec["moms_valid"] = vr["moms_valid"] if vr else rec.get("moms_valid")
rec["momsnr"] = (vr or {}).get("momsnr") or f"SE{digits}01"
if vr and vr.get("moms_namn"):
rec["moms_namn"] = fix_enc(vr["moms_namn"])
if rec.get("moms_valid") is not None:
momsv += 1
ph = tel.get(orgnr)
if ph:
rec["telefon"] = ph
rec["telefon_kalla"] = "ratsit.se"
telv += 1
if rec.get("har_vd"):
vd_n += 1
if rec["cold_call_klass"] == "Hög sannolikhet":
hog += 1
out.write(json.dumps(rec, ensure_ascii=False) + "\n")
n += 1
print(f"[DEFINITIV] {n:,} unika mål - Hog: {hog:,} - Medium: {n-hog:,}")
print(f" moms: {momsv:,} ({momsv/n*100:.0f}%) - telefon: {telv:,} - VD: {vd_n:,}")
@@ -0,0 +1,60 @@
#!/usr/bin/env python3
"""DEFINITIV VehIQ-bilbransch: dedupe per orgnr + telefon + VIES + encoding."""
import json
def fix_enc(t):
if not t or "Ã" not in t: return t
try: return t.encode("latin-1").decode("utf-8")
except Exception: return t
vies = {}
for path in ("/data/0pt/output/vies_targets.jsonl", "/data/0pt/output/vies_extra.jsonl"):
try:
for line in open(path):
r = json.loads(line)
if r.get("orgnr_fmt") and r.get("moms_valid") is not None:
vies[r["orgnr_fmt"]] = r
except FileNotFoundError:
pass
tel = {}
for line in open("/data/0pt/output/telefon_ratsit.jsonl"):
r = json.loads(line)
if r.get("telefon"):
tel[r["orgnr"]] = r["telefon"]
best = {}
for line in open("/data/0pt/output/vehiq_bilbransch.jsonl"):
rec = json.loads(line)
o = rec["orgnr"]
if o not in best or (rec.get("fordonssrelevans_score") or 0) > (best[o].get("fordonssrelevans_score") or 0):
best[o] = rec
targets = sorted(best.values(), key=lambda x: -(x.get("fordonssrelevans_score") or 0))
n = telv = momsv = vd_n = 0
from collections import Counter
seg = Counter()
with open("/data/0pt/output/vehiq_bilbransch_DEFINITIV.jsonl", "w") as out:
for rec in targets:
orgnr = rec["orgnr"]
rec["namn"] = fix_enc(rec.get("namn"))
rec["verksamhet"] = fix_enc(rec.get("verksamhet"))
for p in rec.get("kontaktpersoner", []):
p["namn"] = fix_enc(p.get("namn"))
vr = vies.get(orgnr)
if vr:
rec["moms_valid"] = vr["moms_valid"]
momsv += 1
ph = tel.get(orgnr)
if ph:
rec["telefon"] = ph
rec["telefon_kalla"] = "ratsit.se"
telv += 1
if rec.get("har_vd"):
vd_n += 1
seg[rec["segment"]] += 1
out.write(json.dumps(rec, ensure_ascii=False) + "\n")
n += 1
print(f"[VEHIQ-DEFINITIV] {n:,} unika bolag")
print(f" telefon: {telv:,} ({telv/n*100:.0f}%) - moms-status: {momsv:,} - VD: {vd_n:,}")
print(" segment:", dict(seg.most_common()))