solidprivacy commited on
Commit
eb0e56d
·
verified ·
1 Parent(s): 9f18db7

Harden Dutch legal reference taxonomy batch patterns

Browse files
Files changed (1) hide show
  1. dutch_recognizers.py +68 -17
dutch_recognizers.py CHANGED
@@ -1,5 +1,8 @@
1
  """Dutch / European + Dutch legal recognizers for SolidPrivacy Scrub.
2
 
 
 
 
3
  Phase 1-3 v8 update:
4
  - extends the taxonomy strategy with vehicle/object reference categories;
5
  - broadens context-bound reference values to include compact values such as
@@ -303,27 +306,39 @@ class RegexCaptureRecognizer(EntityRecognizer):
303
  return results
304
 
305
 
306
- REFERENCE_VALUE_REGEX = re.compile(
307
- r"\b(?:"
308
- # Common uppercase/legal admin codes: CL-FAM-55201, FACT-2026-4481,
309
- # WR-KLANT-2026-7712, HRZ-SAM-2026-04, PL1700-20260518-334455.
310
- r"(?=[A-Z0-9][A-Z0-9./_-]{4,49}\b)(?=[A-Z0-9./_-]*[A-Z])(?=[A-Z0-9./_-]*\d)"
311
- r"[A-Z0-9]+(?:[./_-][A-Z0-9]+){1,8}"
312
  r"|"
313
- # Compact context-bound reference values such as XX123X after "kenteken"
314
- # or HR2026A after an explicit reference label. These are not used blindly;
315
- # DutchContextualReferenceRecognizer only applies them when a taxonomy
316
- # keyword is nearby.
317
- r"(?=[A-Z0-9]{5,12}\b)(?=[A-Z0-9]*[A-Z])(?=[A-Z0-9]*\d)[A-Z0-9]{5,12}"
318
  r"|"
319
- # Dutch appellate / court formats like 200.345.678/01 OK.
 
 
 
320
  r"\d{3}\.\d{3}\.\d{3}/\d{2}\s+[A-Z]{1,5}"
 
 
 
 
 
 
 
 
 
321
  r"|"
322
- # Case references with procedure blocks, e.g. 10598721 / UE VERZ 26-441.
323
- r"\d{6,9}\s*/\s*(?:[A-Z]{1,5}\s+){1,4}\d{2}[-/]\d{1,6}"
324
- r")\b"
325
  )
326
 
 
 
327
 
328
  def _keyword_to_regex(keyword: str) -> str:
329
  """Turn a taxonomy keyword into a forgiving but bounded regex."""
@@ -628,7 +643,7 @@ def get_dutch_recognizers(supported_language: str = "en") -> List[EntityRecogniz
628
  patterns=[
629
  (
630
  "kvk_labeled_value",
631
- r"\b(?:kvk(?:[-\s]?nummer|\s?nr\.)?|kamer\s+van\s+koophandel)\s*(?:is|:|#|-)?\s*(?P<value>\d{8})\b",
632
  ),
633
  ],
634
  score=0.88,
@@ -754,7 +769,7 @@ def get_dutch_recognizers(supported_language: str = "en") -> List[EntityRecogniz
754
  patterns=[
755
  (
756
  "legal_case_labeled_value",
757
- r"\b(?:zaaknummer|zaaknr\.?|zaak\s?nr\.?|zaak-/rolnummer)\s*(?:is|:|#|-)?\s*(?P<value>C/\d{2}/\d{5,6}\s*/\s*(?:HA|KG|FA|JE|CV|RK|ZA|EXPL|VERZ|BESL)\s*[A-Z]{0,3}\s*\d{2}[-/]\d{1,5}|[A-Z0-9]{1,8}[-_/][A-Z0-9]{2,12}(?:[-_/][A-Z0-9]{1,12})?)\b",
758
  ),
759
  ],
760
  score=0.86,
@@ -852,6 +867,42 @@ def get_dutch_recognizers(supported_language: str = "en") -> List[EntityRecogniz
852
  context=["schadenummer", "claimnummer", "polisnummer", "verzekeraar"],
853
  supported_language=supported_language,
854
  ),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
855
  RegexCaptureRecognizer(
856
  entity="NL_LEGAL_PARTY_NAME",
857
  patterns=[
 
1
  """Dutch / European + Dutch legal recognizers for SolidPrivacy Scrub.
2
 
3
+ Phase 1-3 v8.1 update:
4
+ - adds category-level handling for broader Dutch court case numbers, incident numbers, claim references, other contextual references and KVK label variants;
5
+
6
  Phase 1-3 v8 update:
7
  - extends the taxonomy strategy with vehicle/object reference categories;
8
  - broadens context-bound reference values to include compact values such as
 
306
  return results
307
 
308
 
309
+ CASE_NUMBER_VALUE_REGEX = (
310
+ r"(?:"
311
+ # Civil/family court references: C/13/701234 / FA RK 26-321.
312
+ r"C/\d{2}/\d{5,6}\s*/\s*(?:[A-Z]{1,5}\s+){1,4}\d{2}[-/]\d{1,6}"
 
 
313
  r"|"
314
+ # Numeric court plus procedure block: 10598721 / UE VERZ 26-441.
315
+ r"\d{6,9}\s*/\s*(?:[A-Z]{1,5}\s+){1,4}\d{2}[-/]\d{1,6}"
316
+ r"|"
317
+ # Administrative law: ARN 26/4412.
318
+ r"[A-Z]{2,5}\s+\d{2}/\d{1,6}"
319
  r"|"
320
+ # Immigration: NL26.12345.
321
+ r"NL\d{2}\.\d{3,8}"
322
+ r"|"
323
+ # Enterprise chamber / appellate style: 200.345.678/01 OK.
324
  r"\d{3}\.\d{3}\.\d{3}/\d{2}\s+[A-Z]{1,5}"
325
+ r")"
326
+ )
327
+
328
+ GENERIC_REFERENCE_VALUE_REGEX = (
329
+ r"(?:"
330
+ # Common uppercase/legal admin codes: CL-FAM-55201, FACT-2026-4481,
331
+ # WR-KLANT-2026-7712, HRZ-SAM-2026-04, GEM-HLM-2026-2210.
332
+ r"(?=[A-Z0-9][A-Z0-9./_-]{4,59}\b)(?=[A-Z0-9./_-]*[A-Z])(?=[A-Z0-9./_-]*\d)"
333
+ r"[A-Z0-9]+(?:[./_-][A-Z0-9]+){1,10}"
334
  r"|"
335
+ # Compact context-bound reference values such as XX123X after \"kenteken\".
336
+ r"(?=[A-Z0-9]{5,12}\b)(?=[A-Z0-9]*[A-Z])(?=[A-Z0-9]*\d)[A-Z0-9]{5,12}"
337
+ r")"
338
  )
339
 
340
+ REFERENCE_VALUE_REGEX = re.compile(r"\b(?:" + CASE_NUMBER_VALUE_REGEX + r"|" + GENERIC_REFERENCE_VALUE_REGEX + r")\b")
341
+
342
 
343
  def _keyword_to_regex(keyword: str) -> str:
344
  """Turn a taxonomy keyword into a forgiving but bounded regex."""
 
643
  patterns=[
644
  (
645
  "kvk_labeled_value",
646
+ r"\b(?:kvk(?:[-\s]?nummer|\s?nr\.)?|kamer\s+van\s+koophandel)(?:[ \t]+(?:vennootschap|bedrijf|organisatie|rechtspersoon|vereniging|stichting))?\s*(?:is|:|#|-)?\s*(?P<value>\d{8})\b",
647
  ),
648
  ],
649
  score=0.88,
 
769
  patterns=[
770
  (
771
  "legal_case_labeled_value",
772
+ rf"\b(?:zaaknummer|zaaknr\.?|zaak\s?nr\.?|zaak-/rolnummer|zaak- en rolnummer|rol-/zaaknummer)\s*(?:is|:|#|-)?\s*(?P<value>{CASE_NUMBER_VALUE_REGEX}|{GENERIC_REFERENCE_VALUE_REGEX})\b",
773
  ),
774
  ],
775
  score=0.86,
 
867
  context=["schadenummer", "claimnummer", "polisnummer", "verzekeraar"],
868
  supported_language=supported_language,
869
  ),
870
+ RegexCaptureRecognizer(
871
+ entity="NL_INCIDENT_NUMBER",
872
+ patterns=[
873
+ (
874
+ "incident_labeled_value",
875
+ rf"\b(?:intern[ \t]+incidentnummer|incidentnummer|incidentnr\.?|incident[ \t]+nr\.?)\s*(?:is|:|#|-)?\s*(?P<value>{GENERIC_REFERENCE_VALUE_REGEX})\b",
876
+ ),
877
+ ],
878
+ score=0.91,
879
+ context=["incidentnummer", "incident", "intern incident", "melding"],
880
+ supported_language=supported_language,
881
+ ),
882
+ RegexCaptureRecognizer(
883
+ entity="NL_CLAIM_NUMBER",
884
+ patterns=[
885
+ (
886
+ "claim_labeled_value",
887
+ rf"\b(?:claimreferentie(?:[ \t]+verzekeraar)?|claim[ \t]+referentie|claimnummer|claimnr\.?)\s*(?:is|:|#|-)?\s*(?P<value>{GENERIC_REFERENCE_VALUE_REGEX})\b",
888
+ ),
889
+ ],
890
+ score=0.92,
891
+ context=["claimreferentie", "claimnummer", "verzekeraar", "schade"],
892
+ supported_language=supported_language,
893
+ ),
894
+ RegexCaptureRecognizer(
895
+ entity="NL_OTHER_REFERENCE",
896
+ patterns=[
897
+ (
898
+ "other_reference_labeled_value",
899
+ rf"\b(?:camerabeeld[ \t]+met[ \t]+referentie|camerareferentie|camera[ \t]+referentie|beeldreferentie|videoreferentie|reparatienummer|reparatie[ \t]+nummer|meldingsnummer|meldingnummer|rapportnummer|verslagreferentie)\s*(?:is|:|#|-)?\s*(?P<value>{GENERIC_REFERENCE_VALUE_REGEX})\b",
900
+ ),
901
+ ],
902
+ score=0.86,
903
+ context=["camerabeeld", "camera", "reparatienummer", "melding", "rapport", "verslag"],
904
+ supported_language=supported_language,
905
+ ),
906
  RegexCaptureRecognizer(
907
  entity="NL_LEGAL_PARTY_NAME",
908
  patterns=[