temsa commited on
Commit
0462997
·
verified ·
1 Parent(s): 7ff4693

Publish rc10

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +0 -30
  2. .gitignore +3 -0
  3. LICENSE +73 -0
  4. NOTICE +13 -0
  5. PORTFOLIO_COMPARISON.md +72 -0
  6. README.md +175 -0
  7. common.py +1665 -0
  8. config.json +318 -0
  9. eval/benchmark_summary.json +167 -0
  10. eval/benchmark_summary.md +43 -0
  11. eval/full_diffmask_fresh_holdout_v1.json +85 -0
  12. eval/full_diffmask_gap_uat_exact_v1.json +53 -0
  13. eval/full_globalpointer_context_redteam_v1.json +109 -0
  14. eval/full_globalpointer_context_redteam_v2.json +69 -0
  15. eval/full_globalpointer_context_redteam_v3.json +77 -0
  16. eval/full_globalpointer_context_redteam_v4.json +101 -0
  17. eval/full_globalpointer_demographic_patch_v2_test.json +109 -0
  18. eval/full_globalpointer_location_coverage_v1.json +61 -0
  19. eval/full_globalpointer_location_coverage_v2.json +61 -0
  20. eval/full_globalpointer_location_coverage_v3.json +61 -0
  21. eval/full_irish_core_pii_v1.json +109 -0
  22. eval/full_irish_dllm_hardening_exact_v1.json +101 -0
  23. eval/full_irish_extended_pii_v1.json +109 -0
  24. eval/full_irish_gov_chatbot_gap_holdout_v1.json +258 -0
  25. eval/full_irish_gov_chatbot_gap_holdout_v2.json +93 -0
  26. eval/full_irish_gov_chatbot_redteam_assistant_v2.json +84 -0
  27. eval/full_irish_gov_chatbot_redteam_user_v2.json +108 -0
  28. eval/full_irish_gov_chatbot_redteam_v1.json +362 -0
  29. eval/full_irish_gov_chatbot_redteam_v2.json +109 -0
  30. eval/full_irish_gov_contact_policy_v1.json +77 -0
  31. eval/full_irish_numeric_qafix_v2.json +45 -0
  32. eval/full_irish_ppsn_phone_edge_v1.json +37 -0
  33. eval/full_irish_remaining_gaps_v2.json +36 -0
  34. eval/full_multilingual_ppsn_v1_all.json +29 -0
  35. eval/full_runtime_profile_source.json +29 -0
  36. eval/label_inventory.json +20 -0
  37. eval/q8_diffmask_fresh_holdout_v1.json +85 -0
  38. eval/q8_diffmask_gap_uat_exact_v1.json +53 -0
  39. eval/q8_globalpointer_context_redteam_v1.json +109 -0
  40. eval/q8_globalpointer_context_redteam_v2.json +69 -0
  41. eval/q8_globalpointer_context_redteam_v3.json +77 -0
  42. eval/q8_globalpointer_context_redteam_v4.json +101 -0
  43. eval/q8_globalpointer_demographic_patch_v2_test.json +109 -0
  44. eval/q8_globalpointer_location_coverage_v1.json +61 -0
  45. eval/q8_globalpointer_location_coverage_v2.json +61 -0
  46. eval/q8_globalpointer_location_coverage_v3.json +61 -0
  47. eval/q8_irish_core_pii_v1.json +109 -0
  48. eval/q8_irish_dllm_hardening_exact_v1.json +101 -0
  49. eval/q8_irish_extended_pii_v1.json +109 -0
  50. eval/q8_irish_gov_chatbot_gap_holdout_v1.json +258 -0
.gitattributes CHANGED
@@ -1,35 +1,5 @@
1
- *.7z filter=lfs diff=lfs merge=lfs -text
2
- *.arrow filter=lfs diff=lfs merge=lfs -text
3
  *.bin filter=lfs diff=lfs merge=lfs -text
4
- *.bz2 filter=lfs diff=lfs merge=lfs -text
5
- *.ckpt filter=lfs diff=lfs merge=lfs -text
6
- *.ftz filter=lfs diff=lfs merge=lfs -text
7
- *.gz filter=lfs diff=lfs merge=lfs -text
8
- *.h5 filter=lfs diff=lfs merge=lfs -text
9
- *.joblib filter=lfs diff=lfs merge=lfs -text
10
- *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
- *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
- *.model filter=lfs diff=lfs merge=lfs -text
13
- *.msgpack filter=lfs diff=lfs merge=lfs -text
14
- *.npy filter=lfs diff=lfs merge=lfs -text
15
- *.npz filter=lfs diff=lfs merge=lfs -text
16
  *.onnx filter=lfs diff=lfs merge=lfs -text
17
- *.ot filter=lfs diff=lfs merge=lfs -text
18
- *.parquet filter=lfs diff=lfs merge=lfs -text
19
- *.pb filter=lfs diff=lfs merge=lfs -text
20
- *.pickle filter=lfs diff=lfs merge=lfs -text
21
- *.pkl filter=lfs diff=lfs merge=lfs -text
22
  *.pt filter=lfs diff=lfs merge=lfs -text
23
  *.pth filter=lfs diff=lfs merge=lfs -text
24
- *.rar filter=lfs diff=lfs merge=lfs -text
25
  *.safetensors filter=lfs diff=lfs merge=lfs -text
26
- saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
- *.tar.* filter=lfs diff=lfs merge=lfs -text
28
- *.tar filter=lfs diff=lfs merge=lfs -text
29
- *.tflite filter=lfs diff=lfs merge=lfs -text
30
- *.tgz filter=lfs diff=lfs merge=lfs -text
31
- *.wasm filter=lfs diff=lfs merge=lfs -text
32
- *.xz filter=lfs diff=lfs merge=lfs -text
33
- *.zip filter=lfs diff=lfs merge=lfs -text
34
- *.zst filter=lfs diff=lfs merge=lfs -text
35
- *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
1
  *.bin filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
 
 
2
  *.onnx filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
3
  *.pt filter=lfs diff=lfs merge=lfs -text
4
  *.pth filter=lfs diff=lfs merge=lfs -text
 
5
  *.safetensors filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
.gitignore ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ __pycache__/
2
+ *.pyc
3
+ .venv/
LICENSE ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
10
+
11
+ "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
12
+
13
+ "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
14
+
15
+ "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
16
+
17
+ "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
18
+
19
+ "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
20
+
21
+ "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
22
+
23
+ "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
24
+
25
+ "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."
26
+
27
+ "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
28
+
29
+ 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
30
+
31
+ 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
32
+
33
+ 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
34
+
35
+ (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and
36
+
37
+ (b) You must cause any modified files to carry prominent notices stating that You changed the files; and
38
+
39
+ (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
40
+
41
+ (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.
42
+
43
+ You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
44
+
45
+ 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
46
+
47
+ 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
48
+
49
+ 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
50
+
51
+ 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
52
+
53
+ 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
54
+
55
+ END OF TERMS AND CONDITIONS
56
+
57
+ APPENDIX: How to apply the Apache License to your work.
58
+
59
+ To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives.
60
+
61
+ Copyright [yyyy] [name of copyright owner]
62
+
63
+ Licensed under the Apache License, Version 2.0 (the "License");
64
+ you may not use this file except in compliance with the License.
65
+ You may obtain a copy of the License at
66
+
67
+ http://www.apache.org/licenses/LICENSE-2.0
68
+
69
+ Unless required by applicable law or agreed to in writing, software
70
+ distributed under the License is distributed on an "AS IS" BASIS,
71
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
72
+ See the License for the specific language governing permissions and
73
+ limitations under the License.
NOTICE ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ IrishCore-GlobalPointer-ContextPII-135M-v1-rc10
2
+
3
+ This release is derived from:
4
+ - OpenMed/OpenMed-PII-mLiteClinical-Base-135M-v1 (Apache-2.0)
5
+
6
+ Training and evaluation data used for this derivative included:
7
+ - temsa/OpenMed-Irish-CorePII-TrainMix-v1
8
+ - temsa/OpenMed-Irish-PPSN-Eircode-Spec-v1
9
+ - joelniklaus/mapa (CC-BY-4.0)
10
+ - gretelai/synthetic_pii_finance_multilingual (Apache-2.0)
11
+
12
+ Additional local synthetic hardening, UAT replay, and holdout sets were used during model selection.
13
+ Please review upstream licenses and dataset cards before redistributing derivative datasets.
PORTFOLIO_COMPARISON.md ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ## Portfolio Comparison
2
+
3
+ Updated: `2026-03-15`.
4
+
5
+ Use this section for the fastest public comparison across the `temsa` PII masking portfolio.
6
+
7
+ - The first core table only includes public checkpoints that ship both comparable q8 accuracy and q8 CPU throughput.
8
+ - The first PPSN table only includes public artifacts that ship comparable PPSN accuracy and CPU throughput.
9
+ - Missing cells in the archive tables mean the older release did not ship that metric in its public bundle.
10
+ - DiffMask rows use the reconciled `clean_single_pass` harness that matches the deployed runtime.
11
+ - GlobalPointer rows use the public raw-only span-matrix release bundle and its packaged q8 ONNX artifact.
12
+ - The same content is shipped as `PORTFOLIO_COMPARISON.md` inside each public model repo.
13
+
14
+ ### Irish Core PII: Comparable Public Checkpoints
15
+
16
+ | Repo | Stack | Full Core F1 | Q8 Core F1 | Q8 Multilingual PPSN F1 | Q8 Core ex/s |
17
+ |---|---|---:|---:|---:|---:|
18
+ | [`temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc10`](https://huggingface.co/temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc10) | GlobalPointer raw-only + context labels | 1.0000 | 1.0000 | 0.9333 | 125.8 |
19
+ | [`temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc9`](https://huggingface.co/temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc9) | GlobalPointer raw-only + context labels | 1.0000 | 1.0000 | 0.9333 | 119.8 |
20
+ | [`temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc8`](https://huggingface.co/temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc8) | GlobalPointer raw-only + context labels | 1.0000 | 1.0000 | 0.9333 | 128.9 |
21
+ | [`temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc7`](https://huggingface.co/temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc7) | GlobalPointer raw-only + context labels | 1.0000 | 1.0000 | 0.9333 | 89.0 |
22
+ | [`temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc6`](https://huggingface.co/temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc6) | GlobalPointer raw-only + context labels | 1.0000 | 1.0000 | 0.9333 | 89.0 |
23
+ | [`temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc5`](https://huggingface.co/temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc5) | GlobalPointer raw-only + context labels | 1.0000 | 1.0000 | 0.9333 | 84.5 |
24
+ | [`temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc4`](https://huggingface.co/temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc4) | GlobalPointer raw-only + context labels | 0.9935 | 0.9935 | 0.9333 | 61.5 |
25
+ | [`temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc3`](https://huggingface.co/temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc3) | GlobalPointer raw-only + context labels | 0.9935 | 0.9935 | 0.9333 | 61.5 |
26
+ | [`temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc2`](https://huggingface.co/temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc2) | GlobalPointer raw-only + context labels | 0.9935 | 0.9935 | 0.9222 | 61.5 |
27
+ | [`temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc1`](https://huggingface.co/temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc1) | GlobalPointer raw-only + context labels | 0.9935 | 0.9935 | 0.9222 | 61.5 |
28
+ | [`temsa/IrishCore-GlobalPointer-135M-v1-rc4`](https://huggingface.co/temsa/IrishCore-GlobalPointer-135M-v1-rc4) | GlobalPointer raw-only span-matrix | 1.0000 | 1.0000 | 0.9333 | 221.6 |
29
+ | [`temsa/IrishCore-GlobalPointer-135M-v1-rc3`](https://huggingface.co/temsa/IrishCore-GlobalPointer-135M-v1-rc3) | GlobalPointer raw-only span-matrix | 1.0000 | 1.0000 | 0.9213 | 204.9 |
30
+ | [`temsa/IrishCore-GlobalPointer-135M-v1-rc2`](https://huggingface.co/temsa/IrishCore-GlobalPointer-135M-v1-rc2) | GlobalPointer raw-only span-matrix | 0.9934 | 0.9934 | 0.9326 | 231.2 |
31
+ | [`temsa/OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc8`](https://huggingface.co/temsa/OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc8) | Raw-only token-span | 0.9737 | 0.9737 | 0.9176 | 46.1 |
32
+ | [`temsa/OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc7`](https://huggingface.co/temsa/OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc7) | Hybrid classifier + generated scanner spec | 1.0000 | 0.9934 | 1.0000 | 30.0 |
33
+ | [`temsa/OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc6`](https://huggingface.co/temsa/OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc6) | Hybrid classifier + repair decoders | 1.0000 | 0.9934 | 1.0000 | 29.5 |
34
+ | [`temsa/OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc5`](https://huggingface.co/temsa/OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc5) | Hybrid classifier + repair decoders | 0.9737 | 0.9669 | 0.9333 | 34.4 |
35
+ | [`temsa/OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc4`](https://huggingface.co/temsa/OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc4) | Hybrid classifier + repair decoders | 0.9870 | 0.9740 | 0.9600 | 114.2 |
36
+ | [`temsa/OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc3`](https://huggingface.co/temsa/OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc3) | Hybrid classifier + repair decoders | 0.9806 | 0.9677 | 0.9333 | 44.9 |
37
+ | [`temsa/OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc2`](https://huggingface.co/temsa/OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc2) | Hybrid classifier + repair decoders | 0.9554 | 0.9615 | 0.7887 | 119.1 |
38
+ | [`temsa/OpenMed-mLiteClinical-IrishCorePII-135M-v1`](https://huggingface.co/temsa/OpenMed-mLiteClinical-IrishCorePII-135M-v1) | Hybrid classifier baseline | 0.9530 | 0.9333 | 0.9882 | 103.3 |
39
+ | [`temsa/IrishCore-DiffMask-135M-v1-rc6`](https://huggingface.co/temsa/IrishCore-DiffMask-135M-v1-rc6) | DiffMask token-span, scanner-free | 0.9801 | 0.9733 | 0.9274 | 130.3 |
40
+ | [`temsa/IrishCore-DiffMask-135M-v1-rc5`](https://huggingface.co/temsa/IrishCore-DiffMask-135M-v1-rc5) | DiffMask token-span, scanner-free | 0.9733 | 0.9733 | 0.9379 | 249.2 |
41
+ | [`temsa/IrishCore-DiffMask-135M-v1-rc4`](https://huggingface.co/temsa/IrishCore-DiffMask-135M-v1-rc4) | DiffMask token-span, scanner-free | 0.9733 | 0.9733 | 0.9371 | 29.5 |
42
+ | [`temsa/IrishCore-DiffMask-135M-v1-rc3`](https://huggingface.co/temsa/IrishCore-DiffMask-135M-v1-rc3) | DiffMask token-span, scanner-free | 0.9664 | 0.9664 | 0.9591 | 30.0 |
43
+ | [`temsa/IrishCore-DiffMask-135M-v1-rc2`](https://huggingface.co/temsa/IrishCore-DiffMask-135M-v1-rc2) | DiffMask token-span, scanner-free | 0.9664 | 0.9664 | 0.9212 | 247.1 |
44
+ | [`temsa/IrishCore-DiffMask-135M-v1-rc1`](https://huggingface.co/temsa/IrishCore-DiffMask-135M-v1-rc1) | DiffMask token-span, scanner-free | 0.9801 | 0.9934 | 0.9412 | 251.2 |
45
+
46
+ ### Irish Core PII: Other Public Checkpoints
47
+
48
+ | Repo | Stack | Full Core F1 | Q8 Core F1 | Q8 Multilingual PPSN F1 | Notes |
49
+ |---|---|---:|---:|---:|---|
50
+ | [`temsa/OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc1`](https://huggingface.co/temsa/OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc1) | Hybrid classifier prototype | 0.9487 | — | — | Predates the public q8 artifact. |
51
+
52
+ Finance-boundary q8 F1 is `1.0000` for `OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc6`, `OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc7`, `OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc8`, and all public `IrishCore-DiffMask` releases from `rc1` to `rc6`. `OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc5` ships `0.8750` on that public q8 suite.
53
+
54
+ ### PPSN-Only: Comparable Public Artifacts
55
+
56
+ | Repo | Artifact | Irish Large F1 | Multilingual PPSN F1 | User Raw F1 | QA v8 F1 | CPU ex/s |
57
+ |---|---|---:|---:|---:|---:|---:|
58
+ | [`temsa/OpenMed-mLiteClinical-IrishPPSN-135M-v1`](https://huggingface.co/temsa/OpenMed-mLiteClinical-IrishPPSN-135M-v1) | fp32 canonical checkpoint | 0.8979 | 0.9704 | 0.8000 | 0.7385 | 57.4 |
59
+ | [`temsa/OpenMed-mLiteClinical-IrishPPSN-135M-v1-fp16`](https://huggingface.co/temsa/OpenMed-mLiteClinical-IrishPPSN-135M-v1-fp16) | fp16 CPU/GPU artifact | — | 0.9704 | 0.8000 | 0.7385 | 45.8 |
60
+ | [`temsa/OpenMed-mLiteClinical-IrishPPSN-135M-v1-q8`](https://huggingface.co/temsa/OpenMed-mLiteClinical-IrishPPSN-135M-v1-q8) | dynamic int8 CPU artifact | — | 0.9040 | — | — | 132.1 |
61
+
62
+ ### PPSN-Only: Historical Public Checkpoints
63
+
64
+ | Repo | Main Published Metrics | Notes |
65
+ |---|---|---|
66
+ | [`temsa/OpenMed-PPSN-mLiteClinical-v1`](https://huggingface.co/temsa/OpenMed-PPSN-mLiteClinical-v1) | same as canonical fp32 repo: multilingual 0.9704, user raw 0.8000 | Legacy alias; prefer `temsa/OpenMed-mLiteClinical-IrishPPSN-135M-v1`. |
67
+ | [`temsa/OpenMed-PPSN-v6-raw-rc2`](https://huggingface.co/temsa/OpenMed-PPSN-v6-raw-rc2) | irish_reg_v5 0.8750; user_raw 0.8000; qa_v8 0.7385 | Raw PPSN-only research checkpoint; no packaged multilingual CPU benchmark row. |
68
+ | [`temsa/OpenMed-PPSN-v5_1`](https://huggingface.co/temsa/OpenMed-PPSN-v5_1) | irish_large_v2 raw 0.9285; qa_v6 hybrid strict 1.0000 | Hybrid PPSN-only checkpoint; predates the canonical multilingual suite packaging. |
69
+ | [`temsa/OpenMed-PPSN-v5`](https://huggingface.co/temsa/OpenMed-PPSN-v5) | irish_reg_v5 raw 0.8235; irish_reg_v5 hybrid strict 1.0000 | Hybrid PPSN-only checkpoint; predates the canonical multilingual suite packaging. |
70
+ | [`temsa/OpenMed-PPSN-v4`](https://huggingface.co/temsa/OpenMed-PPSN-v4) | synthetic non-PPSN drift check only | Predates the current PPSN eval suite; no packaged apples-to-apples multilingual CPU row. |
71
+
72
+ If you need the strongest current raw-only Irish core model, start with `IrishCore-GlobalPointer-135M-v1-rc4`. If you need the fastest CPU-first raw-only line, compare it against `IrishCore-DiffMask-135M-v1-rc6`. If you need a PPSN-only artifact, compare the canonical `fp32`, `fp16`, and `q8` variants of `OpenMed-mLiteClinical-IrishPPSN-135M-v1` directly in the table above.
README.md ADDED
@@ -0,0 +1,175 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ language:
3
+ - en
4
+ - ga
5
+ license: apache-2.0
6
+ pipeline_tag: token-classification
7
+ tags:
8
+ - pii-masking
9
+ - token-classification
10
+ - globalpointer
11
+ - onnx
12
+ - dynamic-quantization
13
+ - ireland
14
+ - irish
15
+ - gaelic
16
+ ---
17
+
18
+ # IrishCore-GlobalPointer-ContextPII-135M-v1-rc10
19
+
20
+ `IrishCore-GlobalPointer-ContextPII-135M-v1-rc10` is the current expanded-label raw-only PII masking release for Irish public-sector, HSE, and citizen-support flows.
21
+
22
+ It keeps the same DistilBERT-size GlobalPointer span extractor family as `temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc9`, but ships a stronger bundled decoder for lowercase self-identification names, city-before-postcode recovery, wider street suffix coverage, dotted/month-first DOB recovery, and dotted phone formatting.
23
+
24
+ Context labels served by this line:
25
+
26
+ - `STREET_ADDRESS`
27
+ - `CITY`
28
+ - `COUNTY`
29
+ - `DATE_OF_BIRTH`
30
+ - `AGE`
31
+
32
+ Core labels retained:
33
+
34
+ - `PPSN`
35
+ - `POSTCODE`
36
+ - `PHONE_NUMBER`
37
+ - `EMAIL`
38
+ - `PASSPORT_NUMBER`
39
+ - `ACCOUNT_NUMBER`
40
+ - `BANK_ROUTING_NUMBER`
41
+ - `SWIFT_BIC`
42
+ - `CREDIT_DEBIT_CARD`
43
+ - `FIRST_NAME`
44
+ - `LAST_NAME`
45
+
46
+ ## Positioning
47
+
48
+ `rc10` is a decoder-hardening release over `rc9`.
49
+
50
+ - weights unchanged
51
+ - ONNX graph unchanged
52
+ - no external scanner or validator added
53
+ - deployment path still single-pass span extraction plus deterministic `[PII:LABEL]` replacement
54
+
55
+ What changed in `rc10`:
56
+
57
+ - the decoder now recovers lowercase self-identification names from cues like `my name is aoife murphy` and `is mise eibhlín ní bhroin`
58
+ - the decoder now recovers city spans immediately before an Eircode even when the town is outside the hardcoded city list, for example `Naas, W91 XY45` and `An Nás, W91 XY45`
59
+ - the decoder now accepts broader Irish street suffixes such as `Crescent`, `Grove`, `Green`, `Court`, `Manor`, and `Mews`
60
+ - the decoder now accepts dotted and month-first DOB formats such as `14.03.1991` and `March 14, 1991`
61
+ - the decoder now accepts dotted phone formatting such as `087.123.4567`
62
+ - the new `globalpointer_context_redteam_v4` suite is `1.0000` on both full and q8 paths; the packaged public `rc9` bundle scores `1.0000` on the same suite
63
+
64
+ If you only need the narrower Irish-core structured label set and want maximum CPU throughput, `temsa/IrishCore-GlobalPointer-135M-v1-rc4` remains the faster option.
65
+
66
+ ## Benchmarks
67
+
68
+ ### ONNX q8
69
+
70
+ | Suite | F1 | Examples/s |
71
+ | --- | ---: | ---: |
72
+ | Irish core | 1.0000 | 125.8211 |
73
+ | Gov contact policy v1 | 1.0000 | 81.2823 |
74
+ | Gov chatbot red-team v2 | 0.9861 | 76.3120 |
75
+ | Context red-team v3 | 1.0000 | 115.7841 |
76
+ | Context red-team v4 | 1.0000 | 115.2060 |
77
+ | Multilingual PPSN overall | 0.9333 | 113.8253 |
78
+ | Multilingual PPSN label-only | 1.0000 | — |
79
+
80
+ ### Comparison
81
+
82
+ | Model | Core F1 | Gov Contact Policy v1 F1 | Context Red-team v4 F1 | Multilingual F1 | Core examples/s |
83
+ | --- | ---: | ---: | ---: | ---: | ---: |
84
+ | ContextPII rc10 q8 | 1.0000 | 1.0000 | 1.0000 | 0.9333 | 125.8211 |
85
+ | ContextPII rc9 q8 | 1.0000 | 1.0000 | 1.0000 | 0.9333 | 125.8211 |
86
+ | ContextPII rc8 q8 | 1.0000 | 1.0000 | 0.0000 | 0.9333 | 128.8825 |
87
+
88
+ ## Evaluation Notes
89
+
90
+ Additional q8 release checks shipped in this repo:
91
+
92
+ - `eval/q8_globalpointer_context_redteam_v4.json`: contextual regression suite for lowercase self-identification names, city-before-postcode recovery, broader street suffixes, dotted/month-first DOBs, and dotted phone formatting, `1.0000` F1 in `rc10`
93
+ - `eval/q8_globalpointer_context_redteam_v3.json`: contextual regression suite for age phrasing, Gaelic ordinal DOBs, parenthesized landlines, and date-internal city/name overlap cleanup, `1.0000` F1
94
+ - `eval/q8_globalpointer_location_coverage_v1.json`, `v2`, `v3`: Irish location coverage suites, all retained from `rc9`
95
+
96
+ ## Usage
97
+
98
+ ```bash
99
+ python3 inference_mask_onnx.py --model temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc10 --text "my name is aoife murphy, Date of birth: March 14, 1991, Phone: 087.123.4567, Address: 14 Cedar Crescent, Naas, W91 XY45."
100
+ ```
101
+
102
+ <!-- portfolio-comparison:start -->
103
+ ## Portfolio Comparison
104
+
105
+ Updated: `2026-03-15`.
106
+
107
+ Use this section for the fastest public comparison across the `temsa` PII masking portfolio.
108
+
109
+ - The first core table only includes public checkpoints that ship both comparable q8 accuracy and q8 CPU throughput.
110
+ - The first PPSN table only includes public artifacts that ship comparable PPSN accuracy and CPU throughput.
111
+ - Missing cells in the archive tables mean the older release did not ship that metric in its public bundle.
112
+ - DiffMask rows use the reconciled `clean_single_pass` harness that matches the deployed runtime.
113
+ - GlobalPointer rows use the public raw-only span-matrix release bundle and its packaged q8 ONNX artifact.
114
+ - The same content is shipped as `PORTFOLIO_COMPARISON.md` inside each public model repo.
115
+
116
+ ### Irish Core PII: Comparable Public Checkpoints
117
+
118
+ | Repo | Stack | Full Core F1 | Q8 Core F1 | Q8 Multilingual PPSN F1 | Q8 Core ex/s |
119
+ |---|---|---:|---:|---:|---:|
120
+ | [`temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc10`](https://huggingface.co/temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc10) | GlobalPointer raw-only + context labels | 1.0000 | 1.0000 | 0.9333 | 125.8 |
121
+ | [`temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc9`](https://huggingface.co/temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc9) | GlobalPointer raw-only + context labels | 1.0000 | 1.0000 | 0.9333 | 119.8 |
122
+ | [`temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc8`](https://huggingface.co/temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc8) | GlobalPointer raw-only + context labels | 1.0000 | 1.0000 | 0.9333 | 128.9 |
123
+ | [`temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc7`](https://huggingface.co/temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc7) | GlobalPointer raw-only + context labels | 1.0000 | 1.0000 | 0.9333 | 89.0 |
124
+ | [`temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc6`](https://huggingface.co/temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc6) | GlobalPointer raw-only + context labels | 1.0000 | 1.0000 | 0.9333 | 89.0 |
125
+ | [`temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc5`](https://huggingface.co/temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc5) | GlobalPointer raw-only + context labels | 1.0000 | 1.0000 | 0.9333 | 84.5 |
126
+ | [`temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc4`](https://huggingface.co/temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc4) | GlobalPointer raw-only + context labels | 0.9935 | 0.9935 | 0.9333 | 61.5 |
127
+ | [`temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc3`](https://huggingface.co/temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc3) | GlobalPointer raw-only + context labels | 0.9935 | 0.9935 | 0.9333 | 61.5 |
128
+ | [`temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc2`](https://huggingface.co/temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc2) | GlobalPointer raw-only + context labels | 0.9935 | 0.9935 | 0.9222 | 61.5 |
129
+ | [`temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc1`](https://huggingface.co/temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc1) | GlobalPointer raw-only + context labels | 0.9935 | 0.9935 | 0.9222 | 61.5 |
130
+ | [`temsa/IrishCore-GlobalPointer-135M-v1-rc4`](https://huggingface.co/temsa/IrishCore-GlobalPointer-135M-v1-rc4) | GlobalPointer raw-only span-matrix | 1.0000 | 1.0000 | 0.9333 | 221.6 |
131
+ | [`temsa/IrishCore-GlobalPointer-135M-v1-rc3`](https://huggingface.co/temsa/IrishCore-GlobalPointer-135M-v1-rc3) | GlobalPointer raw-only span-matrix | 1.0000 | 1.0000 | 0.9213 | 204.9 |
132
+ | [`temsa/IrishCore-GlobalPointer-135M-v1-rc2`](https://huggingface.co/temsa/IrishCore-GlobalPointer-135M-v1-rc2) | GlobalPointer raw-only span-matrix | 0.9934 | 0.9934 | 0.9326 | 231.2 |
133
+ | [`temsa/OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc8`](https://huggingface.co/temsa/OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc8) | Raw-only token-span | 0.9737 | 0.9737 | 0.9176 | 46.1 |
134
+ | [`temsa/OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc7`](https://huggingface.co/temsa/OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc7) | Hybrid classifier + generated scanner spec | 1.0000 | 0.9934 | 1.0000 | 30.0 |
135
+ | [`temsa/OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc6`](https://huggingface.co/temsa/OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc6) | Hybrid classifier + repair decoders | 1.0000 | 0.9934 | 1.0000 | 29.5 |
136
+ | [`temsa/OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc5`](https://huggingface.co/temsa/OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc5) | Hybrid classifier + repair decoders | 0.9737 | 0.9669 | 0.9333 | 34.4 |
137
+ | [`temsa/OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc4`](https://huggingface.co/temsa/OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc4) | Hybrid classifier + repair decoders | 0.9870 | 0.9740 | 0.9600 | 114.2 |
138
+ | [`temsa/OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc3`](https://huggingface.co/temsa/OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc3) | Hybrid classifier + repair decoders | 0.9806 | 0.9677 | 0.9333 | 44.9 |
139
+ | [`temsa/OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc2`](https://huggingface.co/temsa/OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc2) | Hybrid classifier + repair decoders | 0.9554 | 0.9615 | 0.7887 | 119.1 |
140
+ | [`temsa/OpenMed-mLiteClinical-IrishCorePII-135M-v1`](https://huggingface.co/temsa/OpenMed-mLiteClinical-IrishCorePII-135M-v1) | Hybrid classifier baseline | 0.9530 | 0.9333 | 0.9882 | 103.3 |
141
+ | [`temsa/IrishCore-DiffMask-135M-v1-rc6`](https://huggingface.co/temsa/IrishCore-DiffMask-135M-v1-rc6) | DiffMask token-span, scanner-free | 0.9801 | 0.9733 | 0.9274 | 130.3 |
142
+ | [`temsa/IrishCore-DiffMask-135M-v1-rc5`](https://huggingface.co/temsa/IrishCore-DiffMask-135M-v1-rc5) | DiffMask token-span, scanner-free | 0.9733 | 0.9733 | 0.9379 | 249.2 |
143
+ | [`temsa/IrishCore-DiffMask-135M-v1-rc4`](https://huggingface.co/temsa/IrishCore-DiffMask-135M-v1-rc4) | DiffMask token-span, scanner-free | 0.9733 | 0.9733 | 0.9371 | 29.5 |
144
+ | [`temsa/IrishCore-DiffMask-135M-v1-rc3`](https://huggingface.co/temsa/IrishCore-DiffMask-135M-v1-rc3) | DiffMask token-span, scanner-free | 0.9664 | 0.9664 | 0.9591 | 30.0 |
145
+ | [`temsa/IrishCore-DiffMask-135M-v1-rc2`](https://huggingface.co/temsa/IrishCore-DiffMask-135M-v1-rc2) | DiffMask token-span, scanner-free | 0.9664 | 0.9664 | 0.9212 | 247.1 |
146
+ | [`temsa/IrishCore-DiffMask-135M-v1-rc1`](https://huggingface.co/temsa/IrishCore-DiffMask-135M-v1-rc1) | DiffMask token-span, scanner-free | 0.9801 | 0.9934 | 0.9412 | 251.2 |
147
+
148
+ ### Irish Core PII: Other Public Checkpoints
149
+
150
+ | Repo | Stack | Full Core F1 | Q8 Core F1 | Q8 Multilingual PPSN F1 | Notes |
151
+ |---|---|---:|---:|---:|---|
152
+ | [`temsa/OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc1`](https://huggingface.co/temsa/OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc1) | Hybrid classifier prototype | 0.9487 | — | — | Predates the public q8 artifact. |
153
+
154
+ Finance-boundary q8 F1 is `1.0000` for `OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc6`, `OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc7`, `OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc8`, and all public `IrishCore-DiffMask` releases from `rc1` to `rc6`. `OpenMed-mLiteClinical-IrishCorePII-135M-v2-rc5` ships `0.8750` on that public q8 suite.
155
+
156
+ ### PPSN-Only: Comparable Public Artifacts
157
+
158
+ | Repo | Artifact | Irish Large F1 | Multilingual PPSN F1 | User Raw F1 | QA v8 F1 | CPU ex/s |
159
+ |---|---|---:|---:|---:|---:|---:|
160
+ | [`temsa/OpenMed-mLiteClinical-IrishPPSN-135M-v1`](https://huggingface.co/temsa/OpenMed-mLiteClinical-IrishPPSN-135M-v1) | fp32 canonical checkpoint | 0.8979 | 0.9704 | 0.8000 | 0.7385 | 57.4 |
161
+ | [`temsa/OpenMed-mLiteClinical-IrishPPSN-135M-v1-fp16`](https://huggingface.co/temsa/OpenMed-mLiteClinical-IrishPPSN-135M-v1-fp16) | fp16 CPU/GPU artifact | — | 0.9704 | 0.8000 | 0.7385 | 45.8 |
162
+ | [`temsa/OpenMed-mLiteClinical-IrishPPSN-135M-v1-q8`](https://huggingface.co/temsa/OpenMed-mLiteClinical-IrishPPSN-135M-v1-q8) | dynamic int8 CPU artifact | — | 0.9040 | — | — | 132.1 |
163
+
164
+ ### PPSN-Only: Historical Public Checkpoints
165
+
166
+ | Repo | Main Published Metrics | Notes |
167
+ |---|---|---|
168
+ | [`temsa/OpenMed-PPSN-mLiteClinical-v1`](https://huggingface.co/temsa/OpenMed-PPSN-mLiteClinical-v1) | same as canonical fp32 repo: multilingual 0.9704, user raw 0.8000 | Legacy alias; prefer `temsa/OpenMed-mLiteClinical-IrishPPSN-135M-v1`. |
169
+ | [`temsa/OpenMed-PPSN-v6-raw-rc2`](https://huggingface.co/temsa/OpenMed-PPSN-v6-raw-rc2) | irish_reg_v5 0.8750; user_raw 0.8000; qa_v8 0.7385 | Raw PPSN-only research checkpoint; no packaged multilingual CPU benchmark row. |
170
+ | [`temsa/OpenMed-PPSN-v5_1`](https://huggingface.co/temsa/OpenMed-PPSN-v5_1) | irish_large_v2 raw 0.9285; qa_v6 hybrid strict 1.0000 | Hybrid PPSN-only checkpoint; predates the canonical multilingual suite packaging. |
171
+ | [`temsa/OpenMed-PPSN-v5`](https://huggingface.co/temsa/OpenMed-PPSN-v5) | irish_reg_v5 raw 0.8235; irish_reg_v5 hybrid strict 1.0000 | Hybrid PPSN-only checkpoint; predates the canonical multilingual suite packaging. |
172
+ | [`temsa/OpenMed-PPSN-v4`](https://huggingface.co/temsa/OpenMed-PPSN-v4) | synthetic non-PPSN drift check only | Predates the current PPSN eval suite; no packaged apples-to-apples multilingual CPU row. |
173
+
174
+ If you need the strongest current raw-only Irish core model, start with `IrishCore-GlobalPointer-135M-v1-rc4`. If you need the fastest CPU-first raw-only line, compare it against `IrishCore-DiffMask-135M-v1-rc6`. If you need a PPSN-only artifact, compare the canonical `fp32`, `fp16`, and `q8` variants of `OpenMed-mLiteClinical-IrishPPSN-135M-v1` directly in the table above.
175
+ <!-- portfolio-comparison:end -->
common.py ADDED
@@ -0,0 +1,1665 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ from __future__ import annotations
3
+
4
+ import math
5
+ import re
6
+ from pathlib import Path
7
+ import sys
8
+ from typing import Any
9
+ import unicodedata
10
+
11
+ import numpy as np
12
+
13
+ ROOT_DIR = Path(__file__).resolve().parents[2]
14
+ if str(ROOT_DIR) not in sys.path:
15
+ sys.path.insert(0, str(ROOT_DIR))
16
+
17
+ try:
18
+ from ..irish_core_span_raw_only.common import (
19
+ dedupe_spans,
20
+ label_max_span_tokens_from_config,
21
+ label_min_nonspace_chars_from_config,
22
+ label_names_from_config,
23
+ load_onnx_session,
24
+ normalize_entity_name,
25
+ safe_auto_tokenizer,
26
+ )
27
+ except ImportError:
28
+ from experiments.irish_core_span_raw_only.common import (
29
+ dedupe_spans,
30
+ label_max_span_tokens_from_config,
31
+ label_min_nonspace_chars_from_config,
32
+ label_names_from_config,
33
+ load_onnx_session,
34
+ normalize_entity_name,
35
+ safe_auto_tokenizer,
36
+ )
37
+
38
+
39
+ def label_thresholds_from_config(config, default_threshold: float) -> dict[str, float]:
40
+ raw = getattr(config, "span_label_thresholds", None) or {}
41
+ out = {normalize_entity_name(key): float(value) for key, value in raw.items()}
42
+ for label in label_names_from_config(config):
43
+ out.setdefault(label, float(default_threshold))
44
+ return out
45
+
46
+
47
+ def valid_offset(offset: tuple[int, int]) -> bool:
48
+ return bool(offset) and int(offset[1]) > int(offset[0])
49
+
50
+
51
+ def nonspace_length(text: str, start: int, end: int) -> int:
52
+ return sum(0 if ch.isspace() else 1 for ch in text[int(start) : int(end)])
53
+
54
+
55
+ def alnum_upper(text: str) -> str:
56
+ return "".join(ch for ch in text.upper() if ch.isalnum())
57
+
58
+
59
+ def normalize_surface(text: str) -> str:
60
+ value = unicodedata.normalize("NFKD", text)
61
+ value = "".join(ch for ch in value if not unicodedata.combining(ch))
62
+ value = value.replace("\u00A0", " ").replace("\u202F", " ")
63
+ value = re.sub(r"\s+", " ", value.strip().lower())
64
+ return value
65
+
66
+
67
+ IRISH_CITY_FORMS = (
68
+ "Dublin",
69
+ "Baile Átha Cliath",
70
+ "Galway",
71
+ "Gaillimh",
72
+ "Cork",
73
+ "Cork City",
74
+ "Corcaigh",
75
+ "Limerick",
76
+ "Luimneach",
77
+ "Waterford",
78
+ "Port Láirge",
79
+ "Kilkenny",
80
+ "Cill Chainnigh",
81
+ "Carlow",
82
+ "Ceatharlach",
83
+ "Sligo",
84
+ "Sligeach",
85
+ "Tralee",
86
+ "Trá Lí",
87
+ "Ennis",
88
+ "Inis",
89
+ "Letterkenny",
90
+ "Leitir Ceanainn",
91
+ "Castlebar",
92
+ "Caisleán an Bharraigh",
93
+ "Caislean an Bharraigh",
94
+ "gCaisleán an Bharraigh",
95
+ "gCaislean an Bharraigh",
96
+ "Wexford",
97
+ "Loch Garman",
98
+ "Navan",
99
+ "Uaimh",
100
+ "An Uaimh",
101
+ "hUaimh",
102
+ "nUaimh",
103
+ "Dundalk",
104
+ "Dún Dealgan",
105
+ "Dun Dealgan",
106
+ "Mullingar",
107
+ "Muileann gCearr",
108
+ "An Muileann gCearr",
109
+ "Tullamore",
110
+ "Tulach Mhór",
111
+ "Tulach Mhor",
112
+ "dTulach Mhór",
113
+ "dTulach Mhor",
114
+ "Portlaoise",
115
+ "Port Laoise",
116
+ "bPort Laoise",
117
+ "Bray",
118
+ "Bré",
119
+ "Bre",
120
+ "mBré",
121
+ "mBre",
122
+ "Athlone",
123
+ "Baile Átha Luain",
124
+ "Baile Atha Luain",
125
+ "mBaile Átha Luain",
126
+ "mBaile Atha Luain",
127
+ )
128
+ IRISH_CITY_SURFACES = {normalize_surface(value) for value in IRISH_CITY_FORMS}
129
+
130
+ IRISH_COUNTY_FORMS = (
131
+ "Co. Dublin",
132
+ "County Dublin",
133
+ "Co. Bhaile Átha Cliath",
134
+ "Contae Bhaile Átha Cliath",
135
+ "gContae Bhaile Átha Cliath",
136
+ "Co. Galway",
137
+ "County Galway",
138
+ "Co. na Gaillimhe",
139
+ "Contae na Gaillimhe",
140
+ "gContae na Gaillimhe",
141
+ "Co. Cork",
142
+ "County Cork",
143
+ "Co. Chorcaí",
144
+ "Contae Chorcaí",
145
+ "gContae Chorcaí",
146
+ "Co. Limerick",
147
+ "County Limerick",
148
+ "Co. Luimnigh",
149
+ "Contae Luimnigh",
150
+ "gContae Luimnigh",
151
+ "Co. Waterford",
152
+ "County Waterford",
153
+ "Co. Phort Láirge",
154
+ "Contae Phort Láirge",
155
+ "gContae Phort Láirge",
156
+ "Co. Kilkenny",
157
+ "County Kilkenny",
158
+ "Co. Chill Chainnigh",
159
+ "Contae Chill Chainnigh",
160
+ "gContae Chill Chainnigh",
161
+ "Co. Carlow",
162
+ "County Carlow",
163
+ "Co. Cheatharlach",
164
+ "Contae Cheatharlach",
165
+ "gContae Cheatharlach",
166
+ "Co. Sligo",
167
+ "County Sligo",
168
+ "Co. Shligigh",
169
+ "Contae Shligigh",
170
+ "gContae Shligigh",
171
+ "Co. Kerry",
172
+ "County Kerry",
173
+ "Co. Chiarraí",
174
+ "Contae Chiarraí",
175
+ "gContae Chiarraí",
176
+ "Co. Clare",
177
+ "County Clare",
178
+ "Co. an Chláir",
179
+ "Contae an Chláir",
180
+ "gContae an Chláir",
181
+ "Co. Donegal",
182
+ "County Donegal",
183
+ "Co. Dhún na nGall",
184
+ "Co. Dhun na nGall",
185
+ "Contae Dhún na nGall",
186
+ "Contae Dhun na nGall",
187
+ "gContae Dhún na nGall",
188
+ "gContae Dhun na nGall",
189
+ "Co. Mayo",
190
+ "County Mayo",
191
+ "Co. Mhaigh Eo",
192
+ "Contae Mhaigh Eo",
193
+ "gContae Mhaigh Eo",
194
+ "Co. Wexford",
195
+ "County Wexford",
196
+ "Co. Loch Garman",
197
+ "Contae Loch Garman",
198
+ "gContae Loch Garman",
199
+ "Co. Meath",
200
+ "County Meath",
201
+ "Co. na Mí",
202
+ "Co. na Mi",
203
+ "Contae na Mí",
204
+ "Contae na Mi",
205
+ "gContae na Mí",
206
+ "gContae na Mi",
207
+ "Co. Louth",
208
+ "County Louth",
209
+ "Co. Lú",
210
+ "Co. Lu",
211
+ "Contae Lú",
212
+ "Contae Lu",
213
+ "gContae Lú",
214
+ "gContae Lu",
215
+ "Co. Westmeath",
216
+ "County Westmeath",
217
+ "Co. na hIarmhí",
218
+ "Co. na hIarmhi",
219
+ "Contae na hIarmhí",
220
+ "Contae na hIarmhi",
221
+ "gContae na hIarmhí",
222
+ "gContae na hIarmhi",
223
+ "Co. Offaly",
224
+ "County Offaly",
225
+ "Co. Uíbh Fhailí",
226
+ "Co. Uibh Fhaili",
227
+ "Contae Uíbh Fhailí",
228
+ "Contae Uibh Fhaili",
229
+ "gContae Uíbh Fhailí",
230
+ "gContae Uibh Fhaili",
231
+ "Co. Laois",
232
+ "County Laois",
233
+ "Contae Laoise",
234
+ "gContae Laoise",
235
+ "Co. Wicklow",
236
+ "County Wicklow",
237
+ "Co. Chill Mhantáin",
238
+ "Co. Chill Mhantain",
239
+ "Contae Chill Mhantáin",
240
+ "Contae Chill Mhantain",
241
+ "gContae Chill Mhantáin",
242
+ "gContae Chill Mhantain",
243
+ )
244
+ IRISH_COUNTY_SURFACES = {normalize_surface(value) for value in IRISH_COUNTY_FORMS}
245
+ IRISH_CITY_PREFIX_CHARS = {"n", "g", "m", "b", "d", "h"}
246
+
247
+ STREET_SUFFIX_RE = re.compile(
248
+ r"(?i)\b(street|road|avenue|lane|park|view|square|terrace|drive|close|way|place|crescent|grove|green|court|manor|mews|gardens?|heights|bóthar|bothar|sráid|sraid|lána|lana)\b"
249
+ )
250
+ PHONE_SURFACE_RE = re.compile(r"^[+().\d][+().\d \-/\u00A0\u202F]*\d$")
251
+ ACCOUNT_DIGIT_SURFACE_RE = re.compile(r"^[\d \-\u00A0\u202F]+$")
252
+ DATE_OF_BIRTH_RE = re.compile(
253
+ r"(?i)^(?:\d{2}[./]\d{2}[./]\d{4}|\d{4}-\d{2}-\d{2}|(?:an\s+)?\d{1,2}(?:st|nd|rd|th|ú)?\s+[A-Za-zÁÉÍÓÚáéíóú]+(?:\s+[A-Za-zÁÉÍÓÚáéíóú]+)?\s+\d{4}|[A-Za-zÁÉÍÓÚáéíóú]+(?:\s+[A-Za-zÁÉÍÓÚáéíóú]+)?\s+\d{1,2},\s+\d{4})$"
254
+ )
255
+ DATE_OF_BIRTH_VALUE_RE = re.compile(
256
+ r"(?<![A-Za-z0-9])(\d{2}[./]\d{2}[./]\d{4}|\d{4}-\d{2}-\d{2}|(?:an\s+)?\d{1,2}(?:st|nd|rd|th|ú)?\s+[A-Za-zÁÉÍÓÚáéíóú]+(?:\s+[A-Za-zÁÉÍÓÚáéíóú]+)?\s+\d{4}|[A-Za-zÁÉÍÓÚáéíóú]+(?:\s+[A-Za-zÁÉÍÓÚáéíóú]+)?\s+\d{1,2},\s+\d{4})(?![A-Za-z0-9])"
257
+ )
258
+ AGE_CONTEXT_RE = re.compile(r"(?i)\b(age|aged|years?\s+old|year\s+old|year-old|yrs?\s+old|y/?o|yo|aois|bliana\s+d['’]aois|mbliana\s+d['’]aois)\b")
259
+ AGE_INLINE_SUFFIX_RE = re.compile(r"(?i)^(?:-year-old\b|yo\b|y/o\b|yrs?\b)")
260
+ AGE_VALUE_RE = re.compile(r"(?<![A-Za-z0-9])(\d{1,3})(?![A-Za-z0-9])")
261
+ DOB_CONTEXT_RE = re.compile(
262
+ r"(?i)\b(dob|date\s+of\s+birth|born(?:\s+on)?|data\s+breithe|dáta\s+breithe|dhata\s+breithe|dháta\s+breithe|rugadh)\b"
263
+ )
264
+ ADDRESS_CUE_RE = re.compile(
265
+ r"(?i)\b(address|seoladh|allocation\s+centre|intreo\s+centre|ionad\s+leithdh[aá]ilte|ionad\s+intreo|live\s+at|lives\s+at|living\s+at|located\s+at|cónai\s+ag|chónai\s+ag|conai\s+ag|chonai\s+ag)\b"
266
+ )
267
+ CITY_COUNTY_PREFIX_RE = re.compile(r"(?i)(?:county|co\.|contae|gcontae)(?:\s+na)?\s*$")
268
+ PPSN_CUE_RE = re.compile(
269
+ r"(?i)\b(ppsn|upsp|personal public service(?:\s+number)?|uimhir\s+(?:mo\s+)?upsp|uimhir\s+(?:mo\s+)?ppsn)\b"
270
+ )
271
+ NAME_STOP_SURFACES = {
272
+ normalize_surface(value)
273
+ for value in {
274
+ "Address",
275
+ "Name",
276
+ "Phone",
277
+ "Email",
278
+ "Seoladh",
279
+ "Ainm",
280
+ "Teagmháil",
281
+ "Teagmhail",
282
+ "Ríomhphost",
283
+ "Riomhphost",
284
+ "PPSN",
285
+ "UPSP",
286
+ "Call",
287
+ "Glao",
288
+ "Glaoigh",
289
+ "Rugadh",
290
+ "Ionad",
291
+ "Intreo",
292
+ "Cill",
293
+ "Sampla",
294
+ "Leithdháilte",
295
+ "Leithdhailte",
296
+ "Leithdháil",
297
+ "Leithdhail",
298
+ "Leithdh",
299
+ "Apartment",
300
+ "Flat",
301
+ "Unit",
302
+ "Suite",
303
+ "Árasán",
304
+ "Arasan",
305
+ "Aonad",
306
+ "County",
307
+ "Contae",
308
+ "Fón",
309
+ "Fon",
310
+ "January",
311
+ "February",
312
+ "March",
313
+ "April",
314
+ "May",
315
+ "June",
316
+ "July",
317
+ "August",
318
+ "September",
319
+ "October",
320
+ "November",
321
+ "December",
322
+ "Monday",
323
+ "Tuesday",
324
+ "Wednesday",
325
+ "Thursday",
326
+ "Friday",
327
+ "Saturday",
328
+ "Sunday",
329
+ "Eanáir",
330
+ "Feabhra",
331
+ "Márta",
332
+ "Aibreán",
333
+ "Aibrean",
334
+ "Bealtaine",
335
+ "Meitheamh",
336
+ "Iúil",
337
+ "Iuil",
338
+ "Lúnasa",
339
+ "Lunasa",
340
+ "Meán Fómhair",
341
+ "Mean Fomhair",
342
+ "Deireadh Fómhair",
343
+ "Deireadh Fomhair",
344
+ "Samhain",
345
+ "Nollaig",
346
+ "Luan",
347
+ "Máirt",
348
+ "Mairt",
349
+ "Céadaoin",
350
+ "Ceadaoin",
351
+ "Déardaoin",
352
+ "Deardaoin",
353
+ "Aoine",
354
+ "Satharn",
355
+ "Domhnach",
356
+ }
357
+ }
358
+ NAME_PARTICLE_SURFACES = {
359
+ normalize_surface(value)
360
+ for value in {"Ó", "O", "Ní", "Ni", "Nic", "Mac", "Mc", "de", "van", "von"}
361
+ }
362
+ STREET_TRAILING_BLOCK_SURFACES = {
363
+ normalize_surface(value)
364
+ for value in {
365
+ "are",
366
+ "public",
367
+ "contact",
368
+ "details",
369
+ "website",
370
+ "open",
371
+ "before",
372
+ "visiting",
373
+ "roimh",
374
+ "chuairt",
375
+ "agus",
376
+ "and",
377
+ "the",
378
+ "is",
379
+ "ta",
380
+ }
381
+ }
382
+ ADDRESS_UNIT_PREFIX_RE = re.compile(r"(?i)^(?:apartment|apt\.?|flat|unit|suite|aras[aá]n|aonad)\b")
383
+ HOUSE_NAME_PREFIX_RE = re.compile(
384
+ r"(?i)^(?:[A-ZÁÉÍÓÚ][\w'’.-]+(?:\s+[A-ZÁÉÍÓÚ][\w'’.-]+){0,2}\s+(?:house|cottage|lodge|villa)|teach(?:ín|in)?(?:\s+na\s+[A-ZÁÉÍÓÚ][\w'’.-]+)?)$"
385
+ )
386
+ STREET_ADDRESS_VALUE_RE = re.compile(
387
+ r"(?i)(?<![\w@])("
388
+ r"(?:(?:apartment|apt\.?|flat|unit|suite|aras[aá]n|aonad)\s+[A-Za-z0-9-]+,\s+)?"
389
+ r"(?:(?:[A-ZÁÉÍÓÚ][\w'’.-]+(?:\s+[A-ZÁÉÍÓÚ][\w'’.-]+){0,2}\s+(?:house|cottage|lodge|villa)|teach(?:ín|in)?(?:\s+na\s+[A-ZÁÉÍÓÚ][\w'’.-]+)?),\s+)?"
390
+ r"(?:\d{1,4}\s+)?(?:[A-ZÁÉÍÓÚa-záéíóú][\w'’.-]*\s+){0,5}(?:street|road|avenue|lane|park|view|square|terrace|drive|close|way|place|crescent|grove|green|court|manor|mews|gardens?|heights|bóthar|bothar|sráid|sraid|lána|lana)(?:\s+[A-ZÁÉÍÓÚa-záéíóú][\w'’.-]*){0,2}"
391
+ r")"
392
+ )
393
+
394
+
395
+ def is_plausible_last_name_sequence(value: str) -> bool:
396
+ tokens = [token for token in re.split(r"\s+", value.strip()) if token]
397
+ if not tokens:
398
+ return False
399
+ for token in tokens:
400
+ if not any(ch.isalpha() for ch in token):
401
+ return False
402
+ if not all(is_name_token_char(ch) for ch in token):
403
+ return False
404
+ alpha_chars = [ch for ch in token if ch.isalpha()]
405
+ first_alpha = alpha_chars[0] if alpha_chars else ""
406
+ if first_alpha.isupper():
407
+ continue
408
+ if len(alpha_chars) >= 2 and alpha_chars[0].islower() and alpha_chars[1].isupper():
409
+ continue
410
+ if normalize_surface(token) in NAME_PARTICLE_SURFACES:
411
+ continue
412
+ return False
413
+ return True
414
+
415
+
416
+ def is_reasonable_span_text(label: str, text: str, start: int, end: int) -> bool:
417
+ value = text[int(start) : int(end)].strip()
418
+ if not value:
419
+ return False
420
+ upper = alnum_upper(value)
421
+
422
+ if label in {"FIRST_NAME", "LAST_NAME"}:
423
+ if not any(ch.isalpha() for ch in value):
424
+ return False
425
+ if any(ch.isdigit() for ch in value):
426
+ return False
427
+ if int(start) > 0 and text[int(start) - 1].isalpha():
428
+ return False
429
+ if int(end) < len(text) and text[int(end)].isalpha():
430
+ return False
431
+ if normalize_surface(value) in NAME_STOP_SURFACES:
432
+ return False
433
+ if label == "FIRST_NAME" and any(ch.isspace() for ch in value):
434
+ return False
435
+ if any(ch in ".,;:/@()" for ch in value):
436
+ return False
437
+ if label == "FIRST_NAME":
438
+ first_alpha = next((ch for ch in value if ch.isalpha()), "")
439
+ if not first_alpha or not first_alpha.isupper():
440
+ return False
441
+ if label == "LAST_NAME" and not is_plausible_last_name_sequence(value):
442
+ return False
443
+ if start > 0 and text[int(start) - 1].isdigit():
444
+ return False
445
+ return True
446
+
447
+ if label == "EMAIL":
448
+ if "@" not in value:
449
+ return False
450
+ local, _, domain = value.partition("@")
451
+ return bool(local) and "." in domain
452
+
453
+ if label == "PHONE_NUMBER":
454
+ normalized = value.replace("\u00A0", " ").replace("\u202F", " ").strip()
455
+ if any(ch.isalpha() for ch in normalized):
456
+ return False
457
+ if any(ch in "/@" for ch in normalized):
458
+ return False
459
+ if int(start) > 0 and text[int(start) - 1].isalnum():
460
+ return False
461
+ if int(end) < len(text) and text[int(end)].isalnum():
462
+ return False
463
+ if not PHONE_SURFACE_RE.match(normalized):
464
+ return False
465
+ digits = "".join(ch for ch in value if ch.isdigit())
466
+ if normalized.startswith("+353"):
467
+ tail = digits[3:]
468
+ if tail.startswith("0"):
469
+ tail = tail[1:]
470
+ return 8 <= len(tail) <= 9
471
+ if not digits.startswith("0"):
472
+ return False
473
+ if digits.startswith("0818") or digits.startswith("1800"):
474
+ return len(digits) == 10
475
+ if digits.startswith("08"):
476
+ return len(digits) == 10
477
+ if digits.startswith("01"):
478
+ return len(digits) == 9
479
+ return 9 <= len(digits) <= 10
480
+
481
+ if label == "PPSN":
482
+ return bool(len(upper) in {8, 9} and upper[:7].isdigit() and upper[7:].isalpha())
483
+
484
+ if label == "POSTCODE":
485
+ compact = value.replace(" ", "").replace("\u00A0", "").replace("\u202F", "")
486
+ if any(not (ch.isalnum() or ch.isspace()) for ch in value):
487
+ return False
488
+ if len(compact) != 7:
489
+ return False
490
+ routing = compact[:3]
491
+ unique = compact[3:]
492
+ routing_ok = bool(
493
+ (routing[0].isalpha() and routing[1:].isdigit())
494
+ or routing == "D6W"
495
+ )
496
+ unique_ok = bool(
497
+ len(unique) == 4
498
+ and unique[0].isalpha()
499
+ and unique[1:].isalnum()
500
+ )
501
+ return routing_ok and unique_ok
502
+
503
+ if label == "PASSPORT_NUMBER":
504
+ return bool(re.fullmatch(r"[A-Z]{1,2}\s?\d{7}", value.strip()))
505
+
506
+ if label == "BANK_ROUTING_NUMBER":
507
+ digits = "".join(ch for ch in value if ch.isdigit())
508
+ if len(digits) != 6:
509
+ return False
510
+ context = text[max(0, int(start) - 32) : min(len(text), int(end) + 24)]
511
+ return bool(BANK_ROUTING_CONTEXT_RE.search(context))
512
+
513
+ if label == "SWIFT_BIC":
514
+ return len(upper) in {8, 11} and upper.isalnum()
515
+
516
+ if label == "CREDIT_DEBIT_CARD":
517
+ digits = "".join(ch for ch in value if ch.isdigit())
518
+ return 12 <= len(digits) <= 19
519
+
520
+ if label == "ACCOUNT_NUMBER":
521
+ if upper.startswith("IE"):
522
+ return bool(re.fullmatch(r"IE\d{2}[A-Z0-9]{18}", upper))
523
+ if not ACCOUNT_DIGIT_SURFACE_RE.fullmatch(value.strip()):
524
+ return False
525
+ digits = "".join(ch for ch in value if ch.isdigit())
526
+ return 6 <= len(digits) <= 34
527
+
528
+ if label == "AGE":
529
+ digits = "".join(ch for ch in value if ch.isdigit())
530
+ if digits != value.strip():
531
+ return False
532
+ if not digits:
533
+ return False
534
+ if int(start) > 0 and text[int(start) - 1].isalnum():
535
+ return False
536
+ trailing = text[int(end) : min(len(text), int(end) + 12)]
537
+ if int(end) < len(text) and text[int(end)].isalnum() and not AGE_INLINE_SUFFIX_RE.match(trailing):
538
+ return False
539
+ if int(start) > 0 and text[int(start) - 1] in "/-":
540
+ return False
541
+ if int(end) < len(text) and text[int(end)] in "/-" and not AGE_INLINE_SUFFIX_RE.match(trailing):
542
+ return False
543
+ age = int(digits)
544
+ if not (0 < age <= 120):
545
+ return False
546
+ context = text[max(0, int(start) - 12) : min(len(text), int(end) + 16)]
547
+ return bool(AGE_CONTEXT_RE.search(context))
548
+
549
+ if label == "DATE_OF_BIRTH":
550
+ if not any(ch.isdigit() for ch in value):
551
+ return False
552
+ if not DATE_OF_BIRTH_RE.match(value.strip()):
553
+ return False
554
+ context = text[max(0, int(start) - 32) : min(len(text), int(end) + 32)]
555
+ return bool(DOB_CONTEXT_RE.search(context))
556
+
557
+ if label == "CITY":
558
+ if any(ch.isdigit() for ch in value):
559
+ return False
560
+ prefix = text[max(0, int(start) - 20) : int(start)]
561
+ if CITY_COUNTY_PREFIX_RE.search(prefix):
562
+ return False
563
+ return normalize_surface(value) in IRISH_CITY_SURFACES
564
+
565
+ if label == "COUNTY":
566
+ if any(ch.isdigit() for ch in value):
567
+ return False
568
+ return normalize_surface(value) in IRISH_COUNTY_SURFACES
569
+
570
+ if label == "STREET_ADDRESS":
571
+ cleaned = value.strip()
572
+ address_parts = [part.strip() for part in cleaned.split(",")]
573
+ if len(address_parts) > 2:
574
+ return False
575
+ prefix_part = ""
576
+ street_part = cleaned
577
+ if len(address_parts) == 2:
578
+ prefix_part, street_part = address_parts
579
+ if not prefix_part or not street_part:
580
+ return False
581
+ if not (
582
+ ADDRESS_UNIT_PREFIX_RE.match(prefix_part)
583
+ or HOUSE_NAME_PREFIX_RE.match(prefix_part)
584
+ ):
585
+ return False
586
+ suffix_match = STREET_SUFFIX_RE.search(street_part)
587
+ if not suffix_match:
588
+ return False
589
+ if any(ch in "@:;" for ch in cleaned):
590
+ return False
591
+ trailing = street_part[int(suffix_match.end()) :].strip()
592
+ trailing_tokens = [token for token in re.split(r"\s+", trailing) if token]
593
+ if len(trailing_tokens) > 3:
594
+ return False
595
+ if any(normalize_surface(token) in STREET_TRAILING_BLOCK_SURFACES for token in trailing_tokens):
596
+ return False
597
+ has_digit = any(ch.isdigit() for ch in street_part)
598
+ if has_digit and not re.match(r"^\s*\d{1,4}\b", street_part):
599
+ return False
600
+ title_tokens = [token for token in re.split(r"\s+", street_part) if token]
601
+ if not has_digit and not prefix_part:
602
+ context = text[max(0, int(start) - 24) : min(len(text), int(end) + 12)]
603
+ if not ADDRESS_CUE_RE.search(context):
604
+ return False
605
+ return has_digit or len(title_tokens) >= 2
606
+
607
+ return True
608
+
609
+
610
+ def spans_overlap(a: dict, b: dict) -> bool:
611
+ return int(a["start"]) < int(b["end"]) and int(b["start"]) < int(a["end"])
612
+
613
+
614
+ def is_name_token_char(ch: str) -> bool:
615
+ return ch.isalpha() or ch in {"-", "'", "’"}
616
+
617
+
618
+ def is_plausible_first_name(value: str) -> bool:
619
+ if not value:
620
+ return False
621
+ if any(ch.isspace() for ch in value):
622
+ return False
623
+ if any(ch.isdigit() for ch in value):
624
+ return False
625
+ if any(ch in ",;:/@()" for ch in value):
626
+ return False
627
+ if not any(ch.isalpha() for ch in value):
628
+ return False
629
+ first_alpha = next((ch for ch in value if ch.isalpha()), "")
630
+ if not first_alpha or not first_alpha.isupper():
631
+ return False
632
+ return all(is_name_token_char(ch) for ch in value)
633
+
634
+
635
+ def is_plausible_cued_first_name(value: str) -> bool:
636
+ if not value:
637
+ return False
638
+ if any(ch.isspace() for ch in value):
639
+ return False
640
+ if any(ch.isdigit() for ch in value):
641
+ return False
642
+ if any(ch in ",;:/@()" for ch in value):
643
+ return False
644
+ if not any(ch.isalpha() for ch in value):
645
+ return False
646
+ return all(is_name_token_char(ch) for ch in value)
647
+
648
+
649
+ def is_plausible_cued_last_name_sequence(value: str) -> bool:
650
+ tokens = [token for token in re.split(r"\s+", value.strip()) if token]
651
+ if not tokens:
652
+ return False
653
+ for token in tokens:
654
+ if not any(ch.isalpha() for ch in token):
655
+ return False
656
+ if not all(is_name_token_char(ch) for ch in token):
657
+ return False
658
+ alpha_chars = [ch for ch in token if ch.isalpha()]
659
+ first_alpha = alpha_chars[0] if alpha_chars else ""
660
+ if first_alpha.isupper() or first_alpha.islower():
661
+ continue
662
+ if normalize_surface(token) in NAME_PARTICLE_SURFACES:
663
+ continue
664
+ return False
665
+ return True
666
+
667
+
668
+ def repair_first_name_from_last_name(text: str, spans: list[dict]) -> list[dict]:
669
+ repaired = list(spans)
670
+ for last_name in [span for span in repaired if span["label"] == "LAST_NAME"]:
671
+ if any(
672
+ span["label"] == "FIRST_NAME"
673
+ and int(span["end"]) <= int(last_name["start"])
674
+ and int(last_name["start"]) - int(span["end"]) <= 2
675
+ for span in repaired
676
+ ):
677
+ continue
678
+
679
+ cursor = int(last_name["start"]) - 1
680
+ if cursor < 0 or not text[cursor].isspace():
681
+ continue
682
+ while cursor >= 0 and text[cursor].isspace():
683
+ cursor -= 1
684
+ token_end = cursor + 1
685
+ while cursor >= 0 and is_name_token_char(text[cursor]):
686
+ cursor -= 1
687
+ token_start = cursor + 1
688
+ if token_end <= token_start:
689
+ continue
690
+ candidate = text[token_start:token_end]
691
+ if not is_plausible_first_name(candidate):
692
+ continue
693
+ candidate_span = {
694
+ "start": token_start,
695
+ "end": token_end,
696
+ "label": "FIRST_NAME",
697
+ "score": float(last_name.get("score", 0.5)) * 0.6,
698
+ "text": candidate,
699
+ }
700
+ if any(spans_overlap(candidate_span, other) for other in repaired if other["label"] == "FIRST_NAME"):
701
+ continue
702
+ repaired.append(candidate_span)
703
+ return repaired
704
+
705
+
706
+ def repair_contextual_name_cues(text: str, spans: list[dict]) -> list[dict]:
707
+ repaired = list(spans)
708
+ for match in NAME_SELF_CUE_RE.finditer(text):
709
+ if any(
710
+ other["label"] == "FIRST_NAME"
711
+ and 0 <= int(other["start"]) - match.end() <= 4
712
+ for other in repaired
713
+ ) and any(
714
+ other["label"] == "LAST_NAME"
715
+ and 0 <= int(other["start"]) - match.end() <= 16
716
+ for other in repaired
717
+ ):
718
+ continue
719
+ cursor = match.end()
720
+ while cursor < len(text) and text[cursor].isspace():
721
+ cursor += 1
722
+ start = cursor
723
+ while cursor < len(text) and (is_name_token_char(text[cursor]) or text[cursor].isspace()):
724
+ cursor += 1
725
+ candidate = text[start:cursor].strip()
726
+ raw_tokens = [token for token in re.split(r"\s+", candidate) if token]
727
+ tokens: list[str] = []
728
+ for token in raw_tokens:
729
+ normalized = normalize_surface(token)
730
+ if tokens and normalized in LOWER_NAME_STOP_SURFACES:
731
+ break
732
+ if not all(is_name_token_char(ch) for ch in token):
733
+ break
734
+ tokens.append(token)
735
+ if len(tokens) >= 4:
736
+ break
737
+ if len(tokens) < 2:
738
+ continue
739
+ first_value = tokens[0]
740
+ first_alpha = next((ch for ch in first_value if ch.isalpha()), "")
741
+ if not first_alpha or not first_alpha.islower():
742
+ continue
743
+ last_value = " ".join(tokens[1:])
744
+ if not is_plausible_cued_first_name(first_value):
745
+ continue
746
+ if not is_plausible_cued_last_name_sequence(last_value):
747
+ continue
748
+ first_start = text.find(first_value, start, cursor)
749
+ if first_start < 0:
750
+ continue
751
+ first_end = first_start + len(first_value)
752
+ last_start = text.find(last_value, first_end, cursor)
753
+ if last_start < 0:
754
+ continue
755
+ last_end = last_start + len(last_value)
756
+ first_span = {
757
+ "start": first_start,
758
+ "end": first_end,
759
+ "label": "FIRST_NAME",
760
+ "score": 0.63,
761
+ "text": text[first_start:first_end],
762
+ }
763
+ last_span = {
764
+ "start": last_start,
765
+ "end": last_end,
766
+ "label": "LAST_NAME",
767
+ "score": 0.63,
768
+ "text": text[last_start:last_end],
769
+ }
770
+ repaired = [
771
+ other
772
+ for other in repaired
773
+ if not (
774
+ spans_overlap(first_span, other) and other["label"] in {"FIRST_NAME", "LAST_NAME"}
775
+ ) and not (
776
+ spans_overlap(last_span, other) and other["label"] in {"FIRST_NAME", "LAST_NAME"}
777
+ )
778
+ ]
779
+ repaired.extend([first_span, last_span])
780
+ return repaired
781
+
782
+
783
+ PASSPORT_CUE_RE = re.compile(
784
+ r"(?i)(passport(?:\s+number)?|phas|uimhir\s+(?:mo\s+)?phas)"
785
+ )
786
+ PASSPORT_VALUE_RE = re.compile(r"(?<![A-Za-z0-9])([A-Z]{1,2}\s?\d{7})(?![A-Za-z0-9])")
787
+ EMAIL_EXTRACT_RE = re.compile(r"([^\s@,;:()<>]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,})", re.UNICODE)
788
+ PHONE_CUE_RE = re.compile(
789
+ r"(?i)\b(phone|call|contact|reach\s+me|glaoigh\s+ar|teagmh[aá]il|uimhir|m['’]uimhir|f[oó]n|fon|teileaf[oó]n|telefon)\b"
790
+ )
791
+ NAME_SELF_CUE_RE = re.compile(
792
+ r"(?i)\b(my\s+name\s+is|is\s+mise|is\s+[ée]\s+m['’]?ainm|is\s+[ée]\s+mo\s+ainm)\b"
793
+ )
794
+ LOWER_NAME_STOP_SURFACES = {
795
+ normalize_surface(value)
796
+ for value in {"and", "agus", "is", "ta", "tá", "my", "mo", "an", "the"}
797
+ }
798
+ PUBLIC_CONTACT_DETAILS_RE = re.compile(r"(?i)\bpublic\s+contact\s+details\b")
799
+ CITY_CUE_RE = re.compile(
800
+ r"(?i)\b(address|seoladh|located|suite|centre|center|ionad|intreo|clinic|hospital|ospid[eé]al|hse|fss)\b"
801
+ )
802
+ BANK_ROUTING_CONTEXT_RE = re.compile(
803
+ r"(?i)\b(sort\s+code|routing\s+number|bank\s+of\s+ireland|aib|cod\s+sort[aá]la|sort[aá]la)\b"
804
+ )
805
+ PHONE_VALUE_RE = re.compile(
806
+ r"(?<![A-Za-z0-9])((?:\+353(?:\s*\((?:0)?\d{1,2}\))?[\s\-.]?|0)\d(?:[\s\-.]?\d){6,13}|\(\s*0\d{1,2}\s*\)(?:[\s\-.]?\d){6,10})(?![A-Za-z0-9])"
807
+ )
808
+ PPSN_VALUE_RE = re.compile(r"(?<![A-Za-z0-9])(\d{7}(?:[\s-]*[A-Za-z]){1,2})(?![A-Za-z0-9])")
809
+ POSTCODE_VALUE_RE = re.compile(
810
+ r"(?<![A-Za-z0-9])((?:[A-Za-z]\d{2}|D6W)[\s\u00A0\u202F]?[A-Za-z][A-Za-z0-9]{3})(?![A-Za-z0-9])"
811
+ )
812
+ CITY_BEFORE_POSTCODE_RE = re.compile(
813
+ r"(?<![A-Za-zÁÉÍÓÚáéíóú])([A-ZÁÉÍÓÚ][\w'’.-]*(?:\s+[A-ZÁÉÍÓÚ][\w'’.-]*){0,2})(?=\s*,\s*(?:[A-Z]\d{2}|D6W))"
814
+ )
815
+ ADDRESS_BLOCK_VALUE_RE = re.compile(r"(?i)\b(?:address|seoladh)\s*:\s*([^,\n.]+)")
816
+ LOCATION_FORM_EDGE = r"[A-Za-zÁÉÍÓÚáéíóú]"
817
+
818
+
819
+ def iter_bounded_form_matches(form: str, text: str):
820
+ pattern = re.compile(
821
+ rf"(?<!{LOCATION_FORM_EDGE}){re.escape(form)}(?!{LOCATION_FORM_EDGE})",
822
+ flags=re.IGNORECASE,
823
+ )
824
+ return pattern.finditer(text)
825
+
826
+
827
+ def repair_contextual_passport_numbers(text: str, spans: list[dict]) -> list[dict]:
828
+ repaired = list(spans)
829
+ for match in PASSPORT_VALUE_RE.finditer(text):
830
+ start, end = match.span(1)
831
+ candidate_span = {
832
+ "start": start,
833
+ "end": end,
834
+ "label": "PASSPORT_NUMBER",
835
+ "score": 0.67,
836
+ "text": text[start:end],
837
+ }
838
+ if any(
839
+ other["label"] == "PASSPORT_NUMBER"
840
+ and int(other["start"]) <= start
841
+ and int(other["end"]) >= end
842
+ for other in repaired
843
+ ):
844
+ continue
845
+ cue_window = text[max(0, start - 32) : start]
846
+ if not PASSPORT_CUE_RE.search(cue_window):
847
+ continue
848
+ conflicting_labels = {"PHONE_NUMBER", "PPSN", "ACCOUNT_NUMBER", "AGE", "PASSPORT_NUMBER"}
849
+ repaired = [
850
+ other
851
+ for other in repaired
852
+ if not (
853
+ spans_overlap(candidate_span, other)
854
+ and other["label"] in conflicting_labels
855
+ )
856
+ ]
857
+ repaired.append(candidate_span)
858
+ return repaired
859
+
860
+
861
+ def repair_ppsn_variants(text: str, spans: list[dict]) -> list[dict]:
862
+ repaired = list(spans)
863
+ for match in PPSN_VALUE_RE.finditer(text):
864
+ start, end = match.span(1)
865
+ value = text[start:end]
866
+ compact = alnum_upper(value)
867
+ if not (len(compact) in {8, 9} and compact[:7].isdigit() and compact[7:].isalpha()):
868
+ continue
869
+ cue_window = text[max(0, start - 32) : min(len(text), end + 24)]
870
+ has_cue = bool(PPSN_CUE_RE.search(cue_window))
871
+ candidate_span = {
872
+ "start": start,
873
+ "end": end,
874
+ "label": "PPSN",
875
+ "score": 0.72 if has_cue else 0.58,
876
+ "text": value,
877
+ }
878
+ conflicting_labels = {"PHONE_NUMBER", "PASSPORT_NUMBER", "ACCOUNT_NUMBER", "AGE", "FIRST_NAME", "LAST_NAME"}
879
+ repaired = [
880
+ other
881
+ for other in repaired
882
+ if not (
883
+ spans_overlap(candidate_span, other)
884
+ and other["label"] in conflicting_labels.union({"PPSN"})
885
+ )
886
+ ]
887
+ repaired.append(candidate_span)
888
+ return repaired
889
+
890
+
891
+ def repair_contextual_date_of_birth(text: str, spans: list[dict]) -> list[dict]:
892
+ repaired = list(spans)
893
+ for match in DATE_OF_BIRTH_VALUE_RE.finditer(text):
894
+ start, end = match.span(1)
895
+ cue_window = text[max(0, start - 40) : min(len(text), end + 24)]
896
+ if not DOB_CONTEXT_RE.search(cue_window):
897
+ continue
898
+ candidate_span = {
899
+ "start": start,
900
+ "end": end,
901
+ "label": "DATE_OF_BIRTH",
902
+ "score": 0.66,
903
+ "text": text[start:end],
904
+ }
905
+ conflicting_labels = {"DATE_OF_BIRTH", "PHONE_NUMBER", "AGE", "FIRST_NAME", "LAST_NAME", "ACCOUNT_NUMBER", "CITY"}
906
+ repaired = [
907
+ other
908
+ for other in repaired
909
+ if not (
910
+ spans_overlap(candidate_span, other)
911
+ and other["label"] in conflicting_labels
912
+ )
913
+ ]
914
+ repaired.append(candidate_span)
915
+ return repaired
916
+
917
+
918
+ def repair_contextual_ages(text: str, spans: list[dict]) -> list[dict]:
919
+ repaired = list(spans)
920
+ for match in AGE_VALUE_RE.finditer(text):
921
+ start, end = match.span(1)
922
+ if not is_reasonable_span_text("AGE", text, start, end):
923
+ continue
924
+ if any(
925
+ spans_overlap({"start": start, "end": end}, other)
926
+ and other["label"] == "DATE_OF_BIRTH"
927
+ for other in repaired
928
+ ):
929
+ continue
930
+ candidate_span = {
931
+ "start": start,
932
+ "end": end,
933
+ "label": "AGE",
934
+ "score": 0.66,
935
+ "text": text[start:end],
936
+ }
937
+ conflicting_labels = {"AGE", "PHONE_NUMBER", "ACCOUNT_NUMBER"}
938
+ repaired = [
939
+ other
940
+ for other in repaired
941
+ if not (
942
+ spans_overlap(candidate_span, other)
943
+ and other["label"] in conflicting_labels
944
+ )
945
+ ]
946
+ repaired.append(candidate_span)
947
+ return repaired
948
+
949
+
950
+ ACCOUNT_CUE_RE = re.compile(
951
+ r"(?i)(account\s+number|bank\s+account|uimhir\s+chuntais|cuntas\s+bainc)"
952
+ )
953
+ ACCOUNT_VALUE_RE = re.compile(r"(?<![A-Za-z0-9])(\d{6,12})(?![A-Za-z0-9])")
954
+
955
+
956
+ def repair_contextual_account_numbers(text: str, spans: list[dict]) -> list[dict]:
957
+ repaired = list(spans)
958
+ for match in ACCOUNT_VALUE_RE.finditer(text):
959
+ start, end = match.span(1)
960
+ candidate_span = {
961
+ "start": start,
962
+ "end": end,
963
+ "label": "ACCOUNT_NUMBER",
964
+ "score": 0.51,
965
+ "text": text[start:end],
966
+ }
967
+ if any(
968
+ other["label"] == "ACCOUNT_NUMBER"
969
+ and int(other["start"]) <= start
970
+ and int(other["end"]) >= end
971
+ for other in repaired
972
+ ):
973
+ continue
974
+ cue_window = text[max(0, start - 40) : start]
975
+ if not ACCOUNT_CUE_RE.search(cue_window):
976
+ continue
977
+ if any(
978
+ spans_overlap(candidate_span, other)
979
+ and other["label"] in {"PHONE_NUMBER", "BANK_ROUTING_NUMBER", "PPSN", "POSTCODE", "PASSPORT_NUMBER"}
980
+ for other in repaired
981
+ ):
982
+ continue
983
+ repaired.append(candidate_span)
984
+ return repaired
985
+
986
+
987
+ def repair_emails(text: str, spans: list[dict]) -> list[dict]:
988
+ repaired = list(spans)
989
+ for match in EMAIL_EXTRACT_RE.finditer(text):
990
+ start, end = match.span(1)
991
+ candidate_span = {
992
+ "start": start,
993
+ "end": end,
994
+ "label": "EMAIL",
995
+ "score": 0.74,
996
+ "text": text[start:end],
997
+ }
998
+ conflicting_labels = {"EMAIL", "FIRST_NAME", "LAST_NAME"}
999
+ repaired = [
1000
+ other
1001
+ for other in repaired
1002
+ if not (
1003
+ spans_overlap(candidate_span, other)
1004
+ and other["label"] in conflicting_labels
1005
+ )
1006
+ ]
1007
+ repaired.append(candidate_span)
1008
+ return repaired
1009
+
1010
+
1011
+ def repair_phone_numbers(text: str, spans: list[dict]) -> list[dict]:
1012
+ repaired = list(spans)
1013
+ for match in PHONE_VALUE_RE.finditer(text):
1014
+ start, end = match.span(1)
1015
+ candidate_span = {
1016
+ "start": start,
1017
+ "end": end,
1018
+ "label": "PHONE_NUMBER",
1019
+ "score": 0.69,
1020
+ "text": text[start:end],
1021
+ }
1022
+ cue_window = text[max(0, start - 32) : min(len(text), end + 16)]
1023
+ has_cue = bool(PHONE_CUE_RE.search(cue_window))
1024
+ has_overlap = any(spans_overlap(candidate_span, other) and other["label"] == "PHONE_NUMBER" for other in repaired)
1025
+ if not (has_cue or has_overlap):
1026
+ continue
1027
+ if not is_reasonable_span_text("PHONE_NUMBER", text, start, end):
1028
+ continue
1029
+ conflicting_labels = {"PHONE_NUMBER", "PPSN", "ACCOUNT_NUMBER", "BANK_ROUTING_NUMBER", "CREDIT_DEBIT_CARD"}
1030
+ repaired = [
1031
+ other
1032
+ for other in repaired
1033
+ if not (
1034
+ spans_overlap(candidate_span, other)
1035
+ and other["label"] in conflicting_labels
1036
+ )
1037
+ ]
1038
+ repaired.append(candidate_span)
1039
+ return repaired
1040
+
1041
+
1042
+ def repair_postcodes(text: str, spans: list[dict]) -> list[dict]:
1043
+ repaired = list(spans)
1044
+ for match in POSTCODE_VALUE_RE.finditer(text):
1045
+ start, end = match.span(1)
1046
+ candidate_span = {
1047
+ "start": start,
1048
+ "end": end,
1049
+ "label": "POSTCODE",
1050
+ "score": 0.71,
1051
+ "text": text[start:end],
1052
+ }
1053
+ conflicting_labels = {"POSTCODE", "PHONE_NUMBER", "ACCOUNT_NUMBER", "FIRST_NAME", "LAST_NAME"}
1054
+ repaired = [
1055
+ other
1056
+ for other in repaired
1057
+ if not (
1058
+ spans_overlap(candidate_span, other)
1059
+ and other["label"] in conflicting_labels
1060
+ )
1061
+ ]
1062
+ repaired.append(candidate_span)
1063
+ return repaired
1064
+
1065
+
1066
+ def repair_city_spans(text: str, spans: list[dict]) -> list[dict]:
1067
+ repaired = list(spans)
1068
+ seen: set[tuple[int, int]] = set()
1069
+ ordered_forms = sorted(IRISH_CITY_FORMS, key=len, reverse=True)
1070
+ for form in ordered_forms:
1071
+ for match in iter_bounded_form_matches(form, text):
1072
+ start, end = match.span()
1073
+ prefix = text[max(0, start - 20) : start]
1074
+ if CITY_COUNTY_PREFIX_RE.search(prefix):
1075
+ continue
1076
+ key = (start, end)
1077
+ if key in seen:
1078
+ continue
1079
+ seen.add(key)
1080
+ candidate_span = {
1081
+ "start": start,
1082
+ "end": end,
1083
+ "label": "CITY",
1084
+ "score": 0.64,
1085
+ "text": text[start:end],
1086
+ }
1087
+ has_context = False
1088
+ for other in repaired:
1089
+ other_start = int(other["start"])
1090
+ other_end = int(other["end"])
1091
+ if other["label"] == "STREET_ADDRESS" and 0 <= start - other_end <= 4:
1092
+ has_context = True
1093
+ break
1094
+ if other["label"] in {"COUNTY", "POSTCODE"} and 0 <= other_start - end <= 6:
1095
+ has_context = True
1096
+ break
1097
+ if not has_context and re.match(r"^\s*,\s*(?:Co\.\s+|[A-Z]\d{2}|D6W)", text[end:]):
1098
+ has_context = True
1099
+ if not has_context:
1100
+ cue_window = text[max(0, start - 40) : min(len(text), end + 32)]
1101
+ has_context = bool(CITY_CUE_RE.search(cue_window))
1102
+ if not has_context:
1103
+ continue
1104
+ conflicting_labels = {"CITY", "FIRST_NAME", "LAST_NAME"}
1105
+ repaired = [
1106
+ other
1107
+ for other in repaired
1108
+ if not (
1109
+ spans_overlap(candidate_span, other)
1110
+ and other["label"] in conflicting_labels
1111
+ )
1112
+ ]
1113
+ repaired.append(candidate_span)
1114
+ return repaired
1115
+
1116
+
1117
+ def repair_city_before_postcode(text: str, spans: list[dict]) -> list[dict]:
1118
+ repaired = list(spans)
1119
+ for match in CITY_BEFORE_POSTCODE_RE.finditer(text):
1120
+ start, end = match.span(1)
1121
+ value = text[start:end]
1122
+ if any(ch.isdigit() for ch in value):
1123
+ continue
1124
+ prefix = text[max(0, start - 20) : start]
1125
+ if CITY_COUNTY_PREFIX_RE.search(prefix):
1126
+ continue
1127
+ has_context = False
1128
+ for other in repaired:
1129
+ other_start = int(other["start"])
1130
+ other_end = int(other["end"])
1131
+ if other["label"] == "STREET_ADDRESS" and 0 <= start - other_end <= 4:
1132
+ has_context = True
1133
+ break
1134
+ if other["label"] == "POSTCODE" and 0 <= other_start - end <= 6:
1135
+ has_context = True
1136
+ break
1137
+ if not has_context:
1138
+ cue_window = text[max(0, start - 40) : min(len(text), end + 24)]
1139
+ has_context = bool(CITY_CUE_RE.search(cue_window))
1140
+ if not has_context:
1141
+ continue
1142
+ candidate_span = {
1143
+ "start": start,
1144
+ "end": end,
1145
+ "label": "CITY",
1146
+ "score": 0.63,
1147
+ "text": value,
1148
+ }
1149
+ repaired = [
1150
+ other
1151
+ for other in repaired
1152
+ if not (
1153
+ spans_overlap(candidate_span, other)
1154
+ and other["label"] in {"CITY", "FIRST_NAME", "LAST_NAME"}
1155
+ )
1156
+ ]
1157
+ repaired.append(candidate_span)
1158
+ return repaired
1159
+
1160
+
1161
+ def repair_prefixed_city_spans(text: str, spans: list[dict]) -> list[dict]:
1162
+ repaired: list[dict] = []
1163
+ for span in spans:
1164
+ if span["label"] != "CITY":
1165
+ repaired.append(span)
1166
+ continue
1167
+ start = int(span["start"])
1168
+ end = int(span["end"])
1169
+ if start <= 0:
1170
+ repaired.append(span)
1171
+ continue
1172
+ prefix_char = text[start - 1]
1173
+ if prefix_char.lower() not in IRISH_CITY_PREFIX_CHARS:
1174
+ repaired.append(span)
1175
+ continue
1176
+ if start - 1 > 0 and text[start - 2].isalpha():
1177
+ repaired.append(span)
1178
+ continue
1179
+ if normalize_surface(span.get("text", "")) not in IRISH_CITY_SURFACES:
1180
+ repaired.append(span)
1181
+ continue
1182
+ candidate_start = start - 1
1183
+ candidate_text = text[candidate_start:end]
1184
+ repaired.append(
1185
+ {
1186
+ **span,
1187
+ "start": candidate_start,
1188
+ "text": candidate_text,
1189
+ "score": max(float(span.get("score", 0.0)), 0.66),
1190
+ }
1191
+ )
1192
+ return repaired
1193
+
1194
+
1195
+ def repair_county_spans(text: str, spans: list[dict]) -> list[dict]:
1196
+ repaired = list(spans)
1197
+ seen: set[tuple[int, int]] = set()
1198
+ ordered_forms = sorted(IRISH_COUNTY_FORMS, key=len, reverse=True)
1199
+ for form in ordered_forms:
1200
+ for match in iter_bounded_form_matches(form, text):
1201
+ start, end = match.span()
1202
+ key = (start, end)
1203
+ if key in seen:
1204
+ continue
1205
+ seen.add(key)
1206
+ candidate_span = {
1207
+ "start": start,
1208
+ "end": end,
1209
+ "label": "COUNTY",
1210
+ "score": 0.74,
1211
+ "text": text[start:end],
1212
+ }
1213
+ if not is_reasonable_span_text("COUNTY", text, start, end):
1214
+ continue
1215
+ overlapping_counties = [
1216
+ other
1217
+ for other in repaired
1218
+ if spans_overlap(candidate_span, other) and other["label"] == "COUNTY"
1219
+ ]
1220
+ if overlapping_counties:
1221
+ candidate_span["score"] = max(
1222
+ float(candidate_span["score"]),
1223
+ max(float(other.get("score", 0.0)) for other in overlapping_counties),
1224
+ )
1225
+ conflicting_labels = {"COUNTY", "CITY", "FIRST_NAME", "LAST_NAME"}
1226
+ repaired = [
1227
+ other
1228
+ for other in repaired
1229
+ if not (
1230
+ spans_overlap(candidate_span, other)
1231
+ and other["label"] in conflicting_labels
1232
+ )
1233
+ ]
1234
+ repaired.append(candidate_span)
1235
+ return repaired
1236
+
1237
+
1238
+ def repair_street_addresses(text: str, spans: list[dict]) -> list[dict]:
1239
+ repaired = list(spans)
1240
+ seen: set[tuple[int, int]] = set()
1241
+ for match in STREET_ADDRESS_VALUE_RE.finditer(text):
1242
+ start, end = match.span(1)
1243
+ key = (start, end)
1244
+ if key in seen:
1245
+ continue
1246
+ seen.add(key)
1247
+ candidate_span = {
1248
+ "start": start,
1249
+ "end": end,
1250
+ "label": "STREET_ADDRESS",
1251
+ "score": 0.65,
1252
+ "text": text[start:end],
1253
+ }
1254
+ if not is_reasonable_span_text("STREET_ADDRESS", text, start, end):
1255
+ continue
1256
+ context = text[max(0, start - 32) : min(len(text), end + 24)]
1257
+ has_context = bool(ADDRESS_CUE_RE.search(context))
1258
+ if not has_context:
1259
+ for other in repaired:
1260
+ other_start = int(other["start"])
1261
+ other_end = int(other["end"])
1262
+ if other["label"] in {"CITY", "COUNTY", "POSTCODE"} and 0 <= other_start - end <= 16:
1263
+ has_context = True
1264
+ break
1265
+ if other["label"] in {"FIRST_NAME", "LAST_NAME"} and 0 <= start - other_end <= 24:
1266
+ has_context = True
1267
+ break
1268
+ if not has_context:
1269
+ continue
1270
+ conflicting_labels = {"STREET_ADDRESS", "FIRST_NAME", "LAST_NAME"}
1271
+ repaired = [
1272
+ other
1273
+ for other in repaired
1274
+ if not (
1275
+ spans_overlap(candidate_span, other)
1276
+ and other["label"] in conflicting_labels
1277
+ )
1278
+ ]
1279
+ repaired.append(candidate_span)
1280
+ return repaired
1281
+
1282
+
1283
+ def repair_contextual_address_blocks(text: str, spans: list[dict]) -> list[dict]:
1284
+ repaired = list(spans)
1285
+ for match in ADDRESS_BLOCK_VALUE_RE.finditer(text):
1286
+ start, end = match.span(1)
1287
+ value = text[start:end].strip()
1288
+ if not value:
1289
+ continue
1290
+ candidate_span = {
1291
+ "start": start,
1292
+ "end": end,
1293
+ "label": "STREET_ADDRESS",
1294
+ "score": 0.68,
1295
+ "text": text[start:end],
1296
+ }
1297
+ tokens = [token for token in re.split(r"\s+", value) if token]
1298
+ if len(tokens) < 2:
1299
+ continue
1300
+ if not (
1301
+ any(ch.isdigit() for ch in value)
1302
+ or ADDRESS_UNIT_PREFIX_RE.match(value)
1303
+ or HOUSE_NAME_PREFIX_RE.match(value)
1304
+ ):
1305
+ continue
1306
+ if any(
1307
+ other["label"] == "STREET_ADDRESS"
1308
+ and int(other["start"]) <= start
1309
+ and int(other["end"]) >= end
1310
+ and (int(other["start"]), int(other["end"])) != (start, end)
1311
+ for other in repaired
1312
+ ):
1313
+ continue
1314
+ conflicting_labels = {"STREET_ADDRESS", "FIRST_NAME", "LAST_NAME"}
1315
+ repaired = [
1316
+ other
1317
+ for other in repaired
1318
+ if not (
1319
+ spans_overlap(candidate_span, other)
1320
+ and other["label"] in conflicting_labels
1321
+ )
1322
+ ]
1323
+ repaired.append(candidate_span)
1324
+ return repaired
1325
+
1326
+
1327
+ def prefer_long_street_address_spans(spans: list[dict]) -> list[dict]:
1328
+ if not spans:
1329
+ return spans
1330
+ keep: list[dict] = []
1331
+ for span in spans:
1332
+ if span["label"] != "STREET_ADDRESS":
1333
+ keep.append(span)
1334
+ continue
1335
+ shadowed = False
1336
+ for other in spans:
1337
+ if other is span or other["label"] != "STREET_ADDRESS":
1338
+ continue
1339
+ if int(other["start"]) <= int(span["start"]) and int(other["end"]) >= int(span["end"]):
1340
+ if (int(other["start"]), int(other["end"])) != (int(span["start"]), int(span["end"])):
1341
+ shadowed = True
1342
+ break
1343
+ if not shadowed:
1344
+ keep.append(span)
1345
+ return keep
1346
+
1347
+
1348
+ def drop_contextual_fragment_spans(spans: list[dict]) -> list[dict]:
1349
+ if not spans:
1350
+ return spans
1351
+ suppressors = {"COUNTY", "CITY", "POSTCODE", "STREET_ADDRESS", "DATE_OF_BIRTH"}
1352
+ keep: list[dict] = []
1353
+ for span in spans:
1354
+ if span["label"] in {"FIRST_NAME", "LAST_NAME"}:
1355
+ if any(
1356
+ other is not span
1357
+ and other["label"] in suppressors
1358
+ and spans_overlap(span, other)
1359
+ and (int(other["end"]) - int(other["start"])) >= (int(span["end"]) - int(span["start"]))
1360
+ for other in spans
1361
+ ):
1362
+ continue
1363
+ if span["label"] == "CITY":
1364
+ if any(
1365
+ other is not span
1366
+ and other["label"] == "COUNTY"
1367
+ and spans_overlap(span, other)
1368
+ and (int(other["end"]) - int(other["start"])) >= (int(span["end"]) - int(span["start"]))
1369
+ for other in spans
1370
+ ):
1371
+ continue
1372
+ keep.append(span)
1373
+ return keep
1374
+
1375
+
1376
+ def drop_public_contact_detail_spans(text: str, spans: list[dict]) -> list[dict]:
1377
+ if not PUBLIC_CONTACT_DETAILS_RE.search(text):
1378
+ return spans
1379
+ keep: list[dict] = []
1380
+ for span in spans:
1381
+ if span["label"] not in {"STREET_ADDRESS", "CITY", "COUNTY"}:
1382
+ keep.append(span)
1383
+ continue
1384
+ keep.append(span)
1385
+ return [
1386
+ span for span in keep
1387
+ if not (span["label"] in {"STREET_ADDRESS", "CITY", "COUNTY"} and PUBLIC_CONTACT_DETAILS_RE.search(text))
1388
+ ]
1389
+
1390
+
1391
+ def drop_city_org_prefix_spans(text: str, spans: list[dict]) -> list[dict]:
1392
+ keep: list[dict] = []
1393
+ for span in spans:
1394
+ if span["label"] != "CITY":
1395
+ keep.append(span)
1396
+ continue
1397
+ tail = text[int(span["end"]) : min(len(text), int(span["end"]) + 24)]
1398
+ if re.match(r"^\s+Intreo\s+Centre\b", tail):
1399
+ continue
1400
+ keep.append(span)
1401
+ return keep
1402
+
1403
+
1404
+ def canonicalize_email_spans(text: str, spans: list[dict]) -> list[dict]:
1405
+ repaired: list[dict] = []
1406
+ for span in spans:
1407
+ if span["label"] != "EMAIL":
1408
+ repaired.append(span)
1409
+ continue
1410
+ segment = text[int(span["start"]) : int(span["end"])]
1411
+ match = EMAIL_EXTRACT_RE.search(segment)
1412
+ if not match:
1413
+ repaired.append(span)
1414
+ continue
1415
+ start = int(span["start"]) + int(match.start(1))
1416
+ end = int(span["start"]) + int(match.end(1))
1417
+ repaired.append(
1418
+ {
1419
+ **span,
1420
+ "start": start,
1421
+ "end": end,
1422
+ "text": text[start:end],
1423
+ }
1424
+ )
1425
+ return repaired
1426
+
1427
+
1428
+ def drop_stacked_first_names(spans: list[dict]) -> list[dict]:
1429
+ if not spans:
1430
+ return spans
1431
+ first_names = [span for span in spans if span["label"] == "FIRST_NAME"]
1432
+ last_names = [span for span in spans if span["label"] == "LAST_NAME"]
1433
+ if not first_names or not last_names:
1434
+ return spans
1435
+ keep: list[dict] = []
1436
+ for span in spans:
1437
+ if span["label"] != "FIRST_NAME":
1438
+ keep.append(span)
1439
+ continue
1440
+ shadowed = False
1441
+ for other in first_names:
1442
+ if other is span:
1443
+ continue
1444
+ if int(other["start"]) <= int(span["start"]):
1445
+ continue
1446
+ if int(other["start"]) - int(span["end"]) > 2:
1447
+ continue
1448
+ if not any(
1449
+ int(last["start"]) >= int(other["end"]) and int(last["start"]) - int(other["end"]) <= 2
1450
+ for last in last_names
1451
+ ):
1452
+ continue
1453
+ shadowed = True
1454
+ break
1455
+ if not shadowed:
1456
+ keep.append(span)
1457
+ return keep
1458
+
1459
+
1460
+ def decode_span_matrix(
1461
+ text: str,
1462
+ offsets: list[tuple[int, int]],
1463
+ span_scores: np.ndarray,
1464
+ config,
1465
+ min_score: float,
1466
+ ) -> list[dict]:
1467
+ label_names = label_names_from_config(config)
1468
+ thresholds = label_thresholds_from_config(config, min_score)
1469
+ max_span_tokens = label_max_span_tokens_from_config(config)
1470
+ min_nonspace_chars = label_min_nonspace_chars_from_config(config)
1471
+
1472
+ if span_scores.ndim != 3:
1473
+ raise ValueError(f"Expected [num_labels, seq_len, seq_len] span scores, got shape {span_scores.shape}")
1474
+
1475
+ num_labels, seq_len, _ = span_scores.shape
1476
+ spans: list[dict] = []
1477
+ for label_index in range(min(num_labels, len(label_names))):
1478
+ label = label_names[label_index]
1479
+ threshold = thresholds.get(label, min_score)
1480
+ max_width = max(1, int(max_span_tokens.get(label, 8)))
1481
+ min_chars = max(1, int(min_nonspace_chars.get(label, 1)))
1482
+
1483
+ for start_idx in range(seq_len):
1484
+ start_offset = offsets[start_idx]
1485
+ if not valid_offset(start_offset):
1486
+ continue
1487
+ max_end = min(seq_len, start_idx + max_width)
1488
+ for end_idx in range(start_idx, max_end):
1489
+ end_offset = offsets[end_idx]
1490
+ if not valid_offset(end_offset):
1491
+ continue
1492
+ score = float(span_scores[label_index, start_idx, end_idx])
1493
+ if score < threshold:
1494
+ continue
1495
+ start_char = int(start_offset[0])
1496
+ end_char = int(end_offset[1])
1497
+ if end_char <= start_char:
1498
+ continue
1499
+ if nonspace_length(text, start_char, end_char) < min_chars:
1500
+ continue
1501
+ if not is_reasonable_span_text(label, text, start_char, end_char):
1502
+ continue
1503
+ spans.append(
1504
+ {
1505
+ "start": start_char,
1506
+ "end": end_char,
1507
+ "label": label,
1508
+ "score": score,
1509
+ "text": text[start_char:end_char],
1510
+ }
1511
+ )
1512
+ spans = prefer_long_name_spans(spans, thresholds)
1513
+ spans = prefer_long_structured_spans(spans, thresholds)
1514
+ spans = repair_first_name_from_last_name(text, spans)
1515
+ spans = repair_emails(text, spans)
1516
+ spans = repair_phone_numbers(text, spans)
1517
+ spans = repair_ppsn_variants(text, spans)
1518
+ spans = repair_postcodes(text, spans)
1519
+ spans = repair_street_addresses(text, spans)
1520
+ spans = repair_contextual_name_cues(text, spans)
1521
+ spans = repair_contextual_address_blocks(text, spans)
1522
+ spans = prefer_long_street_address_spans(spans)
1523
+ spans = repair_county_spans(text, spans)
1524
+ spans = repair_city_spans(text, spans)
1525
+ spans = repair_city_before_postcode(text, spans)
1526
+ spans = repair_prefixed_city_spans(text, spans)
1527
+ spans = repair_contextual_date_of_birth(text, spans)
1528
+ spans = repair_contextual_ages(text, spans)
1529
+ spans = repair_contextual_passport_numbers(text, spans)
1530
+ spans = repair_contextual_account_numbers(text, spans)
1531
+ spans = drop_public_contact_detail_spans(text, spans)
1532
+ spans = drop_city_org_prefix_spans(text, spans)
1533
+ spans = drop_stacked_first_names(spans)
1534
+ spans = drop_contextual_fragment_spans(spans)
1535
+ spans = canonicalize_email_spans(text, spans)
1536
+ return dedupe_spans(spans)
1537
+
1538
+
1539
+ def prefer_long_name_spans(spans: list[dict], thresholds: dict[str, float]) -> list[dict]:
1540
+ if not spans:
1541
+ return spans
1542
+ preferred: list[dict] = []
1543
+ consumed: set[int] = set()
1544
+ for index, span in enumerate(spans):
1545
+ if index in consumed:
1546
+ continue
1547
+ label = span["label"]
1548
+ if label not in {"FIRST_NAME", "LAST_NAME"}:
1549
+ preferred.append(span)
1550
+ continue
1551
+ same_start = [
1552
+ (other_index, other)
1553
+ for other_index, other in enumerate(spans)
1554
+ if other_index not in consumed and other["label"] == label and other["start"] == span["start"]
1555
+ ]
1556
+ if len(same_start) == 1:
1557
+ preferred.append(span)
1558
+ continue
1559
+ for other_index, _ in same_start:
1560
+ consumed.add(other_index)
1561
+ best_by_score = max(same_start, key=lambda item: float(item[1].get("score", 0.0)))[1]
1562
+ longest = max(same_start, key=lambda item: (item[1]["end"] - item[1]["start"], float(item[1].get("score", 0.0))))[1]
1563
+ threshold = float(thresholds.get(label, 0.5))
1564
+ if float(longest.get("score", 0.0)) >= max(threshold + 0.15, float(best_by_score.get("score", 0.0)) * 0.7):
1565
+ preferred.append(longest)
1566
+ else:
1567
+ preferred.append(best_by_score)
1568
+ return prefer_same_end_extensions(preferred, thresholds)
1569
+
1570
+
1571
+ def prefer_same_end_extensions(spans: list[dict], thresholds: dict[str, float]) -> list[dict]:
1572
+ if not spans:
1573
+ return spans
1574
+ preferred: list[dict] = []
1575
+ consumed: set[int] = set()
1576
+ for index, span in enumerate(spans):
1577
+ if index in consumed:
1578
+ continue
1579
+ label = span["label"]
1580
+ if label not in {"FIRST_NAME", "LAST_NAME", "EMAIL"}:
1581
+ preferred.append(span)
1582
+ continue
1583
+ same_end = [
1584
+ (other_index, other)
1585
+ for other_index, other in enumerate(spans)
1586
+ if other_index not in consumed and other["label"] == label and other["end"] == span["end"]
1587
+ ]
1588
+ if len(same_end) == 1:
1589
+ preferred.append(span)
1590
+ continue
1591
+ for other_index, _ in same_end:
1592
+ consumed.add(other_index)
1593
+ best_by_score = max(same_end, key=lambda item: float(item[1].get("score", 0.0)))[1]
1594
+ longest = max(same_end, key=lambda item: (item[1]["end"] - item[1]["start"], float(item[1].get("score", 0.0))))[1]
1595
+ longest_score = float(longest.get("score", 0.0))
1596
+ best_score = float(best_by_score.get("score", 0.0))
1597
+ if label == "EMAIL":
1598
+ if "@" in longest.get("text", "") or longest["end"] - longest["start"] > best_by_score["end"] - best_by_score["start"]:
1599
+ if longest_score >= best_score - 0.02:
1600
+ preferred.append(longest)
1601
+ continue
1602
+ else:
1603
+ longest_text = longest.get("text", "")
1604
+ if " " not in longest_text.strip() and longest_score >= max(float(thresholds.get(label, 0.5)) * 0.8, best_score * 0.55):
1605
+ preferred.append(longest)
1606
+ continue
1607
+ preferred.append(best_by_score)
1608
+ return preferred
1609
+
1610
+
1611
+ def prefer_long_structured_spans(spans: list[dict], thresholds: dict[str, float]) -> list[dict]:
1612
+ if not spans:
1613
+ return spans
1614
+ preferred: list[dict] = []
1615
+ consumed: set[int] = set()
1616
+ target_labels = {"STREET_ADDRESS", "DATE_OF_BIRTH"}
1617
+ for index, span in enumerate(spans):
1618
+ if index in consumed:
1619
+ continue
1620
+ label = span["label"]
1621
+ if label not in target_labels:
1622
+ preferred.append(span)
1623
+ continue
1624
+ overlapping = [
1625
+ (other_index, other)
1626
+ for other_index, other in enumerate(spans)
1627
+ if other_index not in consumed and other["label"] == label and spans_overlap(span, other)
1628
+ ]
1629
+ if len(overlapping) == 1:
1630
+ preferred.append(span)
1631
+ continue
1632
+ for other_index, _ in overlapping:
1633
+ consumed.add(other_index)
1634
+ best_by_score = max(overlapping, key=lambda item: float(item[1].get("score", 0.0)))[1]
1635
+ longest = max(
1636
+ overlapping,
1637
+ key=lambda item: (item[1]["end"] - item[1]["start"], float(item[1].get("score", 0.0))),
1638
+ )[1]
1639
+ longest_score = float(longest.get("score", 0.0))
1640
+ best_score = float(best_by_score.get("score", 0.0))
1641
+ threshold = float(thresholds.get(label, 0.5))
1642
+ if longest_score >= max(threshold, best_score * 0.75):
1643
+ preferred.append(longest)
1644
+ else:
1645
+ preferred.append(best_by_score)
1646
+ return preferred
1647
+
1648
+
1649
+ def sigmoid_np(values: np.ndarray) -> np.ndarray:
1650
+ clipped = np.clip(values, -60.0, 60.0)
1651
+ return 1.0 / (1.0 + np.exp(-clipped))
1652
+
1653
+
1654
+ def run_onnx_span(session, encoded: dict[str, Any]) -> np.ndarray:
1655
+ feed = {}
1656
+ input_names = {item.name for item in session.get_inputs()}
1657
+ for key, value in encoded.items():
1658
+ if key == "offset_mapping":
1659
+ continue
1660
+ if key in input_names:
1661
+ feed[key] = value
1662
+ outputs = session.run(None, feed)
1663
+ if not outputs:
1664
+ raise ValueError("ONNX session returned no outputs")
1665
+ return outputs[0]
config.json ADDED
@@ -0,0 +1,318 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "activation": "gelu",
3
+ "architectures": [
4
+ "IrishCoreGlobalPointerModel"
5
+ ],
6
+ "attention_dropout": 0.1,
7
+ "dim": 768,
8
+ "dropout": 0.1,
9
+ "dtype": "float32",
10
+ "global_pointer_head_size": 64,
11
+ "global_pointer_min_negatives": 256,
12
+ "global_pointer_negative_ratio": 16,
13
+ "global_pointer_use_rope": true,
14
+ "hidden_dim": 3072,
15
+ "id2label": {
16
+ "0": "O",
17
+ "1": "B-account_number",
18
+ "2": "B-age",
19
+ "3": "B-api_key",
20
+ "4": "B-bank_routing_number",
21
+ "5": "B-biometric_identifier",
22
+ "6": "B-blood_type",
23
+ "7": "B-certificate_license_number",
24
+ "8": "B-city",
25
+ "9": "B-company_name",
26
+ "10": "B-coordinate",
27
+ "11": "B-country",
28
+ "12": "B-county",
29
+ "13": "B-credit_debit_card",
30
+ "14": "B-customer_id",
31
+ "15": "B-cvv",
32
+ "16": "B-date",
33
+ "17": "B-date_of_birth",
34
+ "18": "B-date_time",
35
+ "19": "B-device_identifier",
36
+ "20": "B-education_level",
37
+ "21": "B-email",
38
+ "22": "B-employee_id",
39
+ "23": "B-employment_status",
40
+ "24": "B-fax_number",
41
+ "25": "B-first_name",
42
+ "26": "B-gender",
43
+ "27": "B-health_plan_beneficiary_number",
44
+ "28": "B-http_cookie",
45
+ "29": "B-ipv4",
46
+ "30": "B-ipv6",
47
+ "31": "B-language",
48
+ "32": "B-last_name",
49
+ "33": "B-license_plate",
50
+ "34": "B-mac_address",
51
+ "35": "B-medical_record_number",
52
+ "36": "B-occupation",
53
+ "37": "B-password",
54
+ "38": "B-phone_number",
55
+ "39": "B-pin",
56
+ "40": "B-political_view",
57
+ "41": "B-postcode",
58
+ "42": "B-race_ethnicity",
59
+ "43": "B-religious_belief",
60
+ "44": "B-sexuality",
61
+ "45": "B-ssn",
62
+ "46": "B-state",
63
+ "47": "B-street_address",
64
+ "48": "B-swift_bic",
65
+ "49": "B-tax_id",
66
+ "50": "B-time",
67
+ "51": "B-unique_id",
68
+ "52": "B-url",
69
+ "53": "B-user_name",
70
+ "54": "B-vehicle_identifier",
71
+ "55": "I-account_number",
72
+ "56": "I-api_key",
73
+ "57": "I-biometric_identifier",
74
+ "58": "I-blood_type",
75
+ "59": "I-certificate_license_number",
76
+ "60": "I-city",
77
+ "61": "I-company_name",
78
+ "62": "I-coordinate",
79
+ "63": "I-country",
80
+ "64": "I-county",
81
+ "65": "I-credit_debit_card",
82
+ "66": "I-customer_id",
83
+ "67": "I-date",
84
+ "68": "I-date_of_birth",
85
+ "69": "I-date_time",
86
+ "70": "I-device_identifier",
87
+ "71": "I-education_level",
88
+ "72": "I-email",
89
+ "73": "I-employee_id",
90
+ "74": "I-employment_status",
91
+ "75": "I-fax_number",
92
+ "76": "I-first_name",
93
+ "77": "I-gender",
94
+ "78": "I-health_plan_beneficiary_number",
95
+ "79": "I-http_cookie",
96
+ "80": "I-ipv4",
97
+ "81": "I-ipv6",
98
+ "82": "I-language",
99
+ "83": "I-last_name",
100
+ "84": "I-license_plate",
101
+ "85": "I-mac_address",
102
+ "86": "I-medical_record_number",
103
+ "87": "I-occupation",
104
+ "88": "I-password",
105
+ "89": "I-phone_number",
106
+ "90": "I-pin",
107
+ "91": "I-political_view",
108
+ "92": "I-postcode",
109
+ "93": "I-race_ethnicity",
110
+ "94": "I-religious_belief",
111
+ "95": "I-sexuality",
112
+ "96": "I-ssn",
113
+ "97": "I-state",
114
+ "98": "I-street_address",
115
+ "99": "I-swift_bic",
116
+ "100": "I-tax_id",
117
+ "101": "I-time",
118
+ "102": "I-unique_id",
119
+ "103": "I-url",
120
+ "104": "I-user_name",
121
+ "105": "I-vehicle_identifier"
122
+ },
123
+ "initializer_range": 0.02,
124
+ "label2id": {
125
+ "B-account_number": 1,
126
+ "B-age": 2,
127
+ "B-api_key": 3,
128
+ "B-bank_routing_number": 4,
129
+ "B-biometric_identifier": 5,
130
+ "B-blood_type": 6,
131
+ "B-certificate_license_number": 7,
132
+ "B-city": 8,
133
+ "B-company_name": 9,
134
+ "B-coordinate": 10,
135
+ "B-country": 11,
136
+ "B-county": 12,
137
+ "B-credit_debit_card": 13,
138
+ "B-customer_id": 14,
139
+ "B-cvv": 15,
140
+ "B-date": 16,
141
+ "B-date_of_birth": 17,
142
+ "B-date_time": 18,
143
+ "B-device_identifier": 19,
144
+ "B-education_level": 20,
145
+ "B-email": 21,
146
+ "B-employee_id": 22,
147
+ "B-employment_status": 23,
148
+ "B-fax_number": 24,
149
+ "B-first_name": 25,
150
+ "B-gender": 26,
151
+ "B-health_plan_beneficiary_number": 27,
152
+ "B-http_cookie": 28,
153
+ "B-ipv4": 29,
154
+ "B-ipv6": 30,
155
+ "B-language": 31,
156
+ "B-last_name": 32,
157
+ "B-license_plate": 33,
158
+ "B-mac_address": 34,
159
+ "B-medical_record_number": 35,
160
+ "B-occupation": 36,
161
+ "B-password": 37,
162
+ "B-phone_number": 38,
163
+ "B-pin": 39,
164
+ "B-political_view": 40,
165
+ "B-postcode": 41,
166
+ "B-race_ethnicity": 42,
167
+ "B-religious_belief": 43,
168
+ "B-sexuality": 44,
169
+ "B-ssn": 45,
170
+ "B-state": 46,
171
+ "B-street_address": 47,
172
+ "B-swift_bic": 48,
173
+ "B-tax_id": 49,
174
+ "B-time": 50,
175
+ "B-unique_id": 51,
176
+ "B-url": 52,
177
+ "B-user_name": 53,
178
+ "B-vehicle_identifier": 54,
179
+ "I-account_number": 55,
180
+ "I-api_key": 56,
181
+ "I-biometric_identifier": 57,
182
+ "I-blood_type": 58,
183
+ "I-certificate_license_number": 59,
184
+ "I-city": 60,
185
+ "I-company_name": 61,
186
+ "I-coordinate": 62,
187
+ "I-country": 63,
188
+ "I-county": 64,
189
+ "I-credit_debit_card": 65,
190
+ "I-customer_id": 66,
191
+ "I-date": 67,
192
+ "I-date_of_birth": 68,
193
+ "I-date_time": 69,
194
+ "I-device_identifier": 70,
195
+ "I-education_level": 71,
196
+ "I-email": 72,
197
+ "I-employee_id": 73,
198
+ "I-employment_status": 74,
199
+ "I-fax_number": 75,
200
+ "I-first_name": 76,
201
+ "I-gender": 77,
202
+ "I-health_plan_beneficiary_number": 78,
203
+ "I-http_cookie": 79,
204
+ "I-ipv4": 80,
205
+ "I-ipv6": 81,
206
+ "I-language": 82,
207
+ "I-last_name": 83,
208
+ "I-license_plate": 84,
209
+ "I-mac_address": 85,
210
+ "I-medical_record_number": 86,
211
+ "I-occupation": 87,
212
+ "I-password": 88,
213
+ "I-phone_number": 89,
214
+ "I-pin": 90,
215
+ "I-political_view": 91,
216
+ "I-postcode": 92,
217
+ "I-race_ethnicity": 93,
218
+ "I-religious_belief": 94,
219
+ "I-sexuality": 95,
220
+ "I-ssn": 96,
221
+ "I-state": 97,
222
+ "I-street_address": 98,
223
+ "I-swift_bic": 99,
224
+ "I-tax_id": 100,
225
+ "I-time": 101,
226
+ "I-unique_id": 102,
227
+ "I-url": 103,
228
+ "I-user_name": 104,
229
+ "I-vehicle_identifier": 105,
230
+ "O": 0
231
+ },
232
+ "max_position_embeddings": 512,
233
+ "model_type": "distilbert",
234
+ "n_heads": 12,
235
+ "n_layers": 6,
236
+ "num_span_labels": 16,
237
+ "output_past": true,
238
+ "pad_token_id": 0,
239
+ "qa_dropout": 0.1,
240
+ "seq_classif_dropout": 0.2,
241
+ "sinusoidal_pos_embds": false,
242
+ "span_label_max_span_tokens": {
243
+ "ACCOUNT_NUMBER": 19,
244
+ "AGE": 8,
245
+ "BANK_ROUTING_NUMBER": 6,
246
+ "CITY": 8,
247
+ "COUNTY": 8,
248
+ "CREDIT_DEBIT_CARD": 12,
249
+ "DATE_OF_BIRTH": 8,
250
+ "EMAIL": 16,
251
+ "FIRST_NAME": 6,
252
+ "LAST_NAME": 8,
253
+ "PASSPORT_NUMBER": 8,
254
+ "PHONE_NUMBER": 10,
255
+ "POSTCODE": 8,
256
+ "PPSN": 9,
257
+ "STREET_ADDRESS": 10,
258
+ "SWIFT_BIC": 8
259
+ },
260
+ "span_label_min_nonspace_chars": {
261
+ "ACCOUNT_NUMBER": 6,
262
+ "AGE": 1,
263
+ "BANK_ROUTING_NUMBER": 6,
264
+ "CITY": 1,
265
+ "COUNTY": 1,
266
+ "CREDIT_DEBIT_CARD": 12,
267
+ "DATE_OF_BIRTH": 1,
268
+ "EMAIL": 6,
269
+ "FIRST_NAME": 2,
270
+ "LAST_NAME": 2,
271
+ "PASSPORT_NUMBER": 7,
272
+ "PHONE_NUMBER": 7,
273
+ "POSTCODE": 6,
274
+ "PPSN": 8,
275
+ "STREET_ADDRESS": 1,
276
+ "SWIFT_BIC": 8
277
+ },
278
+ "span_label_names": [
279
+ "ACCOUNT_NUMBER",
280
+ "AGE",
281
+ "BANK_ROUTING_NUMBER",
282
+ "CITY",
283
+ "COUNTY",
284
+ "CREDIT_DEBIT_CARD",
285
+ "DATE_OF_BIRTH",
286
+ "EMAIL",
287
+ "FIRST_NAME",
288
+ "LAST_NAME",
289
+ "PASSPORT_NUMBER",
290
+ "PHONE_NUMBER",
291
+ "POSTCODE",
292
+ "PPSN",
293
+ "STREET_ADDRESS",
294
+ "SWIFT_BIC"
295
+ ],
296
+ "span_label_thresholds": {
297
+ "ACCOUNT_NUMBER": 0.5,
298
+ "AGE": 0.5,
299
+ "BANK_ROUTING_NUMBER": 0.5,
300
+ "CITY": 0.5,
301
+ "COUNTY": 0.5,
302
+ "CREDIT_DEBIT_CARD": 0.5,
303
+ "DATE_OF_BIRTH": 0.5,
304
+ "EMAIL": 0.5,
305
+ "FIRST_NAME": 0.5,
306
+ "LAST_NAME": 0.5,
307
+ "PASSPORT_NUMBER": 0.5,
308
+ "PHONE_NUMBER": 0.5,
309
+ "POSTCODE": 0.5,
310
+ "PPSN": 0.5,
311
+ "STREET_ADDRESS": 0.5,
312
+ "SWIFT_BIC": 0.5
313
+ },
314
+ "span_positive_weight": 8.0,
315
+ "tie_weights_": true,
316
+ "transformers_version": "4.57.6",
317
+ "vocab_size": 119547
318
+ }
eval/benchmark_summary.json ADDED
@@ -0,0 +1,167 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "release": "IrishCore-GlobalPointer-ContextPII-135M-v1-rc10",
3
+ "repo_id": "temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc10",
4
+ "architecture": {
5
+ "family": "DistilBERT-size GlobalPointer span extractor",
6
+ "base_head": "typed span matrix",
7
+ "raw_only": true,
8
+ "scanner_free": true,
9
+ "validator_free": true,
10
+ "uses_rope": true,
11
+ "runtime_diffusion": false,
12
+ "expanded_context_labels": [
13
+ "STREET_ADDRESS",
14
+ "CITY",
15
+ "COUNTY",
16
+ "DATE_OF_BIRTH",
17
+ "AGE"
18
+ ]
19
+ },
20
+ "base_model": "OpenMed/OpenMed-PII-mLiteClinical-Base-135M-v1",
21
+ "notes": [
22
+ "This release keeps the rc9 weights and ONNX graph but strengthens the bundled decoder for lowercase self-identification names, city-before-postcode recovery beyond the hardcoded city list, wider street suffix coverage, dotted/month-first DOB recovery, and dotted phone formatting.",
23
+ "The decoder now recovers spans from phrases such as `my name is aoife murphy`, `is mise eibhlín ní bhroin`, `Naas, W91 XY45`, `14 Cedar Crescent`, `14.03.1991`, `March 14, 1991`, and `087.123.4567`.",
24
+ "The new `globalpointer_context_redteam_v4` suite is `1.0000` on both full and q8 paths; the packaged public `rc9` bundle scores `0.8533` on the same suite.",
25
+ "The dynamic q8 ONNX artifact remains the recommended CPU deployment artifact."
26
+ ],
27
+ "labels": [
28
+ "ACCOUNT_NUMBER",
29
+ "AGE",
30
+ "BANK_ROUTING_NUMBER",
31
+ "CITY",
32
+ "COUNTY",
33
+ "CREDIT_DEBIT_CARD",
34
+ "DATE_OF_BIRTH",
35
+ "EMAIL",
36
+ "FIRST_NAME",
37
+ "LAST_NAME",
38
+ "PASSPORT_NUMBER",
39
+ "PHONE_NUMBER",
40
+ "POSTCODE",
41
+ "PPSN",
42
+ "STREET_ADDRESS",
43
+ "SWIFT_BIC"
44
+ ],
45
+ "full": {
46
+ "core_f1": 1.0,
47
+ "extended_f1": 1.0,
48
+ "demographic_holdout_v2_f1": 1.0,
49
+ "contact_policy_f1": 1.0,
50
+ "chatbot_redteam_v2_f1": 0.9861111111111112,
51
+ "chatbot_gap_holdout_v2_f1": 1.0,
52
+ "multilingual_f1": 0.9333333333333333,
53
+ "multilingual_ppsn_label_f1": 1.0,
54
+ "context_redteam_v1_f1": 1.0,
55
+ "context_redteam_v2_f1": 1.0,
56
+ "context_redteam_v3_f1": 1.0,
57
+ "core_examples_per_second": 31.324325509253125,
58
+ "extended_examples_per_second": 20.951595392302877,
59
+ "demographic_holdout_v2_examples_per_second": 40.71343766608338,
60
+ "contact_policy_examples_per_second": 22.015501231595987,
61
+ "chatbot_redteam_v2_examples_per_second": 30.535365124536543,
62
+ "chatbot_gap_holdout_v2_examples_per_second": 51.49259633958476,
63
+ "multilingual_examples_per_second": 56.554157563306696,
64
+ "context_redteam_v1_examples_per_second": 23.609073299571445,
65
+ "context_redteam_v2_examples_per_second": 12.737044489760402,
66
+ "context_redteam_v3_examples_per_second": 17.88102919943181,
67
+ "location_coverage_v1_f1": 1.0,
68
+ "location_coverage_v1_examples_per_second": 27.442453278347067,
69
+ "location_coverage_v2_f1": 1.0,
70
+ "location_coverage_v2_examples_per_second": 24.3613357869789,
71
+ "location_coverage_v3_f1": 1.0,
72
+ "location_coverage_v3_examples_per_second": 35.4459974931921,
73
+ "numeric_qafix_v2_f1": 1.0,
74
+ "numeric_qafix_v2_examples_per_second": 29.420131775628487,
75
+ "context_redteam_v4_f1": 1.0,
76
+ "context_redteam_v4_examples_per_second": 30.495521507704247
77
+ },
78
+ "onnx_q8": {
79
+ "core_f1": 1.0,
80
+ "extended_f1": 1.0,
81
+ "demographic_holdout_v2_f1": 1.0,
82
+ "contact_policy_f1": 1.0,
83
+ "chatbot_redteam_v2_f1": 0.9861111111111112,
84
+ "chatbot_gap_holdout_v2_f1": 1.0,
85
+ "multilingual_f1": 0.9333333333333333,
86
+ "multilingual_ppsn_label_f1": 1.0,
87
+ "context_redteam_v1_f1": 1.0,
88
+ "context_redteam_v2_f1": 1.0,
89
+ "context_redteam_v3_f1": 1.0,
90
+ "core_examples_per_second": 125.82111537540908,
91
+ "extended_examples_per_second": 43.98572277525542,
92
+ "demographic_holdout_v2_examples_per_second": 81.67690051660445,
93
+ "contact_policy_examples_per_second": 81.28226623522056,
94
+ "chatbot_redteam_v2_examples_per_second": 76.31198067309518,
95
+ "chatbot_gap_holdout_v2_examples_per_second": 77.82562469441531,
96
+ "multilingual_examples_per_second": 113.8253292371824,
97
+ "context_redteam_v1_examples_per_second": 77.35126547341245,
98
+ "context_redteam_v2_examples_per_second": 83.42976656780596,
99
+ "context_redteam_v3_examples_per_second": 115.78405703667622,
100
+ "location_coverage_v1_f1": 1.0,
101
+ "location_coverage_v1_examples_per_second": 86.67576551780107,
102
+ "location_coverage_v2_f1": 1.0,
103
+ "location_coverage_v2_examples_per_second": 63.49649295628558,
104
+ "location_coverage_v3_f1": 1.0,
105
+ "location_coverage_v3_examples_per_second": 103.87880730624308,
106
+ "numeric_qafix_v2_f1": 1.0,
107
+ "numeric_qafix_v2_examples_per_second": 138.13081928103207,
108
+ "context_redteam_v4_f1": 1.0,
109
+ "context_redteam_v4_examples_per_second": 115.20604478400188
110
+ },
111
+ "comparison": {
112
+ "public_contextpii_rc8_onnx_q8": {
113
+ "core_f1": 1.0,
114
+ "extended_f1": 1.0,
115
+ "contact_policy_f1": 1.0,
116
+ "chatbot_redteam_v2_f1": 0.9861111111111112,
117
+ "multilingual_f1": 0.9333333333333333,
118
+ "multilingual_ppsn_label_f1": 1.0,
119
+ "context_redteam_v2_f1": 1.0,
120
+ "context_redteam_v3_f1": 0.8717948717948718,
121
+ "core_examples_per_second": 128.88250222316304
122
+ },
123
+ "public_contextpii_rc7_onnx_q8": {
124
+ "core_f1": 1.0,
125
+ "contact_policy_f1": 1.0,
126
+ "context_redteam_v2_f1": null,
127
+ "multilingual_f1": 0.9333333333333333,
128
+ "core_examples_per_second": 88.99815744185265
129
+ },
130
+ "public_contextpii_rc4_onnx_q8": {
131
+ "core_f1": 0.9934640522875817,
132
+ "extended_f1": 1.0,
133
+ "demographic_holdout_v2_f1": 1.0,
134
+ "contact_policy_f1": 1.0,
135
+ "chatbot_redteam_v2_f1": 0.9861111111111112,
136
+ "chatbot_gap_holdout_v2_f1": 1.0,
137
+ "multilingual_f1": 0.9333333333333333,
138
+ "multilingual_ppsn_label_f1": 1.0,
139
+ "core_examples_per_second": 61.49696721632529,
140
+ "extended_examples_per_second": 98.75019005245319,
141
+ "demographic_holdout_v2_examples_per_second": 90.7806851088372,
142
+ "contact_policy_examples_per_second": 101.91338377846299,
143
+ "chatbot_redteam_v2_examples_per_second": 13.042183136147377,
144
+ "chatbot_gap_holdout_v2_examples_per_second": 30.728912108647304,
145
+ "multilingual_examples_per_second": 33.54466395109805,
146
+ "location_coverage_v1_f1": null
147
+ },
148
+ "public_diffmask_rc6_onnx_q8": {
149
+ "core_f1": 0.9733333333333333,
150
+ "multilingual_f1": 0.9273743016759777,
151
+ "core_examples_per_second": 130.34154354965295
152
+ },
153
+ "public_globalpointer_rc4_onnx_q8": {
154
+ "core_f1": 1.0,
155
+ "multilingual_f1": 0.9333333333333333,
156
+ "core_examples_per_second": 221.57427241189015
157
+ },
158
+ "public_contextpii_rc9_onnx_q8": {
159
+ "core_f1": 1.0,
160
+ "contact_policy_f1": 1.0,
161
+ "chatbot_redteam_v2_f1": 0.9861111111111112,
162
+ "multilingual_f1": 0.9333333333333333,
163
+ "context_redteam_v4_f1": 0.8533333333333333,
164
+ "core_examples_per_second": 125.82111537540908
165
+ }
166
+ }
167
+ }
eval/benchmark_summary.md ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # IrishCore-GlobalPointer-ContextPII-135M-v1-rc10
2
+
3
+ ## ONNX q8
4
+
5
+ | Suite | F1 | Examples/s |
6
+ | --- | ---: | ---: |
7
+ | Irish core | 1.0000 | 125.8211 |
8
+ | Irish extended | 1.0000 | 43.9857 |
9
+ | Demographic holdout v2 | 1.0000 | 81.6769 |
10
+ | Gov contact policy v1 | 1.0000 | 81.2823 |
11
+ | Gov chatbot red-team v2 | 0.9861 | 76.3120 |
12
+ | Gov chatbot gap holdout v2 | 1.0000 | 77.8256 |
13
+ | Context red-team v1 | 1.0000 | 77.3513 |
14
+ | Context red-team v2 | 1.0000 | 83.4298 |
15
+ | Context red-team v3 | 1.0000 | 115.7841 |
16
+ | Context red-team v4 | 1.0000 | 115.2060 |
17
+ | Location coverage v1 | 1.0000 | 86.6758 |
18
+ | Location coverage v2 | 1.0000 | 63.4965 |
19
+ | Location coverage v3 | 1.0000 | 103.8788 |
20
+ | Numeric qafix v2 | 1.0000 | 138.1308 |
21
+ | Multilingual PPSN overall | 0.9333 | 113.8253 |
22
+ | Multilingual PPSN label-only | 1.0000 | — |
23
+
24
+ ## Full checkpoint
25
+
26
+ | Suite | F1 | Examples/s |
27
+ | --- | ---: | ---: |
28
+ | Irish core | 1.0000 | 31.3243 |
29
+ | Irish extended | 1.0000 | 20.9516 |
30
+ | Demographic holdout v2 | 1.0000 | 40.7134 |
31
+ | Gov contact policy v1 | 1.0000 | 22.0155 |
32
+ | Gov chatbot red-team v2 | 0.9861 | 30.5354 |
33
+ | Gov chatbot gap holdout v2 | 1.0000 | 51.4926 |
34
+ | Context red-team v1 | 1.0000 | 23.6091 |
35
+ | Context red-team v2 | 1.0000 | 12.7370 |
36
+ | Context red-team v3 | 1.0000 | 17.8810 |
37
+ | Context red-team v4 | 1.0000 | 30.4955 |
38
+ | Location coverage v1 | 1.0000 | 27.4425 |
39
+ | Location coverage v2 | 1.0000 | 24.3613 |
40
+ | Location coverage v3 | 1.0000 | 35.4460 |
41
+ | Numeric qafix v2 | 1.0000 | 29.4201 |
42
+ | Multilingual PPSN overall | 0.9333 | 56.5542 |
43
+ | Multilingual PPSN label-only | 1.0000 | — |
eval/full_diffmask_fresh_holdout_v1.json ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc1",
3
+ "input": "diffmask_fresh_holdout_v1.jsonl",
4
+ "loader_type": "global_pointer_pt",
5
+ "examples": 20,
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "elapsed_seconds": 0.6364284890005365,
9
+ "examples_per_second": 31.425368828803546,
10
+ "overall": {
11
+ "precision": 1.0,
12
+ "recall": 0.96875,
13
+ "f1": 0.9841269841269841,
14
+ "tp": 31,
15
+ "fp": 0,
16
+ "fn": 1
17
+ },
18
+ "by_label": {
19
+ "ACCOUNT_NUMBER": {
20
+ "precision": 1.0,
21
+ "recall": 0.5,
22
+ "f1": 0.6666666666666666,
23
+ "tp": 1,
24
+ "fp": 0,
25
+ "fn": 1
26
+ },
27
+ "CREDIT_DEBIT_CARD": {
28
+ "precision": 1.0,
29
+ "recall": 1.0,
30
+ "f1": 1.0,
31
+ "tp": 2,
32
+ "fp": 0,
33
+ "fn": 0
34
+ },
35
+ "EMAIL": {
36
+ "precision": 1.0,
37
+ "recall": 1.0,
38
+ "f1": 1.0,
39
+ "tp": 6,
40
+ "fp": 0,
41
+ "fn": 0
42
+ },
43
+ "FIRST_NAME": {
44
+ "precision": 1.0,
45
+ "recall": 1.0,
46
+ "f1": 1.0,
47
+ "tp": 4,
48
+ "fp": 0,
49
+ "fn": 0
50
+ },
51
+ "LAST_NAME": {
52
+ "precision": 1.0,
53
+ "recall": 1.0,
54
+ "f1": 1.0,
55
+ "tp": 4,
56
+ "fp": 0,
57
+ "fn": 0
58
+ },
59
+ "PHONE_NUMBER": {
60
+ "precision": 1.0,
61
+ "recall": 1.0,
62
+ "f1": 1.0,
63
+ "tp": 6,
64
+ "fp": 0,
65
+ "fn": 0
66
+ },
67
+ "POSTCODE": {
68
+ "precision": 1.0,
69
+ "recall": 1.0,
70
+ "f1": 1.0,
71
+ "tp": 2,
72
+ "fp": 0,
73
+ "fn": 0
74
+ },
75
+ "PPSN": {
76
+ "precision": 1.0,
77
+ "recall": 1.0,
78
+ "f1": 1.0,
79
+ "tp": 6,
80
+ "fp": 0,
81
+ "fn": 0
82
+ }
83
+ },
84
+ "release_backend": "full"
85
+ }
eval/full_diffmask_gap_uat_exact_v1.json ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc1",
3
+ "input": "diffmask_gap_uat_exact_v1.jsonl",
4
+ "loader_type": "global_pointer_pt",
5
+ "examples": 16,
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "elapsed_seconds": 0.549252360011451,
9
+ "examples_per_second": 29.130507513279376,
10
+ "overall": {
11
+ "precision": 1.0,
12
+ "recall": 1.0,
13
+ "f1": 1.0,
14
+ "tp": 17,
15
+ "fp": 0,
16
+ "fn": 0
17
+ },
18
+ "by_label": {
19
+ "EMAIL": {
20
+ "precision": 1.0,
21
+ "recall": 1.0,
22
+ "f1": 1.0,
23
+ "tp": 3,
24
+ "fp": 0,
25
+ "fn": 0
26
+ },
27
+ "PHONE_NUMBER": {
28
+ "precision": 1.0,
29
+ "recall": 1.0,
30
+ "f1": 1.0,
31
+ "tp": 6,
32
+ "fp": 0,
33
+ "fn": 0
34
+ },
35
+ "POSTCODE": {
36
+ "precision": 1.0,
37
+ "recall": 1.0,
38
+ "f1": 1.0,
39
+ "tp": 3,
40
+ "fp": 0,
41
+ "fn": 0
42
+ },
43
+ "PPSN": {
44
+ "precision": 1.0,
45
+ "recall": 1.0,
46
+ "f1": 1.0,
47
+ "tp": 5,
48
+ "fp": 0,
49
+ "fn": 0
50
+ }
51
+ },
52
+ "release_backend": "full"
53
+ }
eval/full_globalpointer_context_redteam_v1.json ADDED
@@ -0,0 +1,109 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc9",
3
+ "input": "eval/globalpointer_context_redteam_v1.jsonl",
4
+ "loader_type": "global_pointer_pt",
5
+ "examples": 14,
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "elapsed_seconds": 0.5929923560470343,
9
+ "examples_per_second": 23.609073299571445,
10
+ "overall": {
11
+ "precision": 1.0,
12
+ "recall": 1.0,
13
+ "f1": 1.0,
14
+ "tp": 54,
15
+ "fp": 0,
16
+ "fn": 0
17
+ },
18
+ "by_label": {
19
+ "AGE": {
20
+ "precision": 1.0,
21
+ "recall": 1.0,
22
+ "f1": 1.0,
23
+ "tp": 2,
24
+ "fp": 0,
25
+ "fn": 0
26
+ },
27
+ "CITY": {
28
+ "precision": 1.0,
29
+ "recall": 1.0,
30
+ "f1": 1.0,
31
+ "tp": 8,
32
+ "fp": 0,
33
+ "fn": 0
34
+ },
35
+ "COUNTY": {
36
+ "precision": 1.0,
37
+ "recall": 1.0,
38
+ "f1": 1.0,
39
+ "tp": 10,
40
+ "fp": 0,
41
+ "fn": 0
42
+ },
43
+ "DATE_OF_BIRTH": {
44
+ "precision": 1.0,
45
+ "recall": 1.0,
46
+ "f1": 1.0,
47
+ "tp": 4,
48
+ "fp": 0,
49
+ "fn": 0
50
+ },
51
+ "EMAIL": {
52
+ "precision": 1.0,
53
+ "recall": 1.0,
54
+ "f1": 1.0,
55
+ "tp": 4,
56
+ "fp": 0,
57
+ "fn": 0
58
+ },
59
+ "FIRST_NAME": {
60
+ "precision": 1.0,
61
+ "recall": 1.0,
62
+ "f1": 1.0,
63
+ "tp": 2,
64
+ "fp": 0,
65
+ "fn": 0
66
+ },
67
+ "LAST_NAME": {
68
+ "precision": 1.0,
69
+ "recall": 1.0,
70
+ "f1": 1.0,
71
+ "tp": 2,
72
+ "fp": 0,
73
+ "fn": 0
74
+ },
75
+ "PHONE_NUMBER": {
76
+ "precision": 1.0,
77
+ "recall": 1.0,
78
+ "f1": 1.0,
79
+ "tp": 4,
80
+ "fp": 0,
81
+ "fn": 0
82
+ },
83
+ "POSTCODE": {
84
+ "precision": 1.0,
85
+ "recall": 1.0,
86
+ "f1": 1.0,
87
+ "tp": 8,
88
+ "fp": 0,
89
+ "fn": 0
90
+ },
91
+ "PPSN": {
92
+ "precision": 1.0,
93
+ "recall": 1.0,
94
+ "f1": 1.0,
95
+ "tp": 2,
96
+ "fp": 0,
97
+ "fn": 0
98
+ },
99
+ "STREET_ADDRESS": {
100
+ "precision": 1.0,
101
+ "recall": 1.0,
102
+ "f1": 1.0,
103
+ "tp": 8,
104
+ "fp": 0,
105
+ "fn": 0
106
+ }
107
+ },
108
+ "backend": "full"
109
+ }
eval/full_globalpointer_context_redteam_v2.json ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc9",
3
+ "input": "eval/globalpointer_context_redteam_v2.jsonl",
4
+ "loader_type": "global_pointer_pt",
5
+ "examples": 6,
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "elapsed_seconds": 0.47106689505744725,
9
+ "examples_per_second": 12.737044489760402,
10
+ "overall": {
11
+ "precision": 1.0,
12
+ "recall": 1.0,
13
+ "f1": 1.0,
14
+ "tp": 13,
15
+ "fp": 0,
16
+ "fn": 0
17
+ },
18
+ "by_label": {
19
+ "CITY": {
20
+ "precision": 1.0,
21
+ "recall": 1.0,
22
+ "f1": 1.0,
23
+ "tp": 4,
24
+ "fp": 0,
25
+ "fn": 0
26
+ },
27
+ "COUNTY": {
28
+ "precision": 1.0,
29
+ "recall": 1.0,
30
+ "f1": 1.0,
31
+ "tp": 1,
32
+ "fp": 0,
33
+ "fn": 0
34
+ },
35
+ "DATE_OF_BIRTH": {
36
+ "precision": 1.0,
37
+ "recall": 1.0,
38
+ "f1": 1.0,
39
+ "tp": 1,
40
+ "fp": 0,
41
+ "fn": 0
42
+ },
43
+ "PHONE_NUMBER": {
44
+ "precision": 1.0,
45
+ "recall": 1.0,
46
+ "f1": 1.0,
47
+ "tp": 2,
48
+ "fp": 0,
49
+ "fn": 0
50
+ },
51
+ "POSTCODE": {
52
+ "precision": 1.0,
53
+ "recall": 1.0,
54
+ "f1": 1.0,
55
+ "tp": 3,
56
+ "fp": 0,
57
+ "fn": 0
58
+ },
59
+ "STREET_ADDRESS": {
60
+ "precision": 1.0,
61
+ "recall": 1.0,
62
+ "f1": 1.0,
63
+ "tp": 2,
64
+ "fp": 0,
65
+ "fn": 0
66
+ }
67
+ },
68
+ "backend": "full"
69
+ }
eval/full_globalpointer_context_redteam_v3.json ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc10",
3
+ "input": "eval/globalpointer_context_redteam_v3.jsonl",
4
+ "loader_type": "global_pointer_pt",
5
+ "examples": 12,
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "elapsed_seconds": 0.6711023099487647,
9
+ "examples_per_second": 17.88102919943181,
10
+ "overall": {
11
+ "precision": 1.0,
12
+ "recall": 1.0,
13
+ "f1": 1.0,
14
+ "tp": 22,
15
+ "fp": 0,
16
+ "fn": 0
17
+ },
18
+ "by_label": {
19
+ "AGE": {
20
+ "precision": 1.0,
21
+ "recall": 1.0,
22
+ "f1": 1.0,
23
+ "tp": 3,
24
+ "fp": 0,
25
+ "fn": 0
26
+ },
27
+ "CITY": {
28
+ "precision": 1.0,
29
+ "recall": 1.0,
30
+ "f1": 1.0,
31
+ "tp": 7,
32
+ "fp": 0,
33
+ "fn": 0
34
+ },
35
+ "COUNTY": {
36
+ "precision": 1.0,
37
+ "recall": 1.0,
38
+ "f1": 1.0,
39
+ "tp": 1,
40
+ "fp": 0,
41
+ "fn": 0
42
+ },
43
+ "DATE_OF_BIRTH": {
44
+ "precision": 1.0,
45
+ "recall": 1.0,
46
+ "f1": 1.0,
47
+ "tp": 3,
48
+ "fp": 0,
49
+ "fn": 0
50
+ },
51
+ "PHONE_NUMBER": {
52
+ "precision": 1.0,
53
+ "recall": 1.0,
54
+ "f1": 1.0,
55
+ "tp": 3,
56
+ "fp": 0,
57
+ "fn": 0
58
+ },
59
+ "POSTCODE": {
60
+ "precision": 1.0,
61
+ "recall": 1.0,
62
+ "f1": 1.0,
63
+ "tp": 3,
64
+ "fp": 0,
65
+ "fn": 0
66
+ },
67
+ "STREET_ADDRESS": {
68
+ "precision": 1.0,
69
+ "recall": 1.0,
70
+ "f1": 1.0,
71
+ "tp": 2,
72
+ "fp": 0,
73
+ "fn": 0
74
+ }
75
+ },
76
+ "backend": "full"
77
+ }
eval/full_globalpointer_context_redteam_v4.json ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc10",
3
+ "input": "eval/globalpointer_context_redteam_v4.jsonl",
4
+ "loader_type": "global_pointer_pt",
5
+ "examples": 21,
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "elapsed_seconds": 0.6886257050791755,
9
+ "examples_per_second": 30.495521507704247,
10
+ "overall": {
11
+ "precision": 1.0,
12
+ "recall": 1.0,
13
+ "f1": 1.0,
14
+ "tp": 43,
15
+ "fp": 0,
16
+ "fn": 0
17
+ },
18
+ "by_label": {
19
+ "AGE": {
20
+ "precision": 1.0,
21
+ "recall": 1.0,
22
+ "f1": 1.0,
23
+ "tp": 3,
24
+ "fp": 0,
25
+ "fn": 0
26
+ },
27
+ "CITY": {
28
+ "precision": 1.0,
29
+ "recall": 1.0,
30
+ "f1": 1.0,
31
+ "tp": 10,
32
+ "fp": 0,
33
+ "fn": 0
34
+ },
35
+ "COUNTY": {
36
+ "precision": 1.0,
37
+ "recall": 1.0,
38
+ "f1": 1.0,
39
+ "tp": 1,
40
+ "fp": 0,
41
+ "fn": 0
42
+ },
43
+ "DATE_OF_BIRTH": {
44
+ "precision": 1.0,
45
+ "recall": 1.0,
46
+ "f1": 1.0,
47
+ "tp": 6,
48
+ "fp": 0,
49
+ "fn": 0
50
+ },
51
+ "FIRST_NAME": {
52
+ "precision": 1.0,
53
+ "recall": 1.0,
54
+ "f1": 1.0,
55
+ "tp": 2,
56
+ "fp": 0,
57
+ "fn": 0
58
+ },
59
+ "LAST_NAME": {
60
+ "precision": 1.0,
61
+ "recall": 1.0,
62
+ "f1": 1.0,
63
+ "tp": 2,
64
+ "fp": 0,
65
+ "fn": 0
66
+ },
67
+ "PHONE_NUMBER": {
68
+ "precision": 1.0,
69
+ "recall": 1.0,
70
+ "f1": 1.0,
71
+ "tp": 6,
72
+ "fp": 0,
73
+ "fn": 0
74
+ },
75
+ "POSTCODE": {
76
+ "precision": 1.0,
77
+ "recall": 1.0,
78
+ "f1": 1.0,
79
+ "tp": 6,
80
+ "fp": 0,
81
+ "fn": 0
82
+ },
83
+ "PPSN": {
84
+ "precision": 1.0,
85
+ "recall": 1.0,
86
+ "f1": 1.0,
87
+ "tp": 2,
88
+ "fp": 0,
89
+ "fn": 0
90
+ },
91
+ "STREET_ADDRESS": {
92
+ "precision": 1.0,
93
+ "recall": 1.0,
94
+ "f1": 1.0,
95
+ "tp": 5,
96
+ "fp": 0,
97
+ "fn": 0
98
+ }
99
+ },
100
+ "backend": "full"
101
+ }
eval/full_globalpointer_demographic_patch_v2_test.json ADDED
@@ -0,0 +1,109 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc9",
3
+ "input": "eval/globalpointer_demographic_patch_v2_test.jsonl",
4
+ "loader_type": "global_pointer_pt",
5
+ "examples": 600,
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "elapsed_seconds": 14.737149069085717,
9
+ "examples_per_second": 40.71343766608338,
10
+ "overall": {
11
+ "precision": 1.0,
12
+ "recall": 1.0,
13
+ "f1": 1.0,
14
+ "tp": 2470,
15
+ "fp": 0,
16
+ "fn": 0
17
+ },
18
+ "by_label": {
19
+ "AGE": {
20
+ "precision": 1.0,
21
+ "recall": 1.0,
22
+ "f1": 1.0,
23
+ "tp": 287,
24
+ "fp": 0,
25
+ "fn": 0
26
+ },
27
+ "CITY": {
28
+ "precision": 1.0,
29
+ "recall": 1.0,
30
+ "f1": 1.0,
31
+ "tp": 286,
32
+ "fp": 0,
33
+ "fn": 0
34
+ },
35
+ "COUNTY": {
36
+ "precision": 1.0,
37
+ "recall": 1.0,
38
+ "f1": 1.0,
39
+ "tp": 286,
40
+ "fp": 0,
41
+ "fn": 0
42
+ },
43
+ "DATE_OF_BIRTH": {
44
+ "precision": 1.0,
45
+ "recall": 1.0,
46
+ "f1": 1.0,
47
+ "tp": 304,
48
+ "fp": 0,
49
+ "fn": 0
50
+ },
51
+ "EMAIL": {
52
+ "precision": 1.0,
53
+ "recall": 1.0,
54
+ "f1": 1.0,
55
+ "tp": 85,
56
+ "fp": 0,
57
+ "fn": 0
58
+ },
59
+ "FIRST_NAME": {
60
+ "precision": 1.0,
61
+ "recall": 1.0,
62
+ "f1": 1.0,
63
+ "tp": 194,
64
+ "fp": 0,
65
+ "fn": 0
66
+ },
67
+ "LAST_NAME": {
68
+ "precision": 1.0,
69
+ "recall": 1.0,
70
+ "f1": 1.0,
71
+ "tp": 194,
72
+ "fp": 0,
73
+ "fn": 0
74
+ },
75
+ "PHONE_NUMBER": {
76
+ "precision": 1.0,
77
+ "recall": 1.0,
78
+ "f1": 1.0,
79
+ "tp": 177,
80
+ "fp": 0,
81
+ "fn": 0
82
+ },
83
+ "POSTCODE": {
84
+ "precision": 1.0,
85
+ "recall": 1.0,
86
+ "f1": 1.0,
87
+ "tp": 286,
88
+ "fp": 0,
89
+ "fn": 0
90
+ },
91
+ "PPSN": {
92
+ "precision": 1.0,
93
+ "recall": 1.0,
94
+ "f1": 1.0,
95
+ "tp": 85,
96
+ "fp": 0,
97
+ "fn": 0
98
+ },
99
+ "STREET_ADDRESS": {
100
+ "precision": 1.0,
101
+ "recall": 1.0,
102
+ "f1": 1.0,
103
+ "tp": 286,
104
+ "fp": 0,
105
+ "fn": 0
106
+ }
107
+ },
108
+ "backend": "full"
109
+ }
eval/full_globalpointer_location_coverage_v1.json ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc9",
3
+ "input": "eval/globalpointer_location_coverage_v1.jsonl",
4
+ "loader_type": "global_pointer_pt",
5
+ "examples": 18,
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "elapsed_seconds": 0.6559180339099839,
9
+ "examples_per_second": 27.442453278347067,
10
+ "overall": {
11
+ "precision": 1.0,
12
+ "recall": 1.0,
13
+ "f1": 1.0,
14
+ "tp": 56,
15
+ "fp": 0,
16
+ "fn": 0
17
+ },
18
+ "by_label": {
19
+ "CITY": {
20
+ "precision": 1.0,
21
+ "recall": 1.0,
22
+ "f1": 1.0,
23
+ "tp": 14,
24
+ "fp": 0,
25
+ "fn": 0
26
+ },
27
+ "COUNTY": {
28
+ "precision": 1.0,
29
+ "recall": 1.0,
30
+ "f1": 1.0,
31
+ "tp": 16,
32
+ "fp": 0,
33
+ "fn": 0
34
+ },
35
+ "PHONE_NUMBER": {
36
+ "precision": 1.0,
37
+ "recall": 1.0,
38
+ "f1": 1.0,
39
+ "tp": 2,
40
+ "fp": 0,
41
+ "fn": 0
42
+ },
43
+ "POSTCODE": {
44
+ "precision": 1.0,
45
+ "recall": 1.0,
46
+ "f1": 1.0,
47
+ "tp": 12,
48
+ "fp": 0,
49
+ "fn": 0
50
+ },
51
+ "STREET_ADDRESS": {
52
+ "precision": 1.0,
53
+ "recall": 1.0,
54
+ "f1": 1.0,
55
+ "tp": 12,
56
+ "fp": 0,
57
+ "fn": 0
58
+ }
59
+ },
60
+ "backend": "full"
61
+ }
eval/full_globalpointer_location_coverage_v2.json ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc9",
3
+ "input": "eval/globalpointer_location_coverage_v2.jsonl",
4
+ "loader_type": "global_pointer_pt",
5
+ "examples": 24,
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "elapsed_seconds": 0.9851676529506221,
9
+ "examples_per_second": 24.3613357869789,
10
+ "overall": {
11
+ "precision": 1.0,
12
+ "recall": 1.0,
13
+ "f1": 1.0,
14
+ "tp": 68,
15
+ "fp": 0,
16
+ "fn": 0
17
+ },
18
+ "by_label": {
19
+ "CITY": {
20
+ "precision": 1.0,
21
+ "recall": 1.0,
22
+ "f1": 1.0,
23
+ "tp": 20,
24
+ "fp": 0,
25
+ "fn": 0
26
+ },
27
+ "COUNTY": {
28
+ "precision": 1.0,
29
+ "recall": 1.0,
30
+ "f1": 1.0,
31
+ "tp": 22,
32
+ "fp": 0,
33
+ "fn": 0
34
+ },
35
+ "PHONE_NUMBER": {
36
+ "precision": 1.0,
37
+ "recall": 1.0,
38
+ "f1": 1.0,
39
+ "tp": 2,
40
+ "fp": 0,
41
+ "fn": 0
42
+ },
43
+ "POSTCODE": {
44
+ "precision": 1.0,
45
+ "recall": 1.0,
46
+ "f1": 1.0,
47
+ "tp": 12,
48
+ "fp": 0,
49
+ "fn": 0
50
+ },
51
+ "STREET_ADDRESS": {
52
+ "precision": 1.0,
53
+ "recall": 1.0,
54
+ "f1": 1.0,
55
+ "tp": 12,
56
+ "fp": 0,
57
+ "fn": 0
58
+ }
59
+ },
60
+ "backend": "full"
61
+ }
eval/full_globalpointer_location_coverage_v3.json ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc9",
3
+ "input": "eval/globalpointer_location_coverage_v3.jsonl",
4
+ "loader_type": "global_pointer_pt",
5
+ "examples": 30,
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "elapsed_seconds": 0.8463578999508172,
9
+ "examples_per_second": 35.4459974931921,
10
+ "overall": {
11
+ "precision": 1.0,
12
+ "recall": 1.0,
13
+ "f1": 1.0,
14
+ "tp": 82,
15
+ "fp": 0,
16
+ "fn": 0
17
+ },
18
+ "by_label": {
19
+ "CITY": {
20
+ "precision": 1.0,
21
+ "recall": 1.0,
22
+ "f1": 1.0,
23
+ "tp": 26,
24
+ "fp": 0,
25
+ "fn": 0
26
+ },
27
+ "COUNTY": {
28
+ "precision": 1.0,
29
+ "recall": 1.0,
30
+ "f1": 1.0,
31
+ "tp": 28,
32
+ "fp": 0,
33
+ "fn": 0
34
+ },
35
+ "PHONE_NUMBER": {
36
+ "precision": 1.0,
37
+ "recall": 1.0,
38
+ "f1": 1.0,
39
+ "tp": 2,
40
+ "fp": 0,
41
+ "fn": 0
42
+ },
43
+ "POSTCODE": {
44
+ "precision": 1.0,
45
+ "recall": 1.0,
46
+ "f1": 1.0,
47
+ "tp": 13,
48
+ "fp": 0,
49
+ "fn": 0
50
+ },
51
+ "STREET_ADDRESS": {
52
+ "precision": 1.0,
53
+ "recall": 1.0,
54
+ "f1": 1.0,
55
+ "tp": 13,
56
+ "fp": 0,
57
+ "fn": 0
58
+ }
59
+ },
60
+ "backend": "full"
61
+ }
eval/full_irish_core_pii_v1.json ADDED
@@ -0,0 +1,109 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc10",
3
+ "input": "eval/irish_core_pii_v1.jsonl",
4
+ "loader_type": "global_pointer_pt",
5
+ "examples": 37,
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "elapsed_seconds": 1.1811906369403005,
9
+ "examples_per_second": 31.324325509253125,
10
+ "overall": {
11
+ "precision": 1.0,
12
+ "recall": 1.0,
13
+ "f1": 1.0,
14
+ "tp": 76,
15
+ "fp": 0,
16
+ "fn": 0
17
+ },
18
+ "by_label": {
19
+ "ACCOUNT_NUMBER": {
20
+ "precision": 1.0,
21
+ "recall": 1.0,
22
+ "f1": 1.0,
23
+ "tp": 3,
24
+ "fp": 0,
25
+ "fn": 0
26
+ },
27
+ "BANK_ROUTING_NUMBER": {
28
+ "precision": 1.0,
29
+ "recall": 1.0,
30
+ "f1": 1.0,
31
+ "tp": 1,
32
+ "fp": 0,
33
+ "fn": 0
34
+ },
35
+ "CREDIT_DEBIT_CARD": {
36
+ "precision": 1.0,
37
+ "recall": 1.0,
38
+ "f1": 1.0,
39
+ "tp": 2,
40
+ "fp": 0,
41
+ "fn": 0
42
+ },
43
+ "EMAIL": {
44
+ "precision": 1.0,
45
+ "recall": 1.0,
46
+ "f1": 1.0,
47
+ "tp": 6,
48
+ "fp": 0,
49
+ "fn": 0
50
+ },
51
+ "FIRST_NAME": {
52
+ "precision": 1.0,
53
+ "recall": 1.0,
54
+ "f1": 1.0,
55
+ "tp": 19,
56
+ "fp": 0,
57
+ "fn": 0
58
+ },
59
+ "LAST_NAME": {
60
+ "precision": 1.0,
61
+ "recall": 1.0,
62
+ "f1": 1.0,
63
+ "tp": 19,
64
+ "fp": 0,
65
+ "fn": 0
66
+ },
67
+ "PASSPORT_NUMBER": {
68
+ "precision": 1.0,
69
+ "recall": 1.0,
70
+ "f1": 1.0,
71
+ "tp": 2,
72
+ "fp": 0,
73
+ "fn": 0
74
+ },
75
+ "PHONE_NUMBER": {
76
+ "precision": 1.0,
77
+ "recall": 1.0,
78
+ "f1": 1.0,
79
+ "tp": 12,
80
+ "fp": 0,
81
+ "fn": 0
82
+ },
83
+ "POSTCODE": {
84
+ "precision": 1.0,
85
+ "recall": 1.0,
86
+ "f1": 1.0,
87
+ "tp": 4,
88
+ "fp": 0,
89
+ "fn": 0
90
+ },
91
+ "PPSN": {
92
+ "precision": 1.0,
93
+ "recall": 1.0,
94
+ "f1": 1.0,
95
+ "tp": 6,
96
+ "fp": 0,
97
+ "fn": 0
98
+ },
99
+ "SWIFT_BIC": {
100
+ "precision": 1.0,
101
+ "recall": 1.0,
102
+ "f1": 1.0,
103
+ "tp": 2,
104
+ "fp": 0,
105
+ "fn": 0
106
+ }
107
+ },
108
+ "backend": "full"
109
+ }
eval/full_irish_dllm_hardening_exact_v1.json ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc1",
3
+ "input": "irish_dllm_hardening_exact_v1.jsonl",
4
+ "loader_type": "global_pointer_pt",
5
+ "examples": 14,
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "elapsed_seconds": 0.5248716080095619,
9
+ "examples_per_second": 26.673189759856385,
10
+ "overall": {
11
+ "precision": 1.0,
12
+ "recall": 1.0,
13
+ "f1": 1.0,
14
+ "tp": 20,
15
+ "fp": 0,
16
+ "fn": 0
17
+ },
18
+ "by_label": {
19
+ "ACCOUNT_NUMBER": {
20
+ "precision": 1.0,
21
+ "recall": 1.0,
22
+ "f1": 1.0,
23
+ "tp": 1,
24
+ "fp": 0,
25
+ "fn": 0
26
+ },
27
+ "BANK_ROUTING_NUMBER": {
28
+ "precision": 1.0,
29
+ "recall": 1.0,
30
+ "f1": 1.0,
31
+ "tp": 2,
32
+ "fp": 0,
33
+ "fn": 0
34
+ },
35
+ "CREDIT_DEBIT_CARD": {
36
+ "precision": 1.0,
37
+ "recall": 1.0,
38
+ "f1": 1.0,
39
+ "tp": 2,
40
+ "fp": 0,
41
+ "fn": 0
42
+ },
43
+ "EMAIL": {
44
+ "precision": 1.0,
45
+ "recall": 1.0,
46
+ "f1": 1.0,
47
+ "tp": 2,
48
+ "fp": 0,
49
+ "fn": 0
50
+ },
51
+ "FIRST_NAME": {
52
+ "precision": 1.0,
53
+ "recall": 1.0,
54
+ "f1": 1.0,
55
+ "tp": 1,
56
+ "fp": 0,
57
+ "fn": 0
58
+ },
59
+ "LAST_NAME": {
60
+ "precision": 1.0,
61
+ "recall": 1.0,
62
+ "f1": 1.0,
63
+ "tp": 1,
64
+ "fp": 0,
65
+ "fn": 0
66
+ },
67
+ "PHONE_NUMBER": {
68
+ "precision": 1.0,
69
+ "recall": 1.0,
70
+ "f1": 1.0,
71
+ "tp": 2,
72
+ "fp": 0,
73
+ "fn": 0
74
+ },
75
+ "POSTCODE": {
76
+ "precision": 1.0,
77
+ "recall": 1.0,
78
+ "f1": 1.0,
79
+ "tp": 3,
80
+ "fp": 0,
81
+ "fn": 0
82
+ },
83
+ "PPSN": {
84
+ "precision": 1.0,
85
+ "recall": 1.0,
86
+ "f1": 1.0,
87
+ "tp": 3,
88
+ "fp": 0,
89
+ "fn": 0
90
+ },
91
+ "SWIFT_BIC": {
92
+ "precision": 1.0,
93
+ "recall": 1.0,
94
+ "f1": 1.0,
95
+ "tp": 3,
96
+ "fp": 0,
97
+ "fn": 0
98
+ }
99
+ },
100
+ "release_backend": "full"
101
+ }
eval/full_irish_extended_pii_v1.json ADDED
@@ -0,0 +1,109 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc9",
3
+ "input": "eval/irish_extended_pii_v1.jsonl",
4
+ "loader_type": "global_pointer_pt",
5
+ "examples": 14,
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "elapsed_seconds": 0.668206871021539,
9
+ "examples_per_second": 20.951595392302877,
10
+ "overall": {
11
+ "precision": 1.0,
12
+ "recall": 1.0,
13
+ "f1": 1.0,
14
+ "tp": 50,
15
+ "fp": 0,
16
+ "fn": 0
17
+ },
18
+ "by_label": {
19
+ "AGE": {
20
+ "precision": 1.0,
21
+ "recall": 1.0,
22
+ "f1": 1.0,
23
+ "tp": 5,
24
+ "fp": 0,
25
+ "fn": 0
26
+ },
27
+ "CITY": {
28
+ "precision": 1.0,
29
+ "recall": 1.0,
30
+ "f1": 1.0,
31
+ "tp": 8,
32
+ "fp": 0,
33
+ "fn": 0
34
+ },
35
+ "COUNTY": {
36
+ "precision": 1.0,
37
+ "recall": 1.0,
38
+ "f1": 1.0,
39
+ "tp": 6,
40
+ "fp": 0,
41
+ "fn": 0
42
+ },
43
+ "DATE_OF_BIRTH": {
44
+ "precision": 1.0,
45
+ "recall": 1.0,
46
+ "f1": 1.0,
47
+ "tp": 6,
48
+ "fp": 0,
49
+ "fn": 0
50
+ },
51
+ "EMAIL": {
52
+ "precision": 1.0,
53
+ "recall": 1.0,
54
+ "f1": 1.0,
55
+ "tp": 1,
56
+ "fp": 0,
57
+ "fn": 0
58
+ },
59
+ "FIRST_NAME": {
60
+ "precision": 1.0,
61
+ "recall": 1.0,
62
+ "f1": 1.0,
63
+ "tp": 2,
64
+ "fp": 0,
65
+ "fn": 0
66
+ },
67
+ "LAST_NAME": {
68
+ "precision": 1.0,
69
+ "recall": 1.0,
70
+ "f1": 1.0,
71
+ "tp": 2,
72
+ "fp": 0,
73
+ "fn": 0
74
+ },
75
+ "PHONE_NUMBER": {
76
+ "precision": 1.0,
77
+ "recall": 1.0,
78
+ "f1": 1.0,
79
+ "tp": 2,
80
+ "fp": 0,
81
+ "fn": 0
82
+ },
83
+ "POSTCODE": {
84
+ "precision": 1.0,
85
+ "recall": 1.0,
86
+ "f1": 1.0,
87
+ "tp": 8,
88
+ "fp": 0,
89
+ "fn": 0
90
+ },
91
+ "PPSN": {
92
+ "precision": 1.0,
93
+ "recall": 1.0,
94
+ "f1": 1.0,
95
+ "tp": 2,
96
+ "fp": 0,
97
+ "fn": 0
98
+ },
99
+ "STREET_ADDRESS": {
100
+ "precision": 1.0,
101
+ "recall": 1.0,
102
+ "f1": 1.0,
103
+ "tp": 8,
104
+ "fp": 0,
105
+ "fn": 0
106
+ }
107
+ },
108
+ "backend": "full"
109
+ }
eval/full_irish_gov_chatbot_gap_holdout_v1.json ADDED
@@ -0,0 +1,258 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc1",
3
+ "family": "globalpointer",
4
+ "backend": "pt",
5
+ "input": "irish_gov_chatbot_gap_holdout_v1.jsonl",
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "overall": {
9
+ "precision": 1.0,
10
+ "recall": 1.0,
11
+ "f1": 1.0,
12
+ "tp": 413,
13
+ "fp": 0,
14
+ "fn": 0
15
+ },
16
+ "exact": {
17
+ "precision": 0.9878934624697336,
18
+ "recall": 0.9878934624697336,
19
+ "f1": 0.9878934624697336,
20
+ "tp": 408,
21
+ "fp": 5,
22
+ "fn": 5
23
+ },
24
+ "by_label": {
25
+ "ACCOUNT_NUMBER": {
26
+ "precision": 1.0,
27
+ "recall": 1.0,
28
+ "f1": 1.0,
29
+ "tp": 16,
30
+ "fp": 0,
31
+ "fn": 0
32
+ },
33
+ "BANK_ROUTING_NUMBER": {
34
+ "precision": 1.0,
35
+ "recall": 1.0,
36
+ "f1": 1.0,
37
+ "tp": 23,
38
+ "fp": 0,
39
+ "fn": 0
40
+ },
41
+ "CREDIT_DEBIT_CARD": {
42
+ "precision": 1.0,
43
+ "recall": 1.0,
44
+ "f1": 1.0,
45
+ "tp": 6,
46
+ "fp": 0,
47
+ "fn": 0
48
+ },
49
+ "EMAIL": {
50
+ "precision": 1.0,
51
+ "recall": 1.0,
52
+ "f1": 1.0,
53
+ "tp": 50,
54
+ "fp": 0,
55
+ "fn": 0
56
+ },
57
+ "FIRST_NAME": {
58
+ "precision": 1.0,
59
+ "recall": 1.0,
60
+ "f1": 1.0,
61
+ "tp": 70,
62
+ "fp": 0,
63
+ "fn": 0
64
+ },
65
+ "LAST_NAME": {
66
+ "precision": 1.0,
67
+ "recall": 1.0,
68
+ "f1": 1.0,
69
+ "tp": 70,
70
+ "fp": 0,
71
+ "fn": 0
72
+ },
73
+ "PHONE_NUMBER": {
74
+ "precision": 1.0,
75
+ "recall": 1.0,
76
+ "f1": 1.0,
77
+ "tp": 72,
78
+ "fp": 0,
79
+ "fn": 0
80
+ },
81
+ "POSTCODE": {
82
+ "precision": 1.0,
83
+ "recall": 1.0,
84
+ "f1": 1.0,
85
+ "tp": 18,
86
+ "fp": 0,
87
+ "fn": 0
88
+ },
89
+ "PPSN": {
90
+ "precision": 1.0,
91
+ "recall": 1.0,
92
+ "f1": 1.0,
93
+ "tp": 72,
94
+ "fp": 0,
95
+ "fn": 0
96
+ },
97
+ "SWIFT_BIC": {
98
+ "precision": 1.0,
99
+ "recall": 1.0,
100
+ "f1": 1.0,
101
+ "tp": 16,
102
+ "fp": 0,
103
+ "fn": 0
104
+ }
105
+ },
106
+ "by_language": {
107
+ "en": {
108
+ "precision": 1.0,
109
+ "recall": 1.0,
110
+ "f1": 1.0,
111
+ "tp": 230,
112
+ "fp": 0,
113
+ "fn": 0
114
+ },
115
+ "ga": {
116
+ "precision": 1.0,
117
+ "recall": 1.0,
118
+ "f1": 1.0,
119
+ "tp": 183,
120
+ "fp": 0,
121
+ "fn": 0
122
+ }
123
+ },
124
+ "by_role": {
125
+ "assistant": {
126
+ "precision": 1.0,
127
+ "recall": 1.0,
128
+ "f1": 1.0,
129
+ "tp": 72,
130
+ "fp": 0,
131
+ "fn": 0
132
+ },
133
+ "mixed": {
134
+ "precision": 0.0,
135
+ "recall": 0.0,
136
+ "f1": 0.0,
137
+ "tp": 0,
138
+ "fp": 0,
139
+ "fn": 0
140
+ },
141
+ "user": {
142
+ "precision": 1.0,
143
+ "recall": 1.0,
144
+ "f1": 1.0,
145
+ "tp": 341,
146
+ "fp": 0,
147
+ "fn": 0
148
+ }
149
+ },
150
+ "by_source_type": {
151
+ "assistant_contact_echo_en": {
152
+ "precision": 1.0,
153
+ "recall": 1.0,
154
+ "f1": 1.0,
155
+ "tp": 32,
156
+ "fp": 0,
157
+ "fn": 0
158
+ },
159
+ "assistant_contact_echo_ga": {
160
+ "precision": 1.0,
161
+ "recall": 1.0,
162
+ "f1": 1.0,
163
+ "tp": 40,
164
+ "fp": 0,
165
+ "fn": 0
166
+ },
167
+ "negative_en": {
168
+ "precision": 0.0,
169
+ "recall": 0.0,
170
+ "f1": 0.0,
171
+ "tp": 0,
172
+ "fp": 0,
173
+ "fn": 0
174
+ },
175
+ "negative_ga": {
176
+ "precision": 0.0,
177
+ "recall": 0.0,
178
+ "f1": 0.0,
179
+ "tp": 0,
180
+ "fp": 0,
181
+ "fn": 0
182
+ },
183
+ "user_card_email_en": {
184
+ "precision": 1.0,
185
+ "recall": 1.0,
186
+ "f1": 1.0,
187
+ "tp": 12,
188
+ "fp": 0,
189
+ "fn": 0
190
+ },
191
+ "user_name_email_ppsn_phone_en": {
192
+ "precision": 1.0,
193
+ "recall": 1.0,
194
+ "f1": 1.0,
195
+ "tp": 80,
196
+ "fp": 0,
197
+ "fn": 0
198
+ },
199
+ "user_name_email_ppsn_phone_ga": {
200
+ "precision": 1.0,
201
+ "recall": 1.0,
202
+ "f1": 1.0,
203
+ "tp": 50,
204
+ "fp": 0,
205
+ "fn": 0
206
+ },
207
+ "user_name_ppsn_phone_en": {
208
+ "precision": 1.0,
209
+ "recall": 1.0,
210
+ "f1": 1.0,
211
+ "tp": 56,
212
+ "fp": 0,
213
+ "fn": 0
214
+ },
215
+ "user_name_ppsn_phone_ga": {
216
+ "precision": 1.0,
217
+ "recall": 1.0,
218
+ "f1": 1.0,
219
+ "tp": 56,
220
+ "fp": 0,
221
+ "fn": 0
222
+ },
223
+ "user_payment_name_en": {
224
+ "precision": 1.0,
225
+ "recall": 1.0,
226
+ "f1": 1.0,
227
+ "tp": 32,
228
+ "fp": 0,
229
+ "fn": 0
230
+ },
231
+ "user_payment_name_ga": {
232
+ "precision": 1.0,
233
+ "recall": 1.0,
234
+ "f1": 1.0,
235
+ "tp": 32,
236
+ "fp": 0,
237
+ "fn": 0
238
+ },
239
+ "user_sort_code_en": {
240
+ "precision": 1.0,
241
+ "recall": 1.0,
242
+ "f1": 1.0,
243
+ "tp": 18,
244
+ "fp": 0,
245
+ "fn": 0
246
+ },
247
+ "user_sort_code_ga": {
248
+ "precision": 1.0,
249
+ "recall": 1.0,
250
+ "f1": 1.0,
251
+ "tp": 5,
252
+ "fp": 0,
253
+ "fn": 0
254
+ }
255
+ },
256
+ "failure_count": 0,
257
+ "failures": []
258
+ }
eval/full_irish_gov_chatbot_gap_holdout_v2.json ADDED
@@ -0,0 +1,93 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc9",
3
+ "input": "eval/irish_gov_chatbot_gap_holdout_v2.jsonl",
4
+ "loader_type": "global_pointer_pt",
5
+ "examples": 160,
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "elapsed_seconds": 3.1072428149636835,
9
+ "examples_per_second": 51.49259633958476,
10
+ "overall": {
11
+ "precision": 1.0,
12
+ "recall": 1.0,
13
+ "f1": 1.0,
14
+ "tp": 652,
15
+ "fp": 0,
16
+ "fn": 0
17
+ },
18
+ "by_label": {
19
+ "ACCOUNT_NUMBER": {
20
+ "precision": 1.0,
21
+ "recall": 1.0,
22
+ "f1": 1.0,
23
+ "tp": 38,
24
+ "fp": 0,
25
+ "fn": 0
26
+ },
27
+ "EMAIL": {
28
+ "precision": 1.0,
29
+ "recall": 1.0,
30
+ "f1": 1.0,
31
+ "tp": 104,
32
+ "fp": 0,
33
+ "fn": 0
34
+ },
35
+ "FIRST_NAME": {
36
+ "precision": 1.0,
37
+ "recall": 1.0,
38
+ "f1": 1.0,
39
+ "tp": 68,
40
+ "fp": 0,
41
+ "fn": 0
42
+ },
43
+ "LAST_NAME": {
44
+ "precision": 1.0,
45
+ "recall": 1.0,
46
+ "f1": 1.0,
47
+ "tp": 68,
48
+ "fp": 0,
49
+ "fn": 0
50
+ },
51
+ "PASSPORT_NUMBER": {
52
+ "precision": 1.0,
53
+ "recall": 1.0,
54
+ "f1": 1.0,
55
+ "tp": 33,
56
+ "fp": 0,
57
+ "fn": 0
58
+ },
59
+ "PHONE_NUMBER": {
60
+ "precision": 1.0,
61
+ "recall": 1.0,
62
+ "f1": 1.0,
63
+ "tp": 101,
64
+ "fp": 0,
65
+ "fn": 0
66
+ },
67
+ "POSTCODE": {
68
+ "precision": 1.0,
69
+ "recall": 1.0,
70
+ "f1": 1.0,
71
+ "tp": 101,
72
+ "fp": 0,
73
+ "fn": 0
74
+ },
75
+ "PPSN": {
76
+ "precision": 1.0,
77
+ "recall": 1.0,
78
+ "f1": 1.0,
79
+ "tp": 101,
80
+ "fp": 0,
81
+ "fn": 0
82
+ },
83
+ "SWIFT_BIC": {
84
+ "precision": 1.0,
85
+ "recall": 1.0,
86
+ "f1": 1.0,
87
+ "tp": 38,
88
+ "fp": 0,
89
+ "fn": 0
90
+ }
91
+ },
92
+ "backend": "full"
93
+ }
eval/full_irish_gov_chatbot_redteam_assistant_v2.json ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "models/irishcore-globalpointer-135m-b01-extendedv1-e025",
3
+ "input": "eval/irish_gov_chatbot_redteam_assistant_v2.jsonl",
4
+ "loader_type": "global_pointer_pt",
5
+ "examples": 9,
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "elapsed_seconds": 0.16110201692208648,
9
+ "examples_per_second": 55.86522237243408,
10
+ "overall": {
11
+ "precision": 0.9375,
12
+ "recall": 1.0,
13
+ "f1": 0.967741935483871,
14
+ "tp": 30,
15
+ "fp": 2,
16
+ "fn": 0
17
+ },
18
+ "by_label": {
19
+ "ACCOUNT_NUMBER": {
20
+ "precision": 1.0,
21
+ "recall": 1.0,
22
+ "f1": 1.0,
23
+ "tp": 2,
24
+ "fp": 0,
25
+ "fn": 0
26
+ },
27
+ "EMAIL": {
28
+ "precision": 1.0,
29
+ "recall": 1.0,
30
+ "f1": 1.0,
31
+ "tp": 6,
32
+ "fp": 0,
33
+ "fn": 0
34
+ },
35
+ "FIRST_NAME": {
36
+ "precision": 1.0,
37
+ "recall": 1.0,
38
+ "f1": 1.0,
39
+ "tp": 2,
40
+ "fp": 0,
41
+ "fn": 0
42
+ },
43
+ "LAST_NAME": {
44
+ "precision": 1.0,
45
+ "recall": 1.0,
46
+ "f1": 1.0,
47
+ "tp": 2,
48
+ "fp": 0,
49
+ "fn": 0
50
+ },
51
+ "PHONE_NUMBER": {
52
+ "precision": 1.0,
53
+ "recall": 1.0,
54
+ "f1": 1.0,
55
+ "tp": 8,
56
+ "fp": 0,
57
+ "fn": 0
58
+ },
59
+ "POSTCODE": {
60
+ "precision": 1.0,
61
+ "recall": 1.0,
62
+ "f1": 1.0,
63
+ "tp": 4,
64
+ "fp": 0,
65
+ "fn": 0
66
+ },
67
+ "PPSN": {
68
+ "precision": 1.0,
69
+ "recall": 1.0,
70
+ "f1": 1.0,
71
+ "tp": 4,
72
+ "fp": 0,
73
+ "fn": 0
74
+ },
75
+ "SWIFT_BIC": {
76
+ "precision": 1.0,
77
+ "recall": 1.0,
78
+ "f1": 1.0,
79
+ "tp": 2,
80
+ "fp": 0,
81
+ "fn": 0
82
+ }
83
+ }
84
+ }
eval/full_irish_gov_chatbot_redteam_user_v2.json ADDED
@@ -0,0 +1,108 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "models/irishcore-globalpointer-135m-b01-extendedv1-e025",
3
+ "input": "eval/irish_gov_chatbot_redteam_user_v2.jsonl",
4
+ "loader_type": "global_pointer_pt",
5
+ "examples": 10,
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "elapsed_seconds": 0.1798157700104639,
9
+ "examples_per_second": 55.612474920403685,
10
+ "overall": {
11
+ "precision": 1.0,
12
+ "recall": 1.0,
13
+ "f1": 1.0,
14
+ "tp": 41,
15
+ "fp": 0,
16
+ "fn": 0
17
+ },
18
+ "by_label": {
19
+ "ACCOUNT_NUMBER": {
20
+ "precision": 1.0,
21
+ "recall": 1.0,
22
+ "f1": 1.0,
23
+ "tp": 2,
24
+ "fp": 0,
25
+ "fn": 0
26
+ },
27
+ "BANK_ROUTING_NUMBER": {
28
+ "precision": 1.0,
29
+ "recall": 1.0,
30
+ "f1": 1.0,
31
+ "tp": 1,
32
+ "fp": 0,
33
+ "fn": 0
34
+ },
35
+ "CREDIT_DEBIT_CARD": {
36
+ "precision": 1.0,
37
+ "recall": 1.0,
38
+ "f1": 1.0,
39
+ "tp": 1,
40
+ "fp": 0,
41
+ "fn": 0
42
+ },
43
+ "EMAIL": {
44
+ "precision": 1.0,
45
+ "recall": 1.0,
46
+ "f1": 1.0,
47
+ "tp": 4,
48
+ "fp": 0,
49
+ "fn": 0
50
+ },
51
+ "FIRST_NAME": {
52
+ "precision": 1.0,
53
+ "recall": 1.0,
54
+ "f1": 1.0,
55
+ "tp": 5,
56
+ "fp": 0,
57
+ "fn": 0
58
+ },
59
+ "LAST_NAME": {
60
+ "precision": 1.0,
61
+ "recall": 1.0,
62
+ "f1": 1.0,
63
+ "tp": 5,
64
+ "fp": 0,
65
+ "fn": 0
66
+ },
67
+ "PASSPORT_NUMBER": {
68
+ "precision": 1.0,
69
+ "recall": 1.0,
70
+ "f1": 1.0,
71
+ "tp": 2,
72
+ "fp": 0,
73
+ "fn": 0
74
+ },
75
+ "PHONE_NUMBER": {
76
+ "precision": 1.0,
77
+ "recall": 1.0,
78
+ "f1": 1.0,
79
+ "tp": 9,
80
+ "fp": 0,
81
+ "fn": 0
82
+ },
83
+ "POSTCODE": {
84
+ "precision": 1.0,
85
+ "recall": 1.0,
86
+ "f1": 1.0,
87
+ "tp": 3,
88
+ "fp": 0,
89
+ "fn": 0
90
+ },
91
+ "PPSN": {
92
+ "precision": 1.0,
93
+ "recall": 1.0,
94
+ "f1": 1.0,
95
+ "tp": 7,
96
+ "fp": 0,
97
+ "fn": 0
98
+ },
99
+ "SWIFT_BIC": {
100
+ "precision": 1.0,
101
+ "recall": 1.0,
102
+ "f1": 1.0,
103
+ "tp": 2,
104
+ "fp": 0,
105
+ "fn": 0
106
+ }
107
+ }
108
+ }
eval/full_irish_gov_chatbot_redteam_v1.json ADDED
@@ -0,0 +1,362 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc1",
3
+ "family": "globalpointer",
4
+ "backend": "pt",
5
+ "input": "irish_gov_chatbot_redteam_v1.jsonl",
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "overall": {
9
+ "precision": 1.0,
10
+ "recall": 1.0,
11
+ "f1": 1.0,
12
+ "tp": 161,
13
+ "fp": 0,
14
+ "fn": 0
15
+ },
16
+ "exact": {
17
+ "precision": 1.0,
18
+ "recall": 1.0,
19
+ "f1": 1.0,
20
+ "tp": 161,
21
+ "fp": 0,
22
+ "fn": 0
23
+ },
24
+ "by_label": {
25
+ "ACCOUNT_NUMBER": {
26
+ "precision": 1.0,
27
+ "recall": 1.0,
28
+ "f1": 1.0,
29
+ "tp": 9,
30
+ "fp": 0,
31
+ "fn": 0
32
+ },
33
+ "BANK_ROUTING_NUMBER": {
34
+ "precision": 1.0,
35
+ "recall": 1.0,
36
+ "f1": 1.0,
37
+ "tp": 3,
38
+ "fp": 0,
39
+ "fn": 0
40
+ },
41
+ "CREDIT_DEBIT_CARD": {
42
+ "precision": 1.0,
43
+ "recall": 1.0,
44
+ "f1": 1.0,
45
+ "tp": 3,
46
+ "fp": 0,
47
+ "fn": 0
48
+ },
49
+ "EMAIL": {
50
+ "precision": 1.0,
51
+ "recall": 1.0,
52
+ "f1": 1.0,
53
+ "tp": 16,
54
+ "fp": 0,
55
+ "fn": 0
56
+ },
57
+ "FIRST_NAME": {
58
+ "precision": 1.0,
59
+ "recall": 1.0,
60
+ "f1": 1.0,
61
+ "tp": 18,
62
+ "fp": 0,
63
+ "fn": 0
64
+ },
65
+ "LAST_NAME": {
66
+ "precision": 1.0,
67
+ "recall": 1.0,
68
+ "f1": 1.0,
69
+ "tp": 18,
70
+ "fp": 0,
71
+ "fn": 0
72
+ },
73
+ "PASSPORT_NUMBER": {
74
+ "precision": 1.0,
75
+ "recall": 1.0,
76
+ "f1": 1.0,
77
+ "tp": 4,
78
+ "fp": 0,
79
+ "fn": 0
80
+ },
81
+ "PHONE_NUMBER": {
82
+ "precision": 1.0,
83
+ "recall": 1.0,
84
+ "f1": 1.0,
85
+ "tp": 36,
86
+ "fp": 0,
87
+ "fn": 0
88
+ },
89
+ "POSTCODE": {
90
+ "precision": 1.0,
91
+ "recall": 1.0,
92
+ "f1": 1.0,
93
+ "tp": 11,
94
+ "fp": 0,
95
+ "fn": 0
96
+ },
97
+ "PPSN": {
98
+ "precision": 1.0,
99
+ "recall": 1.0,
100
+ "f1": 1.0,
101
+ "tp": 34,
102
+ "fp": 0,
103
+ "fn": 0
104
+ },
105
+ "SWIFT_BIC": {
106
+ "precision": 1.0,
107
+ "recall": 1.0,
108
+ "f1": 1.0,
109
+ "tp": 9,
110
+ "fp": 0,
111
+ "fn": 0
112
+ }
113
+ },
114
+ "by_language": {
115
+ "en": {
116
+ "precision": 1.0,
117
+ "recall": 1.0,
118
+ "f1": 1.0,
119
+ "tp": 99,
120
+ "fp": 0,
121
+ "fn": 0
122
+ },
123
+ "ga": {
124
+ "precision": 1.0,
125
+ "recall": 1.0,
126
+ "f1": 1.0,
127
+ "tp": 62,
128
+ "fp": 0,
129
+ "fn": 0
130
+ }
131
+ },
132
+ "by_role": {
133
+ "assistant": {
134
+ "precision": 1.0,
135
+ "recall": 1.0,
136
+ "f1": 1.0,
137
+ "tp": 56,
138
+ "fp": 0,
139
+ "fn": 0
140
+ },
141
+ "mixed": {
142
+ "precision": 0.0,
143
+ "recall": 0.0,
144
+ "f1": 0.0,
145
+ "tp": 0,
146
+ "fp": 0,
147
+ "fn": 0
148
+ },
149
+ "user": {
150
+ "precision": 1.0,
151
+ "recall": 1.0,
152
+ "f1": 1.0,
153
+ "tp": 105,
154
+ "fp": 0,
155
+ "fn": 0
156
+ }
157
+ },
158
+ "by_source_type": {
159
+ "assistant_centre_block_en": {
160
+ "precision": 1.0,
161
+ "recall": 1.0,
162
+ "f1": 1.0,
163
+ "tp": 2,
164
+ "fp": 0,
165
+ "fn": 0
166
+ },
167
+ "assistant_contact_block_en": {
168
+ "precision": 1.0,
169
+ "recall": 1.0,
170
+ "f1": 1.0,
171
+ "tp": 2,
172
+ "fp": 0,
173
+ "fn": 0
174
+ },
175
+ "assistant_contact_ga": {
176
+ "precision": 1.0,
177
+ "recall": 1.0,
178
+ "f1": 1.0,
179
+ "tp": 2,
180
+ "fp": 0,
181
+ "fn": 0
182
+ },
183
+ "assistant_echo_user_en": {
184
+ "precision": 1.0,
185
+ "recall": 1.0,
186
+ "f1": 1.0,
187
+ "tp": 15,
188
+ "fp": 0,
189
+ "fn": 0
190
+ },
191
+ "assistant_echo_user_ga": {
192
+ "precision": 1.0,
193
+ "recall": 1.0,
194
+ "f1": 1.0,
195
+ "tp": 15,
196
+ "fp": 0,
197
+ "fn": 0
198
+ },
199
+ "assistant_location_en": {
200
+ "precision": 1.0,
201
+ "recall": 1.0,
202
+ "f1": 1.0,
203
+ "tp": 12,
204
+ "fp": 0,
205
+ "fn": 0
206
+ },
207
+ "assistant_mailbox_en": {
208
+ "precision": 1.0,
209
+ "recall": 1.0,
210
+ "f1": 1.0,
211
+ "tp": 2,
212
+ "fp": 0,
213
+ "fn": 0
214
+ },
215
+ "assistant_payment_en": {
216
+ "precision": 1.0,
217
+ "recall": 1.0,
218
+ "f1": 1.0,
219
+ "tp": 6,
220
+ "fp": 0,
221
+ "fn": 0
222
+ },
223
+ "negative_date_en": {
224
+ "precision": 0.0,
225
+ "recall": 0.0,
226
+ "f1": 0.0,
227
+ "tp": 0,
228
+ "fp": 0,
229
+ "fn": 0
230
+ },
231
+ "negative_date_ga": {
232
+ "precision": 0.0,
233
+ "recall": 0.0,
234
+ "f1": 0.0,
235
+ "tp": 0,
236
+ "fp": 0,
237
+ "fn": 0
238
+ },
239
+ "negative_direct_debit_en": {
240
+ "precision": 0.0,
241
+ "recall": 0.0,
242
+ "f1": 0.0,
243
+ "tp": 0,
244
+ "fp": 0,
245
+ "fn": 0
246
+ },
247
+ "negative_hours_en": {
248
+ "precision": 0.0,
249
+ "recall": 0.0,
250
+ "f1": 0.0,
251
+ "tp": 0,
252
+ "fp": 0,
253
+ "fn": 0
254
+ },
255
+ "negative_long_ppsn_en": {
256
+ "precision": 0.0,
257
+ "recall": 0.0,
258
+ "f1": 0.0,
259
+ "tp": 0,
260
+ "fp": 0,
261
+ "fn": 0
262
+ },
263
+ "negative_scheme_ga": {
264
+ "precision": 0.0,
265
+ "recall": 0.0,
266
+ "f1": 0.0,
267
+ "tp": 0,
268
+ "fp": 0,
269
+ "fn": 0
270
+ },
271
+ "negative_short_ppsn_en": {
272
+ "precision": 0.0,
273
+ "recall": 0.0,
274
+ "f1": 0.0,
275
+ "tp": 0,
276
+ "fp": 0,
277
+ "fn": 0
278
+ },
279
+ "negative_year_letter_ga": {
280
+ "precision": 0.0,
281
+ "recall": 0.0,
282
+ "f1": 0.0,
283
+ "tp": 0,
284
+ "fp": 0,
285
+ "fn": 0
286
+ },
287
+ "user_allowance_mixed_en": {
288
+ "precision": 1.0,
289
+ "recall": 1.0,
290
+ "f1": 1.0,
291
+ "tp": 24,
292
+ "fp": 0,
293
+ "fn": 0
294
+ },
295
+ "user_allowance_mixed_ga": {
296
+ "precision": 1.0,
297
+ "recall": 1.0,
298
+ "f1": 1.0,
299
+ "tp": 24,
300
+ "fp": 0,
301
+ "fn": 0
302
+ },
303
+ "user_bare_ppsn_en": {
304
+ "precision": 1.0,
305
+ "recall": 1.0,
306
+ "f1": 1.0,
307
+ "tp": 6,
308
+ "fp": 0,
309
+ "fn": 0
310
+ },
311
+ "user_bare_ppsn_ga": {
312
+ "precision": 1.0,
313
+ "recall": 1.0,
314
+ "f1": 1.0,
315
+ "tp": 6,
316
+ "fp": 0,
317
+ "fn": 0
318
+ },
319
+ "user_card_email_en": {
320
+ "precision": 1.0,
321
+ "recall": 1.0,
322
+ "f1": 1.0,
323
+ "tp": 6,
324
+ "fp": 0,
325
+ "fn": 0
326
+ },
327
+ "user_passport_en": {
328
+ "precision": 1.0,
329
+ "recall": 1.0,
330
+ "f1": 1.0,
331
+ "tp": 12,
332
+ "fp": 0,
333
+ "fn": 0
334
+ },
335
+ "user_payment_en": {
336
+ "precision": 1.0,
337
+ "recall": 1.0,
338
+ "f1": 1.0,
339
+ "tp": 12,
340
+ "fp": 0,
341
+ "fn": 0
342
+ },
343
+ "user_payment_ga": {
344
+ "precision": 1.0,
345
+ "recall": 1.0,
346
+ "f1": 1.0,
347
+ "tp": 12,
348
+ "fp": 0,
349
+ "fn": 0
350
+ },
351
+ "user_sort_code_ga": {
352
+ "precision": 1.0,
353
+ "recall": 1.0,
354
+ "f1": 1.0,
355
+ "tp": 3,
356
+ "fp": 0,
357
+ "fn": 0
358
+ }
359
+ },
360
+ "failure_count": 0,
361
+ "failures": []
362
+ }
eval/full_irish_gov_chatbot_redteam_v2.json ADDED
@@ -0,0 +1,109 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc10",
3
+ "input": "eval/irish_gov_chatbot_redteam_v2.jsonl",
4
+ "loader_type": "global_pointer_pt",
5
+ "examples": 25,
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "elapsed_seconds": 0.8187228119932115,
9
+ "examples_per_second": 30.535365124536543,
10
+ "overall": {
11
+ "precision": 0.9726027397260274,
12
+ "recall": 1.0,
13
+ "f1": 0.9861111111111112,
14
+ "tp": 71,
15
+ "fp": 2,
16
+ "fn": 0
17
+ },
18
+ "by_label": {
19
+ "ACCOUNT_NUMBER": {
20
+ "precision": 1.0,
21
+ "recall": 1.0,
22
+ "f1": 1.0,
23
+ "tp": 4,
24
+ "fp": 0,
25
+ "fn": 0
26
+ },
27
+ "BANK_ROUTING_NUMBER": {
28
+ "precision": 1.0,
29
+ "recall": 1.0,
30
+ "f1": 1.0,
31
+ "tp": 1,
32
+ "fp": 0,
33
+ "fn": 0
34
+ },
35
+ "CREDIT_DEBIT_CARD": {
36
+ "precision": 1.0,
37
+ "recall": 1.0,
38
+ "f1": 1.0,
39
+ "tp": 1,
40
+ "fp": 0,
41
+ "fn": 0
42
+ },
43
+ "EMAIL": {
44
+ "precision": 1.0,
45
+ "recall": 1.0,
46
+ "f1": 1.0,
47
+ "tp": 10,
48
+ "fp": 0,
49
+ "fn": 0
50
+ },
51
+ "FIRST_NAME": {
52
+ "precision": 1.0,
53
+ "recall": 1.0,
54
+ "f1": 1.0,
55
+ "tp": 7,
56
+ "fp": 0,
57
+ "fn": 0
58
+ },
59
+ "LAST_NAME": {
60
+ "precision": 1.0,
61
+ "recall": 1.0,
62
+ "f1": 1.0,
63
+ "tp": 7,
64
+ "fp": 0,
65
+ "fn": 0
66
+ },
67
+ "PASSPORT_NUMBER": {
68
+ "precision": 1.0,
69
+ "recall": 1.0,
70
+ "f1": 1.0,
71
+ "tp": 2,
72
+ "fp": 0,
73
+ "fn": 0
74
+ },
75
+ "PHONE_NUMBER": {
76
+ "precision": 1.0,
77
+ "recall": 1.0,
78
+ "f1": 1.0,
79
+ "tp": 17,
80
+ "fp": 0,
81
+ "fn": 0
82
+ },
83
+ "POSTCODE": {
84
+ "precision": 1.0,
85
+ "recall": 1.0,
86
+ "f1": 1.0,
87
+ "tp": 7,
88
+ "fp": 0,
89
+ "fn": 0
90
+ },
91
+ "PPSN": {
92
+ "precision": 1.0,
93
+ "recall": 1.0,
94
+ "f1": 1.0,
95
+ "tp": 11,
96
+ "fp": 0,
97
+ "fn": 0
98
+ },
99
+ "SWIFT_BIC": {
100
+ "precision": 1.0,
101
+ "recall": 1.0,
102
+ "f1": 1.0,
103
+ "tp": 4,
104
+ "fp": 0,
105
+ "fn": 0
106
+ }
107
+ },
108
+ "backend": "full"
109
+ }
eval/full_irish_gov_contact_policy_v1.json ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc10",
3
+ "input": "eval/irish_gov_contact_policy_v1.jsonl",
4
+ "loader_type": "global_pointer_pt",
5
+ "examples": 12,
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "elapsed_seconds": 0.5450704880058765,
9
+ "examples_per_second": 22.015501231595987,
10
+ "overall": {
11
+ "precision": 1.0,
12
+ "recall": 1.0,
13
+ "f1": 1.0,
14
+ "tp": 30,
15
+ "fp": 0,
16
+ "fn": 0
17
+ },
18
+ "by_label": {
19
+ "CITY": {
20
+ "precision": 1.0,
21
+ "recall": 1.0,
22
+ "f1": 1.0,
23
+ "tp": 4,
24
+ "fp": 0,
25
+ "fn": 0
26
+ },
27
+ "COUNTY": {
28
+ "precision": 1.0,
29
+ "recall": 1.0,
30
+ "f1": 1.0,
31
+ "tp": 2,
32
+ "fp": 0,
33
+ "fn": 0
34
+ },
35
+ "DATE_OF_BIRTH": {
36
+ "precision": 1.0,
37
+ "recall": 1.0,
38
+ "f1": 1.0,
39
+ "tp": 4,
40
+ "fp": 0,
41
+ "fn": 0
42
+ },
43
+ "EMAIL": {
44
+ "precision": 1.0,
45
+ "recall": 1.0,
46
+ "f1": 1.0,
47
+ "tp": 4,
48
+ "fp": 0,
49
+ "fn": 0
50
+ },
51
+ "PHONE_NUMBER": {
52
+ "precision": 1.0,
53
+ "recall": 1.0,
54
+ "f1": 1.0,
55
+ "tp": 8,
56
+ "fp": 0,
57
+ "fn": 0
58
+ },
59
+ "POSTCODE": {
60
+ "precision": 1.0,
61
+ "recall": 1.0,
62
+ "f1": 1.0,
63
+ "tp": 4,
64
+ "fp": 0,
65
+ "fn": 0
66
+ },
67
+ "STREET_ADDRESS": {
68
+ "precision": 1.0,
69
+ "recall": 1.0,
70
+ "f1": 1.0,
71
+ "tp": 4,
72
+ "fp": 0,
73
+ "fn": 0
74
+ }
75
+ },
76
+ "backend": "full"
77
+ }
eval/full_irish_numeric_qafix_v2.json ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc9",
3
+ "input": "eval/irish_numeric_qafix_v2.jsonl",
4
+ "loader_type": "global_pointer_pt",
5
+ "examples": 19,
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "elapsed_seconds": 0.6458162779454142,
9
+ "examples_per_second": 29.420131775628487,
10
+ "overall": {
11
+ "precision": 1.0,
12
+ "recall": 1.0,
13
+ "f1": 1.0,
14
+ "tp": 14,
15
+ "fp": 0,
16
+ "fn": 0
17
+ },
18
+ "by_label": {
19
+ "BANK_ROUTING_NUMBER": {
20
+ "precision": 1.0,
21
+ "recall": 1.0,
22
+ "f1": 1.0,
23
+ "tp": 5,
24
+ "fp": 0,
25
+ "fn": 0
26
+ },
27
+ "PASSPORT_NUMBER": {
28
+ "precision": 1.0,
29
+ "recall": 1.0,
30
+ "f1": 1.0,
31
+ "tp": 5,
32
+ "fp": 0,
33
+ "fn": 0
34
+ },
35
+ "PHONE_NUMBER": {
36
+ "precision": 1.0,
37
+ "recall": 1.0,
38
+ "f1": 1.0,
39
+ "tp": 4,
40
+ "fp": 0,
41
+ "fn": 0
42
+ }
43
+ },
44
+ "backend": "full"
45
+ }
eval/full_irish_ppsn_phone_edge_v1.json ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc1",
3
+ "input": "irish_ppsn_phone_edge_v1.jsonl",
4
+ "loader_type": "global_pointer_pt",
5
+ "examples": 22,
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "elapsed_seconds": 0.41967142606154084,
9
+ "examples_per_second": 52.42196307349719,
10
+ "overall": {
11
+ "precision": 1.0,
12
+ "recall": 1.0,
13
+ "f1": 1.0,
14
+ "tp": 19,
15
+ "fp": 0,
16
+ "fn": 0
17
+ },
18
+ "by_label": {
19
+ "PHONE_NUMBER": {
20
+ "precision": 1.0,
21
+ "recall": 1.0,
22
+ "f1": 1.0,
23
+ "tp": 13,
24
+ "fp": 0,
25
+ "fn": 0
26
+ },
27
+ "PPSN": {
28
+ "precision": 1.0,
29
+ "recall": 1.0,
30
+ "f1": 1.0,
31
+ "tp": 6,
32
+ "fp": 0,
33
+ "fn": 0
34
+ }
35
+ },
36
+ "release_backend": "full"
37
+ }
eval/full_irish_remaining_gaps_v2.json ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "models/irishcore-globalpointer-135m-b01-extendedv1-e025",
3
+ "input": "eval/irish_remaining_gaps_v2.jsonl",
4
+ "loader_type": "global_pointer_pt",
5
+ "examples": 6,
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "elapsed_seconds": 0.08656914997845888,
9
+ "examples_per_second": 69.30875492589436,
10
+ "overall": {
11
+ "precision": 1.0,
12
+ "recall": 1.0,
13
+ "f1": 1.0,
14
+ "tp": 5,
15
+ "fp": 0,
16
+ "fn": 0
17
+ },
18
+ "by_label": {
19
+ "PASSPORT_NUMBER": {
20
+ "precision": 1.0,
21
+ "recall": 1.0,
22
+ "f1": 1.0,
23
+ "tp": 2,
24
+ "fp": 0,
25
+ "fn": 0
26
+ },
27
+ "PHONE_NUMBER": {
28
+ "precision": 1.0,
29
+ "recall": 1.0,
30
+ "f1": 1.0,
31
+ "tp": 3,
32
+ "fp": 0,
33
+ "fn": 0
34
+ }
35
+ }
36
+ }
eval/full_multilingual_ppsn_v1_all.json ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc10",
3
+ "input": "eval/multilingual_ppsn_v1_all.jsonl",
4
+ "loader_type": "global_pointer_pt",
5
+ "examples": 168,
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "elapsed_seconds": 2.9706038819858804,
9
+ "examples_per_second": 56.554157563306696,
10
+ "overall": {
11
+ "precision": 0.875,
12
+ "recall": 1.0,
13
+ "f1": 0.9333333333333333,
14
+ "tp": 84,
15
+ "fp": 12,
16
+ "fn": 0
17
+ },
18
+ "by_label": {
19
+ "PPSN": {
20
+ "precision": 1.0,
21
+ "recall": 1.0,
22
+ "f1": 1.0,
23
+ "tp": 84,
24
+ "fp": 0,
25
+ "fn": 0
26
+ }
27
+ },
28
+ "backend": "full"
29
+ }
eval/full_runtime_profile_source.json ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc1",
3
+ "input": "runtime_profile_source.jsonl",
4
+ "loader_type": "global_pointer_pt",
5
+ "examples": 3223,
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "elapsed_seconds": 46.959111439064145,
9
+ "examples_per_second": 68.63417771825351,
10
+ "overall": {
11
+ "precision": 0.585127996749289,
12
+ "recall": 0.40597688187200454,
13
+ "f1": 0.47936085219707064,
14
+ "tp": 1440,
15
+ "fp": 1021,
16
+ "fn": 2107
17
+ },
18
+ "by_label": {
19
+ "PPSN": {
20
+ "precision": 0.9320388349514563,
21
+ "recall": 0.40597688187200454,
22
+ "f1": 0.5655930871956009,
23
+ "tp": 1440,
24
+ "fp": 105,
25
+ "fn": 2107
26
+ }
27
+ },
28
+ "release_backend": "full"
29
+ }
eval/label_inventory.json ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "labels": [
3
+ "ACCOUNT_NUMBER",
4
+ "AGE",
5
+ "BANK_ROUTING_NUMBER",
6
+ "CITY",
7
+ "COUNTY",
8
+ "CREDIT_DEBIT_CARD",
9
+ "DATE_OF_BIRTH",
10
+ "EMAIL",
11
+ "FIRST_NAME",
12
+ "LAST_NAME",
13
+ "PASSPORT_NUMBER",
14
+ "PHONE_NUMBER",
15
+ "POSTCODE",
16
+ "PPSN",
17
+ "STREET_ADDRESS",
18
+ "SWIFT_BIC"
19
+ ]
20
+ }
eval/q8_diffmask_fresh_holdout_v1.json ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc1",
3
+ "input": "diffmask_fresh_holdout_v1.jsonl",
4
+ "loader_type": "global_pointer_onnx",
5
+ "examples": 20,
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "elapsed_seconds": 0.13704864599276334,
9
+ "examples_per_second": 145.93358332818605,
10
+ "overall": {
11
+ "precision": 1.0,
12
+ "recall": 0.96875,
13
+ "f1": 0.9841269841269841,
14
+ "tp": 31,
15
+ "fp": 0,
16
+ "fn": 1
17
+ },
18
+ "by_label": {
19
+ "ACCOUNT_NUMBER": {
20
+ "precision": 1.0,
21
+ "recall": 0.5,
22
+ "f1": 0.6666666666666666,
23
+ "tp": 1,
24
+ "fp": 0,
25
+ "fn": 1
26
+ },
27
+ "CREDIT_DEBIT_CARD": {
28
+ "precision": 1.0,
29
+ "recall": 1.0,
30
+ "f1": 1.0,
31
+ "tp": 2,
32
+ "fp": 0,
33
+ "fn": 0
34
+ },
35
+ "EMAIL": {
36
+ "precision": 1.0,
37
+ "recall": 1.0,
38
+ "f1": 1.0,
39
+ "tp": 6,
40
+ "fp": 0,
41
+ "fn": 0
42
+ },
43
+ "FIRST_NAME": {
44
+ "precision": 1.0,
45
+ "recall": 1.0,
46
+ "f1": 1.0,
47
+ "tp": 4,
48
+ "fp": 0,
49
+ "fn": 0
50
+ },
51
+ "LAST_NAME": {
52
+ "precision": 1.0,
53
+ "recall": 1.0,
54
+ "f1": 1.0,
55
+ "tp": 4,
56
+ "fp": 0,
57
+ "fn": 0
58
+ },
59
+ "PHONE_NUMBER": {
60
+ "precision": 1.0,
61
+ "recall": 1.0,
62
+ "f1": 1.0,
63
+ "tp": 6,
64
+ "fp": 0,
65
+ "fn": 0
66
+ },
67
+ "POSTCODE": {
68
+ "precision": 1.0,
69
+ "recall": 1.0,
70
+ "f1": 1.0,
71
+ "tp": 2,
72
+ "fp": 0,
73
+ "fn": 0
74
+ },
75
+ "PPSN": {
76
+ "precision": 1.0,
77
+ "recall": 1.0,
78
+ "f1": 1.0,
79
+ "tp": 6,
80
+ "fp": 0,
81
+ "fn": 0
82
+ }
83
+ },
84
+ "release_backend": "onnx_q8"
85
+ }
eval/q8_diffmask_gap_uat_exact_v1.json ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc1",
3
+ "input": "diffmask_gap_uat_exact_v1.jsonl",
4
+ "loader_type": "global_pointer_onnx",
5
+ "examples": 16,
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "elapsed_seconds": 0.08481148700229824,
9
+ "examples_per_second": 188.65369026681998,
10
+ "overall": {
11
+ "precision": 1.0,
12
+ "recall": 1.0,
13
+ "f1": 1.0,
14
+ "tp": 17,
15
+ "fp": 0,
16
+ "fn": 0
17
+ },
18
+ "by_label": {
19
+ "EMAIL": {
20
+ "precision": 1.0,
21
+ "recall": 1.0,
22
+ "f1": 1.0,
23
+ "tp": 3,
24
+ "fp": 0,
25
+ "fn": 0
26
+ },
27
+ "PHONE_NUMBER": {
28
+ "precision": 1.0,
29
+ "recall": 1.0,
30
+ "f1": 1.0,
31
+ "tp": 6,
32
+ "fp": 0,
33
+ "fn": 0
34
+ },
35
+ "POSTCODE": {
36
+ "precision": 1.0,
37
+ "recall": 1.0,
38
+ "f1": 1.0,
39
+ "tp": 3,
40
+ "fp": 0,
41
+ "fn": 0
42
+ },
43
+ "PPSN": {
44
+ "precision": 1.0,
45
+ "recall": 1.0,
46
+ "f1": 1.0,
47
+ "tp": 5,
48
+ "fp": 0,
49
+ "fn": 0
50
+ }
51
+ },
52
+ "release_backend": "onnx_q8"
53
+ }
eval/q8_globalpointer_context_redteam_v1.json ADDED
@@ -0,0 +1,109 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc9",
3
+ "input": "eval/globalpointer_context_redteam_v1.jsonl",
4
+ "loader_type": "global_pointer_onnx",
5
+ "examples": 14,
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "elapsed_seconds": 0.1809925140114501,
9
+ "examples_per_second": 77.35126547341245,
10
+ "overall": {
11
+ "precision": 1.0,
12
+ "recall": 1.0,
13
+ "f1": 1.0,
14
+ "tp": 54,
15
+ "fp": 0,
16
+ "fn": 0
17
+ },
18
+ "by_label": {
19
+ "AGE": {
20
+ "precision": 1.0,
21
+ "recall": 1.0,
22
+ "f1": 1.0,
23
+ "tp": 2,
24
+ "fp": 0,
25
+ "fn": 0
26
+ },
27
+ "CITY": {
28
+ "precision": 1.0,
29
+ "recall": 1.0,
30
+ "f1": 1.0,
31
+ "tp": 8,
32
+ "fp": 0,
33
+ "fn": 0
34
+ },
35
+ "COUNTY": {
36
+ "precision": 1.0,
37
+ "recall": 1.0,
38
+ "f1": 1.0,
39
+ "tp": 10,
40
+ "fp": 0,
41
+ "fn": 0
42
+ },
43
+ "DATE_OF_BIRTH": {
44
+ "precision": 1.0,
45
+ "recall": 1.0,
46
+ "f1": 1.0,
47
+ "tp": 4,
48
+ "fp": 0,
49
+ "fn": 0
50
+ },
51
+ "EMAIL": {
52
+ "precision": 1.0,
53
+ "recall": 1.0,
54
+ "f1": 1.0,
55
+ "tp": 4,
56
+ "fp": 0,
57
+ "fn": 0
58
+ },
59
+ "FIRST_NAME": {
60
+ "precision": 1.0,
61
+ "recall": 1.0,
62
+ "f1": 1.0,
63
+ "tp": 2,
64
+ "fp": 0,
65
+ "fn": 0
66
+ },
67
+ "LAST_NAME": {
68
+ "precision": 1.0,
69
+ "recall": 1.0,
70
+ "f1": 1.0,
71
+ "tp": 2,
72
+ "fp": 0,
73
+ "fn": 0
74
+ },
75
+ "PHONE_NUMBER": {
76
+ "precision": 1.0,
77
+ "recall": 1.0,
78
+ "f1": 1.0,
79
+ "tp": 4,
80
+ "fp": 0,
81
+ "fn": 0
82
+ },
83
+ "POSTCODE": {
84
+ "precision": 1.0,
85
+ "recall": 1.0,
86
+ "f1": 1.0,
87
+ "tp": 8,
88
+ "fp": 0,
89
+ "fn": 0
90
+ },
91
+ "PPSN": {
92
+ "precision": 1.0,
93
+ "recall": 1.0,
94
+ "f1": 1.0,
95
+ "tp": 2,
96
+ "fp": 0,
97
+ "fn": 0
98
+ },
99
+ "STREET_ADDRESS": {
100
+ "precision": 1.0,
101
+ "recall": 1.0,
102
+ "f1": 1.0,
103
+ "tp": 8,
104
+ "fp": 0,
105
+ "fn": 0
106
+ }
107
+ },
108
+ "backend": "onnx_q8"
109
+ }
eval/q8_globalpointer_context_redteam_v2.json ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc9",
3
+ "input": "eval/globalpointer_context_redteam_v2.jsonl",
4
+ "loader_type": "global_pointer_onnx",
5
+ "examples": 6,
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "elapsed_seconds": 0.0719167779898271,
9
+ "examples_per_second": 83.42976656780596,
10
+ "overall": {
11
+ "precision": 1.0,
12
+ "recall": 1.0,
13
+ "f1": 1.0,
14
+ "tp": 13,
15
+ "fp": 0,
16
+ "fn": 0
17
+ },
18
+ "by_label": {
19
+ "CITY": {
20
+ "precision": 1.0,
21
+ "recall": 1.0,
22
+ "f1": 1.0,
23
+ "tp": 4,
24
+ "fp": 0,
25
+ "fn": 0
26
+ },
27
+ "COUNTY": {
28
+ "precision": 1.0,
29
+ "recall": 1.0,
30
+ "f1": 1.0,
31
+ "tp": 1,
32
+ "fp": 0,
33
+ "fn": 0
34
+ },
35
+ "DATE_OF_BIRTH": {
36
+ "precision": 1.0,
37
+ "recall": 1.0,
38
+ "f1": 1.0,
39
+ "tp": 1,
40
+ "fp": 0,
41
+ "fn": 0
42
+ },
43
+ "PHONE_NUMBER": {
44
+ "precision": 1.0,
45
+ "recall": 1.0,
46
+ "f1": 1.0,
47
+ "tp": 2,
48
+ "fp": 0,
49
+ "fn": 0
50
+ },
51
+ "POSTCODE": {
52
+ "precision": 1.0,
53
+ "recall": 1.0,
54
+ "f1": 1.0,
55
+ "tp": 3,
56
+ "fp": 0,
57
+ "fn": 0
58
+ },
59
+ "STREET_ADDRESS": {
60
+ "precision": 1.0,
61
+ "recall": 1.0,
62
+ "f1": 1.0,
63
+ "tp": 2,
64
+ "fp": 0,
65
+ "fn": 0
66
+ }
67
+ },
68
+ "backend": "onnx_q8"
69
+ }
eval/q8_globalpointer_context_redteam_v3.json ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc10",
3
+ "input": "eval/globalpointer_context_redteam_v3.jsonl",
4
+ "loader_type": "global_pointer_onnx",
5
+ "examples": 12,
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "elapsed_seconds": 0.10364121198654175,
9
+ "examples_per_second": 115.78405703667622,
10
+ "overall": {
11
+ "precision": 1.0,
12
+ "recall": 1.0,
13
+ "f1": 1.0,
14
+ "tp": 22,
15
+ "fp": 0,
16
+ "fn": 0
17
+ },
18
+ "by_label": {
19
+ "AGE": {
20
+ "precision": 1.0,
21
+ "recall": 1.0,
22
+ "f1": 1.0,
23
+ "tp": 3,
24
+ "fp": 0,
25
+ "fn": 0
26
+ },
27
+ "CITY": {
28
+ "precision": 1.0,
29
+ "recall": 1.0,
30
+ "f1": 1.0,
31
+ "tp": 7,
32
+ "fp": 0,
33
+ "fn": 0
34
+ },
35
+ "COUNTY": {
36
+ "precision": 1.0,
37
+ "recall": 1.0,
38
+ "f1": 1.0,
39
+ "tp": 1,
40
+ "fp": 0,
41
+ "fn": 0
42
+ },
43
+ "DATE_OF_BIRTH": {
44
+ "precision": 1.0,
45
+ "recall": 1.0,
46
+ "f1": 1.0,
47
+ "tp": 3,
48
+ "fp": 0,
49
+ "fn": 0
50
+ },
51
+ "PHONE_NUMBER": {
52
+ "precision": 1.0,
53
+ "recall": 1.0,
54
+ "f1": 1.0,
55
+ "tp": 3,
56
+ "fp": 0,
57
+ "fn": 0
58
+ },
59
+ "POSTCODE": {
60
+ "precision": 1.0,
61
+ "recall": 1.0,
62
+ "f1": 1.0,
63
+ "tp": 3,
64
+ "fp": 0,
65
+ "fn": 0
66
+ },
67
+ "STREET_ADDRESS": {
68
+ "precision": 1.0,
69
+ "recall": 1.0,
70
+ "f1": 1.0,
71
+ "tp": 2,
72
+ "fp": 0,
73
+ "fn": 0
74
+ }
75
+ },
76
+ "backend": "onnx_q8"
77
+ }
eval/q8_globalpointer_context_redteam_v4.json ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc10",
3
+ "input": "eval/globalpointer_context_redteam_v4.jsonl",
4
+ "loader_type": "global_pointer_onnx",
5
+ "examples": 21,
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "elapsed_seconds": 0.18228210194502026,
9
+ "examples_per_second": 115.20604478400188,
10
+ "overall": {
11
+ "precision": 1.0,
12
+ "recall": 1.0,
13
+ "f1": 1.0,
14
+ "tp": 43,
15
+ "fp": 0,
16
+ "fn": 0
17
+ },
18
+ "by_label": {
19
+ "AGE": {
20
+ "precision": 1.0,
21
+ "recall": 1.0,
22
+ "f1": 1.0,
23
+ "tp": 3,
24
+ "fp": 0,
25
+ "fn": 0
26
+ },
27
+ "CITY": {
28
+ "precision": 1.0,
29
+ "recall": 1.0,
30
+ "f1": 1.0,
31
+ "tp": 10,
32
+ "fp": 0,
33
+ "fn": 0
34
+ },
35
+ "COUNTY": {
36
+ "precision": 1.0,
37
+ "recall": 1.0,
38
+ "f1": 1.0,
39
+ "tp": 1,
40
+ "fp": 0,
41
+ "fn": 0
42
+ },
43
+ "DATE_OF_BIRTH": {
44
+ "precision": 1.0,
45
+ "recall": 1.0,
46
+ "f1": 1.0,
47
+ "tp": 6,
48
+ "fp": 0,
49
+ "fn": 0
50
+ },
51
+ "FIRST_NAME": {
52
+ "precision": 1.0,
53
+ "recall": 1.0,
54
+ "f1": 1.0,
55
+ "tp": 2,
56
+ "fp": 0,
57
+ "fn": 0
58
+ },
59
+ "LAST_NAME": {
60
+ "precision": 1.0,
61
+ "recall": 1.0,
62
+ "f1": 1.0,
63
+ "tp": 2,
64
+ "fp": 0,
65
+ "fn": 0
66
+ },
67
+ "PHONE_NUMBER": {
68
+ "precision": 1.0,
69
+ "recall": 1.0,
70
+ "f1": 1.0,
71
+ "tp": 6,
72
+ "fp": 0,
73
+ "fn": 0
74
+ },
75
+ "POSTCODE": {
76
+ "precision": 1.0,
77
+ "recall": 1.0,
78
+ "f1": 1.0,
79
+ "tp": 6,
80
+ "fp": 0,
81
+ "fn": 0
82
+ },
83
+ "PPSN": {
84
+ "precision": 1.0,
85
+ "recall": 1.0,
86
+ "f1": 1.0,
87
+ "tp": 2,
88
+ "fp": 0,
89
+ "fn": 0
90
+ },
91
+ "STREET_ADDRESS": {
92
+ "precision": 1.0,
93
+ "recall": 1.0,
94
+ "f1": 1.0,
95
+ "tp": 5,
96
+ "fp": 0,
97
+ "fn": 0
98
+ }
99
+ },
100
+ "backend": "onnx_q8"
101
+ }
eval/q8_globalpointer_demographic_patch_v2_test.json ADDED
@@ -0,0 +1,109 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc9",
3
+ "input": "eval/globalpointer_demographic_patch_v2_test.jsonl",
4
+ "loader_type": "global_pointer_onnx",
5
+ "examples": 600,
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "elapsed_seconds": 7.3460182279814035,
9
+ "examples_per_second": 81.67690051660445,
10
+ "overall": {
11
+ "precision": 1.0,
12
+ "recall": 1.0,
13
+ "f1": 1.0,
14
+ "tp": 2470,
15
+ "fp": 0,
16
+ "fn": 0
17
+ },
18
+ "by_label": {
19
+ "AGE": {
20
+ "precision": 1.0,
21
+ "recall": 1.0,
22
+ "f1": 1.0,
23
+ "tp": 287,
24
+ "fp": 0,
25
+ "fn": 0
26
+ },
27
+ "CITY": {
28
+ "precision": 1.0,
29
+ "recall": 1.0,
30
+ "f1": 1.0,
31
+ "tp": 286,
32
+ "fp": 0,
33
+ "fn": 0
34
+ },
35
+ "COUNTY": {
36
+ "precision": 1.0,
37
+ "recall": 1.0,
38
+ "f1": 1.0,
39
+ "tp": 286,
40
+ "fp": 0,
41
+ "fn": 0
42
+ },
43
+ "DATE_OF_BIRTH": {
44
+ "precision": 1.0,
45
+ "recall": 1.0,
46
+ "f1": 1.0,
47
+ "tp": 304,
48
+ "fp": 0,
49
+ "fn": 0
50
+ },
51
+ "EMAIL": {
52
+ "precision": 1.0,
53
+ "recall": 1.0,
54
+ "f1": 1.0,
55
+ "tp": 85,
56
+ "fp": 0,
57
+ "fn": 0
58
+ },
59
+ "FIRST_NAME": {
60
+ "precision": 1.0,
61
+ "recall": 1.0,
62
+ "f1": 1.0,
63
+ "tp": 194,
64
+ "fp": 0,
65
+ "fn": 0
66
+ },
67
+ "LAST_NAME": {
68
+ "precision": 1.0,
69
+ "recall": 1.0,
70
+ "f1": 1.0,
71
+ "tp": 194,
72
+ "fp": 0,
73
+ "fn": 0
74
+ },
75
+ "PHONE_NUMBER": {
76
+ "precision": 1.0,
77
+ "recall": 1.0,
78
+ "f1": 1.0,
79
+ "tp": 177,
80
+ "fp": 0,
81
+ "fn": 0
82
+ },
83
+ "POSTCODE": {
84
+ "precision": 1.0,
85
+ "recall": 1.0,
86
+ "f1": 1.0,
87
+ "tp": 286,
88
+ "fp": 0,
89
+ "fn": 0
90
+ },
91
+ "PPSN": {
92
+ "precision": 1.0,
93
+ "recall": 1.0,
94
+ "f1": 1.0,
95
+ "tp": 85,
96
+ "fp": 0,
97
+ "fn": 0
98
+ },
99
+ "STREET_ADDRESS": {
100
+ "precision": 1.0,
101
+ "recall": 1.0,
102
+ "f1": 1.0,
103
+ "tp": 286,
104
+ "fp": 0,
105
+ "fn": 0
106
+ }
107
+ },
108
+ "backend": "onnx_q8"
109
+ }
eval/q8_globalpointer_location_coverage_v1.json ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc9",
3
+ "input": "eval/globalpointer_location_coverage_v1.jsonl",
4
+ "loader_type": "global_pointer_onnx",
5
+ "examples": 18,
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "elapsed_seconds": 0.20767050504218787,
9
+ "examples_per_second": 86.67576551780107,
10
+ "overall": {
11
+ "precision": 1.0,
12
+ "recall": 1.0,
13
+ "f1": 1.0,
14
+ "tp": 56,
15
+ "fp": 0,
16
+ "fn": 0
17
+ },
18
+ "by_label": {
19
+ "CITY": {
20
+ "precision": 1.0,
21
+ "recall": 1.0,
22
+ "f1": 1.0,
23
+ "tp": 14,
24
+ "fp": 0,
25
+ "fn": 0
26
+ },
27
+ "COUNTY": {
28
+ "precision": 1.0,
29
+ "recall": 1.0,
30
+ "f1": 1.0,
31
+ "tp": 16,
32
+ "fp": 0,
33
+ "fn": 0
34
+ },
35
+ "PHONE_NUMBER": {
36
+ "precision": 1.0,
37
+ "recall": 1.0,
38
+ "f1": 1.0,
39
+ "tp": 2,
40
+ "fp": 0,
41
+ "fn": 0
42
+ },
43
+ "POSTCODE": {
44
+ "precision": 1.0,
45
+ "recall": 1.0,
46
+ "f1": 1.0,
47
+ "tp": 12,
48
+ "fp": 0,
49
+ "fn": 0
50
+ },
51
+ "STREET_ADDRESS": {
52
+ "precision": 1.0,
53
+ "recall": 1.0,
54
+ "f1": 1.0,
55
+ "tp": 12,
56
+ "fp": 0,
57
+ "fn": 0
58
+ }
59
+ },
60
+ "backend": "onnx_q8"
61
+ }
eval/q8_globalpointer_location_coverage_v2.json ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc9",
3
+ "input": "eval/globalpointer_location_coverage_v2.jsonl",
4
+ "loader_type": "global_pointer_onnx",
5
+ "examples": 24,
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "elapsed_seconds": 0.37797363102436066,
9
+ "examples_per_second": 63.49649295628558,
10
+ "overall": {
11
+ "precision": 1.0,
12
+ "recall": 1.0,
13
+ "f1": 1.0,
14
+ "tp": 68,
15
+ "fp": 0,
16
+ "fn": 0
17
+ },
18
+ "by_label": {
19
+ "CITY": {
20
+ "precision": 1.0,
21
+ "recall": 1.0,
22
+ "f1": 1.0,
23
+ "tp": 20,
24
+ "fp": 0,
25
+ "fn": 0
26
+ },
27
+ "COUNTY": {
28
+ "precision": 1.0,
29
+ "recall": 1.0,
30
+ "f1": 1.0,
31
+ "tp": 22,
32
+ "fp": 0,
33
+ "fn": 0
34
+ },
35
+ "PHONE_NUMBER": {
36
+ "precision": 1.0,
37
+ "recall": 1.0,
38
+ "f1": 1.0,
39
+ "tp": 2,
40
+ "fp": 0,
41
+ "fn": 0
42
+ },
43
+ "POSTCODE": {
44
+ "precision": 1.0,
45
+ "recall": 1.0,
46
+ "f1": 1.0,
47
+ "tp": 12,
48
+ "fp": 0,
49
+ "fn": 0
50
+ },
51
+ "STREET_ADDRESS": {
52
+ "precision": 1.0,
53
+ "recall": 1.0,
54
+ "f1": 1.0,
55
+ "tp": 12,
56
+ "fp": 0,
57
+ "fn": 0
58
+ }
59
+ },
60
+ "backend": "onnx_q8"
61
+ }
eval/q8_globalpointer_location_coverage_v3.json ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc9",
3
+ "input": "eval/globalpointer_location_coverage_v3.jsonl",
4
+ "loader_type": "global_pointer_onnx",
5
+ "examples": 30,
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "elapsed_seconds": 0.2887980790110305,
9
+ "examples_per_second": 103.87880730624308,
10
+ "overall": {
11
+ "precision": 1.0,
12
+ "recall": 1.0,
13
+ "f1": 1.0,
14
+ "tp": 82,
15
+ "fp": 0,
16
+ "fn": 0
17
+ },
18
+ "by_label": {
19
+ "CITY": {
20
+ "precision": 1.0,
21
+ "recall": 1.0,
22
+ "f1": 1.0,
23
+ "tp": 26,
24
+ "fp": 0,
25
+ "fn": 0
26
+ },
27
+ "COUNTY": {
28
+ "precision": 1.0,
29
+ "recall": 1.0,
30
+ "f1": 1.0,
31
+ "tp": 28,
32
+ "fp": 0,
33
+ "fn": 0
34
+ },
35
+ "PHONE_NUMBER": {
36
+ "precision": 1.0,
37
+ "recall": 1.0,
38
+ "f1": 1.0,
39
+ "tp": 2,
40
+ "fp": 0,
41
+ "fn": 0
42
+ },
43
+ "POSTCODE": {
44
+ "precision": 1.0,
45
+ "recall": 1.0,
46
+ "f1": 1.0,
47
+ "tp": 13,
48
+ "fp": 0,
49
+ "fn": 0
50
+ },
51
+ "STREET_ADDRESS": {
52
+ "precision": 1.0,
53
+ "recall": 1.0,
54
+ "f1": 1.0,
55
+ "tp": 13,
56
+ "fp": 0,
57
+ "fn": 0
58
+ }
59
+ },
60
+ "backend": "onnx_q8"
61
+ }
eval/q8_irish_core_pii_v1.json ADDED
@@ -0,0 +1,109 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc10",
3
+ "input": "eval/irish_core_pii_v1.jsonl",
4
+ "loader_type": "global_pointer_onnx",
5
+ "examples": 37,
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "elapsed_seconds": 0.2940682880580425,
9
+ "examples_per_second": 125.82111537540908,
10
+ "overall": {
11
+ "precision": 1.0,
12
+ "recall": 1.0,
13
+ "f1": 1.0,
14
+ "tp": 76,
15
+ "fp": 0,
16
+ "fn": 0
17
+ },
18
+ "by_label": {
19
+ "ACCOUNT_NUMBER": {
20
+ "precision": 1.0,
21
+ "recall": 1.0,
22
+ "f1": 1.0,
23
+ "tp": 3,
24
+ "fp": 0,
25
+ "fn": 0
26
+ },
27
+ "BANK_ROUTING_NUMBER": {
28
+ "precision": 1.0,
29
+ "recall": 1.0,
30
+ "f1": 1.0,
31
+ "tp": 1,
32
+ "fp": 0,
33
+ "fn": 0
34
+ },
35
+ "CREDIT_DEBIT_CARD": {
36
+ "precision": 1.0,
37
+ "recall": 1.0,
38
+ "f1": 1.0,
39
+ "tp": 2,
40
+ "fp": 0,
41
+ "fn": 0
42
+ },
43
+ "EMAIL": {
44
+ "precision": 1.0,
45
+ "recall": 1.0,
46
+ "f1": 1.0,
47
+ "tp": 6,
48
+ "fp": 0,
49
+ "fn": 0
50
+ },
51
+ "FIRST_NAME": {
52
+ "precision": 1.0,
53
+ "recall": 1.0,
54
+ "f1": 1.0,
55
+ "tp": 19,
56
+ "fp": 0,
57
+ "fn": 0
58
+ },
59
+ "LAST_NAME": {
60
+ "precision": 1.0,
61
+ "recall": 1.0,
62
+ "f1": 1.0,
63
+ "tp": 19,
64
+ "fp": 0,
65
+ "fn": 0
66
+ },
67
+ "PASSPORT_NUMBER": {
68
+ "precision": 1.0,
69
+ "recall": 1.0,
70
+ "f1": 1.0,
71
+ "tp": 2,
72
+ "fp": 0,
73
+ "fn": 0
74
+ },
75
+ "PHONE_NUMBER": {
76
+ "precision": 1.0,
77
+ "recall": 1.0,
78
+ "f1": 1.0,
79
+ "tp": 12,
80
+ "fp": 0,
81
+ "fn": 0
82
+ },
83
+ "POSTCODE": {
84
+ "precision": 1.0,
85
+ "recall": 1.0,
86
+ "f1": 1.0,
87
+ "tp": 4,
88
+ "fp": 0,
89
+ "fn": 0
90
+ },
91
+ "PPSN": {
92
+ "precision": 1.0,
93
+ "recall": 1.0,
94
+ "f1": 1.0,
95
+ "tp": 6,
96
+ "fp": 0,
97
+ "fn": 0
98
+ },
99
+ "SWIFT_BIC": {
100
+ "precision": 1.0,
101
+ "recall": 1.0,
102
+ "f1": 1.0,
103
+ "tp": 2,
104
+ "fp": 0,
105
+ "fn": 0
106
+ }
107
+ },
108
+ "backend": "onnx_q8"
109
+ }
eval/q8_irish_dllm_hardening_exact_v1.json ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc1",
3
+ "input": "irish_dllm_hardening_exact_v1.jsonl",
4
+ "loader_type": "global_pointer_onnx",
5
+ "examples": 14,
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "elapsed_seconds": 0.12445017893332988,
9
+ "examples_per_second": 112.49481615852109,
10
+ "overall": {
11
+ "precision": 1.0,
12
+ "recall": 1.0,
13
+ "f1": 1.0,
14
+ "tp": 20,
15
+ "fp": 0,
16
+ "fn": 0
17
+ },
18
+ "by_label": {
19
+ "ACCOUNT_NUMBER": {
20
+ "precision": 1.0,
21
+ "recall": 1.0,
22
+ "f1": 1.0,
23
+ "tp": 1,
24
+ "fp": 0,
25
+ "fn": 0
26
+ },
27
+ "BANK_ROUTING_NUMBER": {
28
+ "precision": 1.0,
29
+ "recall": 1.0,
30
+ "f1": 1.0,
31
+ "tp": 2,
32
+ "fp": 0,
33
+ "fn": 0
34
+ },
35
+ "CREDIT_DEBIT_CARD": {
36
+ "precision": 1.0,
37
+ "recall": 1.0,
38
+ "f1": 1.0,
39
+ "tp": 2,
40
+ "fp": 0,
41
+ "fn": 0
42
+ },
43
+ "EMAIL": {
44
+ "precision": 1.0,
45
+ "recall": 1.0,
46
+ "f1": 1.0,
47
+ "tp": 2,
48
+ "fp": 0,
49
+ "fn": 0
50
+ },
51
+ "FIRST_NAME": {
52
+ "precision": 1.0,
53
+ "recall": 1.0,
54
+ "f1": 1.0,
55
+ "tp": 1,
56
+ "fp": 0,
57
+ "fn": 0
58
+ },
59
+ "LAST_NAME": {
60
+ "precision": 1.0,
61
+ "recall": 1.0,
62
+ "f1": 1.0,
63
+ "tp": 1,
64
+ "fp": 0,
65
+ "fn": 0
66
+ },
67
+ "PHONE_NUMBER": {
68
+ "precision": 1.0,
69
+ "recall": 1.0,
70
+ "f1": 1.0,
71
+ "tp": 2,
72
+ "fp": 0,
73
+ "fn": 0
74
+ },
75
+ "POSTCODE": {
76
+ "precision": 1.0,
77
+ "recall": 1.0,
78
+ "f1": 1.0,
79
+ "tp": 3,
80
+ "fp": 0,
81
+ "fn": 0
82
+ },
83
+ "PPSN": {
84
+ "precision": 1.0,
85
+ "recall": 1.0,
86
+ "f1": 1.0,
87
+ "tp": 3,
88
+ "fp": 0,
89
+ "fn": 0
90
+ },
91
+ "SWIFT_BIC": {
92
+ "precision": 1.0,
93
+ "recall": 1.0,
94
+ "f1": 1.0,
95
+ "tp": 3,
96
+ "fp": 0,
97
+ "fn": 0
98
+ }
99
+ },
100
+ "release_backend": "onnx_q8"
101
+ }
eval/q8_irish_extended_pii_v1.json ADDED
@@ -0,0 +1,109 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc9",
3
+ "input": "eval/irish_extended_pii_v1.jsonl",
4
+ "loader_type": "global_pointer_onnx",
5
+ "examples": 14,
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "elapsed_seconds": 0.318285096087493,
9
+ "examples_per_second": 43.98572277525542,
10
+ "overall": {
11
+ "precision": 1.0,
12
+ "recall": 1.0,
13
+ "f1": 1.0,
14
+ "tp": 50,
15
+ "fp": 0,
16
+ "fn": 0
17
+ },
18
+ "by_label": {
19
+ "AGE": {
20
+ "precision": 1.0,
21
+ "recall": 1.0,
22
+ "f1": 1.0,
23
+ "tp": 5,
24
+ "fp": 0,
25
+ "fn": 0
26
+ },
27
+ "CITY": {
28
+ "precision": 1.0,
29
+ "recall": 1.0,
30
+ "f1": 1.0,
31
+ "tp": 8,
32
+ "fp": 0,
33
+ "fn": 0
34
+ },
35
+ "COUNTY": {
36
+ "precision": 1.0,
37
+ "recall": 1.0,
38
+ "f1": 1.0,
39
+ "tp": 6,
40
+ "fp": 0,
41
+ "fn": 0
42
+ },
43
+ "DATE_OF_BIRTH": {
44
+ "precision": 1.0,
45
+ "recall": 1.0,
46
+ "f1": 1.0,
47
+ "tp": 6,
48
+ "fp": 0,
49
+ "fn": 0
50
+ },
51
+ "EMAIL": {
52
+ "precision": 1.0,
53
+ "recall": 1.0,
54
+ "f1": 1.0,
55
+ "tp": 1,
56
+ "fp": 0,
57
+ "fn": 0
58
+ },
59
+ "FIRST_NAME": {
60
+ "precision": 1.0,
61
+ "recall": 1.0,
62
+ "f1": 1.0,
63
+ "tp": 2,
64
+ "fp": 0,
65
+ "fn": 0
66
+ },
67
+ "LAST_NAME": {
68
+ "precision": 1.0,
69
+ "recall": 1.0,
70
+ "f1": 1.0,
71
+ "tp": 2,
72
+ "fp": 0,
73
+ "fn": 0
74
+ },
75
+ "PHONE_NUMBER": {
76
+ "precision": 1.0,
77
+ "recall": 1.0,
78
+ "f1": 1.0,
79
+ "tp": 2,
80
+ "fp": 0,
81
+ "fn": 0
82
+ },
83
+ "POSTCODE": {
84
+ "precision": 1.0,
85
+ "recall": 1.0,
86
+ "f1": 1.0,
87
+ "tp": 8,
88
+ "fp": 0,
89
+ "fn": 0
90
+ },
91
+ "PPSN": {
92
+ "precision": 1.0,
93
+ "recall": 1.0,
94
+ "f1": 1.0,
95
+ "tp": 2,
96
+ "fp": 0,
97
+ "fn": 0
98
+ },
99
+ "STREET_ADDRESS": {
100
+ "precision": 1.0,
101
+ "recall": 1.0,
102
+ "f1": 1.0,
103
+ "tp": 8,
104
+ "fp": 0,
105
+ "fn": 0
106
+ }
107
+ },
108
+ "backend": "onnx_q8"
109
+ }
eval/q8_irish_gov_chatbot_gap_holdout_v1.json ADDED
@@ -0,0 +1,258 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "temsa/IrishCore-GlobalPointer-ContextPII-135M-v1-rc1",
3
+ "family": "globalpointer",
4
+ "backend": "onnx",
5
+ "input": "irish_gov_chatbot_gap_holdout_v1.jsonl",
6
+ "min_score": 0.5,
7
+ "iou_threshold": 0.5,
8
+ "overall": {
9
+ "precision": 1.0,
10
+ "recall": 1.0,
11
+ "f1": 1.0,
12
+ "tp": 413,
13
+ "fp": 0,
14
+ "fn": 0
15
+ },
16
+ "exact": {
17
+ "precision": 1.0,
18
+ "recall": 1.0,
19
+ "f1": 1.0,
20
+ "tp": 413,
21
+ "fp": 0,
22
+ "fn": 0
23
+ },
24
+ "by_label": {
25
+ "ACCOUNT_NUMBER": {
26
+ "precision": 1.0,
27
+ "recall": 1.0,
28
+ "f1": 1.0,
29
+ "tp": 16,
30
+ "fp": 0,
31
+ "fn": 0
32
+ },
33
+ "BANK_ROUTING_NUMBER": {
34
+ "precision": 1.0,
35
+ "recall": 1.0,
36
+ "f1": 1.0,
37
+ "tp": 23,
38
+ "fp": 0,
39
+ "fn": 0
40
+ },
41
+ "CREDIT_DEBIT_CARD": {
42
+ "precision": 1.0,
43
+ "recall": 1.0,
44
+ "f1": 1.0,
45
+ "tp": 6,
46
+ "fp": 0,
47
+ "fn": 0
48
+ },
49
+ "EMAIL": {
50
+ "precision": 1.0,
51
+ "recall": 1.0,
52
+ "f1": 1.0,
53
+ "tp": 50,
54
+ "fp": 0,
55
+ "fn": 0
56
+ },
57
+ "FIRST_NAME": {
58
+ "precision": 1.0,
59
+ "recall": 1.0,
60
+ "f1": 1.0,
61
+ "tp": 70,
62
+ "fp": 0,
63
+ "fn": 0
64
+ },
65
+ "LAST_NAME": {
66
+ "precision": 1.0,
67
+ "recall": 1.0,
68
+ "f1": 1.0,
69
+ "tp": 70,
70
+ "fp": 0,
71
+ "fn": 0
72
+ },
73
+ "PHONE_NUMBER": {
74
+ "precision": 1.0,
75
+ "recall": 1.0,
76
+ "f1": 1.0,
77
+ "tp": 72,
78
+ "fp": 0,
79
+ "fn": 0
80
+ },
81
+ "POSTCODE": {
82
+ "precision": 1.0,
83
+ "recall": 1.0,
84
+ "f1": 1.0,
85
+ "tp": 18,
86
+ "fp": 0,
87
+ "fn": 0
88
+ },
89
+ "PPSN": {
90
+ "precision": 1.0,
91
+ "recall": 1.0,
92
+ "f1": 1.0,
93
+ "tp": 72,
94
+ "fp": 0,
95
+ "fn": 0
96
+ },
97
+ "SWIFT_BIC": {
98
+ "precision": 1.0,
99
+ "recall": 1.0,
100
+ "f1": 1.0,
101
+ "tp": 16,
102
+ "fp": 0,
103
+ "fn": 0
104
+ }
105
+ },
106
+ "by_language": {
107
+ "en": {
108
+ "precision": 1.0,
109
+ "recall": 1.0,
110
+ "f1": 1.0,
111
+ "tp": 230,
112
+ "fp": 0,
113
+ "fn": 0
114
+ },
115
+ "ga": {
116
+ "precision": 1.0,
117
+ "recall": 1.0,
118
+ "f1": 1.0,
119
+ "tp": 183,
120
+ "fp": 0,
121
+ "fn": 0
122
+ }
123
+ },
124
+ "by_role": {
125
+ "assistant": {
126
+ "precision": 1.0,
127
+ "recall": 1.0,
128
+ "f1": 1.0,
129
+ "tp": 72,
130
+ "fp": 0,
131
+ "fn": 0
132
+ },
133
+ "mixed": {
134
+ "precision": 0.0,
135
+ "recall": 0.0,
136
+ "f1": 0.0,
137
+ "tp": 0,
138
+ "fp": 0,
139
+ "fn": 0
140
+ },
141
+ "user": {
142
+ "precision": 1.0,
143
+ "recall": 1.0,
144
+ "f1": 1.0,
145
+ "tp": 341,
146
+ "fp": 0,
147
+ "fn": 0
148
+ }
149
+ },
150
+ "by_source_type": {
151
+ "assistant_contact_echo_en": {
152
+ "precision": 1.0,
153
+ "recall": 1.0,
154
+ "f1": 1.0,
155
+ "tp": 32,
156
+ "fp": 0,
157
+ "fn": 0
158
+ },
159
+ "assistant_contact_echo_ga": {
160
+ "precision": 1.0,
161
+ "recall": 1.0,
162
+ "f1": 1.0,
163
+ "tp": 40,
164
+ "fp": 0,
165
+ "fn": 0
166
+ },
167
+ "negative_en": {
168
+ "precision": 0.0,
169
+ "recall": 0.0,
170
+ "f1": 0.0,
171
+ "tp": 0,
172
+ "fp": 0,
173
+ "fn": 0
174
+ },
175
+ "negative_ga": {
176
+ "precision": 0.0,
177
+ "recall": 0.0,
178
+ "f1": 0.0,
179
+ "tp": 0,
180
+ "fp": 0,
181
+ "fn": 0
182
+ },
183
+ "user_card_email_en": {
184
+ "precision": 1.0,
185
+ "recall": 1.0,
186
+ "f1": 1.0,
187
+ "tp": 12,
188
+ "fp": 0,
189
+ "fn": 0
190
+ },
191
+ "user_name_email_ppsn_phone_en": {
192
+ "precision": 1.0,
193
+ "recall": 1.0,
194
+ "f1": 1.0,
195
+ "tp": 80,
196
+ "fp": 0,
197
+ "fn": 0
198
+ },
199
+ "user_name_email_ppsn_phone_ga": {
200
+ "precision": 1.0,
201
+ "recall": 1.0,
202
+ "f1": 1.0,
203
+ "tp": 50,
204
+ "fp": 0,
205
+ "fn": 0
206
+ },
207
+ "user_name_ppsn_phone_en": {
208
+ "precision": 1.0,
209
+ "recall": 1.0,
210
+ "f1": 1.0,
211
+ "tp": 56,
212
+ "fp": 0,
213
+ "fn": 0
214
+ },
215
+ "user_name_ppsn_phone_ga": {
216
+ "precision": 1.0,
217
+ "recall": 1.0,
218
+ "f1": 1.0,
219
+ "tp": 56,
220
+ "fp": 0,
221
+ "fn": 0
222
+ },
223
+ "user_payment_name_en": {
224
+ "precision": 1.0,
225
+ "recall": 1.0,
226
+ "f1": 1.0,
227
+ "tp": 32,
228
+ "fp": 0,
229
+ "fn": 0
230
+ },
231
+ "user_payment_name_ga": {
232
+ "precision": 1.0,
233
+ "recall": 1.0,
234
+ "f1": 1.0,
235
+ "tp": 32,
236
+ "fp": 0,
237
+ "fn": 0
238
+ },
239
+ "user_sort_code_en": {
240
+ "precision": 1.0,
241
+ "recall": 1.0,
242
+ "f1": 1.0,
243
+ "tp": 18,
244
+ "fp": 0,
245
+ "fn": 0
246
+ },
247
+ "user_sort_code_ga": {
248
+ "precision": 1.0,
249
+ "recall": 1.0,
250
+ "f1": 1.0,
251
+ "tp": 5,
252
+ "fp": 0,
253
+ "fn": 0
254
+ }
255
+ },
256
+ "failure_count": 0,
257
+ "failures": []
258
+ }