@stll/anonymize 1.5.0 → 2.0.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ATTRIBUTION.md +70 -0
- package/README.md +86 -48
- package/dist/address-boundaries.mjs +2 -0
- package/dist/address-jurisdiction-prefixes.mjs +16 -0
- package/dist/address-jurisdiction-prefixes.mjs.map +1 -0
- package/dist/address-stop-keywords.mjs +12 -1
- package/dist/address-unit-abbreviations.mjs +15 -0
- package/dist/address-unit-abbreviations.mjs.map +1 -0
- package/dist/clause-noun-heads.mjs +5 -1
- package/dist/coreference-org-determiners.mjs +19 -0
- package/dist/coreference-org-determiners.mjs.map +1 -0
- package/dist/defined-term-heads.mjs +15 -0
- package/dist/defined-term-heads.mjs.map +1 -0
- package/dist/false-positive-shapes.mjs +36 -0
- package/dist/false-positive-shapes.mjs.map +1 -0
- package/dist/index.d.mts +3 -1201
- package/dist/index.mjs +3 -16267
- package/dist/index.mjs.map +1 -1
- package/dist/legal-role-heads.cs.mjs +6 -0
- package/dist/native-node.d.mts +124 -0
- package/dist/native-node.mjs +3 -0
- package/dist/native-node2.d.mts +3 -0
- package/dist/native-node2.mjs +13353 -0
- package/dist/native-node2.mjs.map +1 -0
- package/dist/native.d.mts +1158 -0
- package/dist/native.mjs +230 -0
- package/dist/native.mjs.map +1 -0
- package/dist/native2.d.mts +2 -0
- package/dist/organization-unit-heads.mjs +20 -0
- package/dist/organization-unit-heads.mjs.map +1 -0
- package/dist/person-stopwords.mjs +205 -199
- package/dist/signing-clauses.mjs +33 -9
- package/index.cjs +3 -0
- package/native-pipeline.cs.stlanonpkg +0 -0
- package/native-pipeline.de.stlanonpkg +0 -0
- package/native-pipeline.en.stlanonpkg +0 -0
- package/native-pipeline.stlanonpkg +0 -0
- package/package.json +40 -6
- package/scripts/build-native-pipeline-package.mjs +225 -0
- package/dist/address-prepositions.mjs +0 -182
- package/dist/address-prepositions.mjs.map +0 -1
package/ATTRIBUTION.md
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Attribution
|
|
2
|
+
|
|
3
|
+
This library builds on ideas and patterns from several open-source
|
|
4
|
+
projects and academic research.
|
|
5
|
+
|
|
6
|
+
## Prior Art
|
|
7
|
+
|
|
8
|
+
### Microsoft Presidio (Apache 2.0)
|
|
9
|
+
|
|
10
|
+
- Context-word boosting architecture
|
|
11
|
+
- Structured PII pattern design (IBAN, phone, email)
|
|
12
|
+
- Operator concept (replace vs redact)
|
|
13
|
+
- https://github.com/microsoft/presidio
|
|
14
|
+
|
|
15
|
+
### GLiNER / GLiNER.js (MIT)
|
|
16
|
+
|
|
17
|
+
- Span-level and token-level NER via ONNX
|
|
18
|
+
- The `gliner/` module is an original implementation informed
|
|
19
|
+
by the GLiNER architecture (arXiv:2311.08526)
|
|
20
|
+
- Processor and decoder logic reimplemented from scratch
|
|
21
|
+
- https://github.com/urchade/GLiNER
|
|
22
|
+
|
|
23
|
+
### NameTag / MorphoDiTa (ÚFAL, Charles University)
|
|
24
|
+
|
|
25
|
+
- Czech NER and morphological analysis research
|
|
26
|
+
- Czech name declension suffix patterns
|
|
27
|
+
- https://ufal.mff.cuni.cz/nametag
|
|
28
|
+
- https://ufal.mff.cuni.cz/morphodita
|
|
29
|
+
|
|
30
|
+
### Text Anonymization Benchmark (NorskRegnesentral, MIT)
|
|
31
|
+
|
|
32
|
+
- ECHR court case evaluation methodology
|
|
33
|
+
- Entity type taxonomy for legal documents
|
|
34
|
+
- https://github.com/NorskRegnesentral/text-anonymization-benchmark
|
|
35
|
+
|
|
36
|
+
### Unicode CLDR
|
|
37
|
+
|
|
38
|
+
- Multilingual month name data
|
|
39
|
+
- https://cldr.unicode.org (Unicode License)
|
|
40
|
+
|
|
41
|
+
## Deny List Data Sources
|
|
42
|
+
|
|
43
|
+
### FinNLP/humannames (MIT)
|
|
44
|
+
|
|
45
|
+
- ~195,000 person names (global, multilingual)
|
|
46
|
+
- Used in: `dictionaries/names/global.json`
|
|
47
|
+
- https://github.com/FinNLP/humannames
|
|
48
|
+
- License: MIT
|
|
49
|
+
|
|
50
|
+
### GeoNames (CC BY 4.0)
|
|
51
|
+
|
|
52
|
+
- City and place names from the GeoNames gazetteer
|
|
53
|
+
- Population threshold: ≥1,000 inhabitants
|
|
54
|
+
- Includes native names, ASCII transliterations, and
|
|
55
|
+
alternate names across languages
|
|
56
|
+
- Used in: `dictionaries/cities/*.json`
|
|
57
|
+
- https://www.geonames.org
|
|
58
|
+
- License: Creative Commons Attribution 4.0 International
|
|
59
|
+
|
|
60
|
+
### Wikidata (CC0 1.0)
|
|
61
|
+
|
|
62
|
+
- Courts, banks, insurance companies, government ministries,
|
|
63
|
+
universities, hospitals, and EU institutions
|
|
64
|
+
- Labels and alternate labels in cs, sk, de, en
|
|
65
|
+
- Used in: `dictionaries/courts/`, `dictionaries/banks/`,
|
|
66
|
+
`dictionaries/insurance/`, `dictionaries/government/`,
|
|
67
|
+
`dictionaries/education/`, `dictionaries/healthcare/`,
|
|
68
|
+
`dictionaries/international/`
|
|
69
|
+
- https://www.wikidata.org
|
|
70
|
+
- License: Creative Commons CC0 1.0 Universal
|
package/README.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<img src="../../.github/assets/banner.png" alt="
|
|
2
|
+
<img src="../../.github/assets/banner.png" alt="stella anonymize" width="100%" />
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
5
|
# @stll/anonymize
|
|
@@ -16,50 +16,96 @@ bun add @stll/anonymize
|
|
|
16
16
|
bun add @stll/anonymize-data
|
|
17
17
|
```
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
The Node.js package is Rust-native. Browser/WASM support is maintained through
|
|
20
|
+
`@stll/anonymize-wasm` while the native core remains the v1 product path.
|
|
20
21
|
|
|
21
|
-
## Usage
|
|
22
|
+
## Usage: Node.js native SDK
|
|
22
23
|
|
|
23
24
|
```ts
|
|
24
|
-
import {
|
|
25
|
+
import {
|
|
26
|
+
availableDefaultNativePipelineLanguages,
|
|
27
|
+
getDefaultNativePipeline,
|
|
28
|
+
} from "@stll/anonymize/native-node";
|
|
29
|
+
|
|
30
|
+
const languages = availableDefaultNativePipelineLanguages();
|
|
31
|
+
const anonymizer = getDefaultNativePipeline(
|
|
32
|
+
languages.includes("en") ? { language: "en" } : {},
|
|
33
|
+
);
|
|
34
|
+
const result = anonymizer.redact_text(text);
|
|
35
|
+
|
|
36
|
+
console.log(result.redaction.redactedText);
|
|
37
|
+
```
|
|
25
38
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
"address",
|
|
33
|
-
"date",
|
|
34
|
-
"iban",
|
|
35
|
-
"phone number",
|
|
36
|
-
],
|
|
37
|
-
threshold: 0.5,
|
|
38
|
-
enableRegex: true,
|
|
39
|
-
enableTriggerPhrases: true,
|
|
40
|
-
enableLegalForms: true,
|
|
41
|
-
enableNameCorpus: true,
|
|
42
|
-
enableDenyList: false,
|
|
43
|
-
enableGazetteer: false,
|
|
44
|
-
enableNer: false,
|
|
45
|
-
enableConfidenceBoost: true,
|
|
46
|
-
enableCoreference: true,
|
|
47
|
-
workspaceId: "default",
|
|
48
|
-
},
|
|
49
|
-
gazetteerEntries: [],
|
|
50
|
-
});
|
|
39
|
+
Call `getDefaultNativePipeline()` once during service startup and reuse the returned anonymizer. The package ships with a prepared native package, so the normal request path avoids rebuilding search automata. Use `preloadDefaultNativePipeline()` or `preloadDefaultNativePipelineAsync()` when the first document should not pay lazy regex warm-up.
|
|
40
|
+
|
|
41
|
+
If your deployment knows the document language up front, select a scoped package at startup. The build emits `en`, `cs`, and `de` scoped packages by default, and `STELLA_ANONYMIZE_NATIVE_PACKAGE_LANGUAGES` can replace that list or be set to an empty value to build only the all-language package:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
STELLA_ANONYMIZE_NATIVE_PACKAGE_LANGUAGES=en,cs,fr bun run build
|
|
51
45
|
```
|
|
52
46
|
|
|
53
|
-
|
|
47
|
+
```ts
|
|
48
|
+
const anonymizer = getDefaultNativePipeline({ language: "en" });
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Regional codes use the exact package when present and otherwise fall back to
|
|
52
|
+
the base language package, so `en-US` can use the shipped `en` artifact.
|
|
53
|
+
|
|
54
|
+
For build-time generated packages or caller-owned data, prepare the package before runtime and load the bytes in the process that handles documents.
|
|
54
55
|
|
|
55
|
-
|
|
56
|
+
```bash
|
|
57
|
+
bunx stella-anonymize-build-native-package \
|
|
58
|
+
--config ./anonymize-native-config.mjs \
|
|
59
|
+
--out ./dist/anonymize.stlanonpkg
|
|
60
|
+
```
|
|
56
61
|
|
|
57
62
|
```ts
|
|
58
|
-
|
|
59
|
-
|
|
63
|
+
import { load_prepared_package_file } from "@stll/anonymize/native-node";
|
|
64
|
+
|
|
65
|
+
const anonymizer = load_prepared_package_file("./dist/anonymize.stlanonpkg");
|
|
66
|
+
anonymizer.warmLazyRegex();
|
|
67
|
+
const warmDiagnosticsJson = anonymizer.warmLazyRegexDiagnosticsJson();
|
|
68
|
+
const result = anonymizer.redact_text(text, { redactString: "***" });
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
The config module may export a `PipelineConfig` directly or `{ config, gazetteerEntries }`. Include `@stll/anonymize-data` dictionaries there if your runtime config uses the deny-list or name-corpus layers; keep the corresponding layers enabled for caller-owned `customDenyList`, `customRegexes`, and gazetteers. Those inputs are part of the prepared package and should be regenerated when they change.
|
|
72
|
+
|
|
73
|
+
## Python SDK
|
|
74
|
+
|
|
75
|
+
```py
|
|
76
|
+
import stella_anonymize as anonymize
|
|
77
|
+
|
|
78
|
+
languages = anonymize.available_default_native_pipeline_languages()
|
|
79
|
+
prepared = anonymize.preload_default_native_pipeline(
|
|
80
|
+
language="en" if "en" in languages else None
|
|
81
|
+
)
|
|
82
|
+
result = prepared.redact_text(text, redact_string="***")
|
|
83
|
+
|
|
84
|
+
print(result.redaction.redacted_text)
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
The Python SDK uses the same Rust core and prepared-package contract as the Node SDK. Prefer `get_default_native_pipeline()`, `preload_default_native_pipeline()`, `load_prepared_package()`, or `load_prepared_package_file()` for repeated calls; top-level `redact_text()` and `redact_text_json()` prepare from config on each call.
|
|
88
|
+
|
|
89
|
+
## Caller-Owned Deny Lists and Regexes
|
|
90
|
+
|
|
91
|
+
Use `customDenyList` for exact terms and variants that you control. Use
|
|
92
|
+
`customRegexes` for deterministic patterns that are not built into the package.
|
|
93
|
+
Caller-owned data is part of the prepared package, so build or load a package
|
|
94
|
+
from that config before serving documents.
|
|
95
|
+
|
|
96
|
+
```ts
|
|
97
|
+
import {
|
|
98
|
+
createNativePipelineFromConfig,
|
|
99
|
+
loadNativeAnonymizeBinding,
|
|
100
|
+
} from "@stll/anonymize/native-node";
|
|
101
|
+
|
|
102
|
+
const binding = loadNativeAnonymizeBinding();
|
|
103
|
+
const pipeline = await createNativePipelineFromConfig({
|
|
104
|
+
binding,
|
|
60
105
|
config: {
|
|
61
106
|
...baseConfig,
|
|
62
107
|
enableDenyList: true,
|
|
108
|
+
enableRegex: true,
|
|
63
109
|
customDenyList: [
|
|
64
110
|
{
|
|
65
111
|
value: "Project Nebula",
|
|
@@ -67,19 +113,6 @@ const entities = await runPipeline({
|
|
|
67
113
|
label: "organization",
|
|
68
114
|
},
|
|
69
115
|
],
|
|
70
|
-
},
|
|
71
|
-
gazetteerEntries: [],
|
|
72
|
-
});
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
Use `customRegexes` for deterministic patterns that are not built into the package. These are matched by the regex layer, so keep `enableRegex: true`.
|
|
76
|
-
|
|
77
|
-
```ts
|
|
78
|
-
const entities = await runPipeline({
|
|
79
|
-
fullText: text,
|
|
80
|
-
config: {
|
|
81
|
-
...baseConfig,
|
|
82
|
-
enableRegex: true,
|
|
83
116
|
customRegexes: [
|
|
84
117
|
{
|
|
85
118
|
pattern: "\\bSTLL-[0-9]{4}\\b",
|
|
@@ -90,6 +123,8 @@ const entities = await runPipeline({
|
|
|
90
123
|
},
|
|
91
124
|
gazetteerEntries: [],
|
|
92
125
|
});
|
|
126
|
+
|
|
127
|
+
const result = pipeline.redactText(text);
|
|
93
128
|
```
|
|
94
129
|
|
|
95
130
|
## Browser setup
|
|
@@ -106,10 +141,13 @@ export default {
|
|
|
106
141
|
|
|
107
142
|
## Notes
|
|
108
143
|
|
|
144
|
+
- Native architecture and extension guidance:
|
|
145
|
+
[`ARCHITECTURE.md`](ARCHITECTURE.md).
|
|
109
146
|
- `labels: []` disables deterministic label filtering; when NER is enabled it falls back to the default label set.
|
|
110
147
|
- `enableNameCorpus` also controls whether first names, surnames, and titles are injected into deny-list matching when `enableDenyList` is enabled.
|
|
111
|
-
- The optional `@stll/anonymize-data` package carries the published dictionary and trigger data used
|
|
112
|
-
- `customDenyList` and `customRegexes` are part of the
|
|
148
|
+
- The optional `@stll/anonymize-data` package carries the published dictionary and trigger data used when building prepared packages.
|
|
149
|
+
- `customDenyList` and `customRegexes` are part of the prepared package input and should be regenerated when they change.
|
|
150
|
+
- The old TypeScript pipeline is kept only as temporary internal migration/test scaffolding under `src/legacy.ts`; it is not the product runtime.
|
|
113
151
|
|
|
114
152
|
## Built on
|
|
115
153
|
|
|
@@ -6,6 +6,7 @@ var address_boundaries_default = {
|
|
|
6
6
|
"jednajícím",
|
|
7
7
|
"jejímž jménem",
|
|
8
8
|
"kontaktní osoba",
|
|
9
|
+
"pokud",
|
|
9
10
|
"zapsán",
|
|
10
11
|
"zapsaná",
|
|
11
12
|
"zapsané",
|
|
@@ -36,6 +37,7 @@ var address_boundaries_default = {
|
|
|
36
37
|
"shall govern",
|
|
37
38
|
"shall be governed",
|
|
38
39
|
"to be enforced",
|
|
40
|
+
"with a copy",
|
|
39
41
|
"with the intention",
|
|
40
42
|
"without reference",
|
|
41
43
|
"without regard"
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
//#region src/data/address-jurisdiction-prefixes.json
|
|
2
|
+
var _comment = "Address-like jurisdiction prefixes that are valid location/address spans without digits or street-type words. Lowercased and organized per language.";
|
|
3
|
+
var en = [
|
|
4
|
+
"commonwealth of",
|
|
5
|
+
"district of",
|
|
6
|
+
"state of",
|
|
7
|
+
"territory of"
|
|
8
|
+
];
|
|
9
|
+
var address_jurisdiction_prefixes_default = {
|
|
10
|
+
_comment,
|
|
11
|
+
en
|
|
12
|
+
};
|
|
13
|
+
//#endregion
|
|
14
|
+
export { _comment, address_jurisdiction_prefixes_default as default, en };
|
|
15
|
+
|
|
16
|
+
//# sourceMappingURL=address-jurisdiction-prefixes.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"address-jurisdiction-prefixes.mjs","names":[],"sources":["../src/data/address-jurisdiction-prefixes.json"],"sourcesContent":[""],"mappings":""}
|
|
@@ -17,6 +17,16 @@ var cs = [
|
|
|
17
17
|
"ičo",
|
|
18
18
|
"ič"
|
|
19
19
|
];
|
|
20
|
+
var de = [
|
|
21
|
+
"bank",
|
|
22
|
+
"bic",
|
|
23
|
+
"iban",
|
|
24
|
+
"steuer-id",
|
|
25
|
+
"steueridentifikationsnummer",
|
|
26
|
+
"steuernummer",
|
|
27
|
+
"ust-idnr",
|
|
28
|
+
"ust-idnr."
|
|
29
|
+
];
|
|
20
30
|
var en = [
|
|
21
31
|
"e-mail",
|
|
22
32
|
"email",
|
|
@@ -123,6 +133,7 @@ var it = [
|
|
|
123
133
|
var address_stop_keywords_default = {
|
|
124
134
|
_comment,
|
|
125
135
|
cs,
|
|
136
|
+
de,
|
|
126
137
|
en,
|
|
127
138
|
pl,
|
|
128
139
|
fr,
|
|
@@ -132,6 +143,6 @@ var address_stop_keywords_default = {
|
|
|
132
143
|
it
|
|
133
144
|
};
|
|
134
145
|
//#endregion
|
|
135
|
-
export { _comment, cs, address_stop_keywords_default as default, en, es, fr, it, pl, pt_br as "pt-br", sk };
|
|
146
|
+
export { _comment, cs, de, address_stop_keywords_default as default, en, es, fr, it, pl, pt_br as "pt-br", sk };
|
|
136
147
|
|
|
137
148
|
//# sourceMappingURL=address-stop-keywords.mjs.map
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
//#region src/data/address-unit-abbreviations.json
|
|
2
|
+
var address_unit_abbreviations_default = {
|
|
3
|
+
_comment: "Dotted address unit abbreviations that should not terminate address seed expansion. Organised per language because abbreviations are locale-specific.",
|
|
4
|
+
en: [
|
|
5
|
+
"apt.",
|
|
6
|
+
"bldg.",
|
|
7
|
+
"fl.",
|
|
8
|
+
"ste.",
|
|
9
|
+
"unit."
|
|
10
|
+
]
|
|
11
|
+
};
|
|
12
|
+
//#endregion
|
|
13
|
+
export { address_unit_abbreviations_default as default };
|
|
14
|
+
|
|
15
|
+
//# sourceMappingURL=address-unit-abbreviations.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"address-unit-abbreviations.mjs","names":[],"sources":["../src/data/address-unit-abbreviations.json"],"sourcesContent":[""],"mappings":""}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//#region src/data/coreference-org-determiners.json
|
|
2
|
+
var _comment = "Organization reference determiners used before propagated bare organization names. Values are regex fragments grouped by language.";
|
|
3
|
+
var cs = ["společnost(?:i|í|em|u)?", "spolecnost(?:i|em|u)?"];
|
|
4
|
+
var de = ["die\\s+(?:gesellschaft|firma)"];
|
|
5
|
+
var en = ["the\\s+(?:company|corporation|firm)"];
|
|
6
|
+
var es = ["la\\s+(?:empresa|sociedad)", "el\\s+(?:empresa|sociedad)"];
|
|
7
|
+
var fr = ["la\\s+société"];
|
|
8
|
+
var coreference_org_determiners_default = {
|
|
9
|
+
_comment,
|
|
10
|
+
cs,
|
|
11
|
+
de,
|
|
12
|
+
en,
|
|
13
|
+
es,
|
|
14
|
+
fr
|
|
15
|
+
};
|
|
16
|
+
//#endregion
|
|
17
|
+
export { _comment, cs, de, coreference_org_determiners_default as default, en, es, fr };
|
|
18
|
+
|
|
19
|
+
//# sourceMappingURL=coreference-org-determiners.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coreference-org-determiners.mjs","names":[],"sources":["../src/data/coreference-org-determiners.json"],"sourcesContent":[""],"mappings":""}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
//#region src/data/defined-term-heads.json
|
|
2
|
+
var _comment = "Common head nouns for capitalized defined/legal concepts. These are not person names by themselves; detector-specific filters assemble this vocabulary where needed. Lowercased and organized per language.";
|
|
3
|
+
var en = [
|
|
4
|
+
"association",
|
|
5
|
+
"period",
|
|
6
|
+
"reform"
|
|
7
|
+
];
|
|
8
|
+
var defined_term_heads_default = {
|
|
9
|
+
_comment,
|
|
10
|
+
en
|
|
11
|
+
};
|
|
12
|
+
//#endregion
|
|
13
|
+
export { _comment, defined_term_heads_default as default, en };
|
|
14
|
+
|
|
15
|
+
//# sourceMappingURL=defined-term-heads.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defined-term-heads.mjs","names":[],"sources":["../src/data/defined-term-heads.json"],"sourcesContent":[""],"mappings":""}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
//#region src/data/false-positive-shapes.json
|
|
2
|
+
var _comment = "Language-keyed lexical markers used by false-positive shape guards.";
|
|
3
|
+
var addressComponentTerms = { "cs": [
|
|
4
|
+
"č.p.",
|
|
5
|
+
"č.ev.",
|
|
6
|
+
"č.",
|
|
7
|
+
"sídliště"
|
|
8
|
+
] };
|
|
9
|
+
var ambiguousStreetTypeTerms = { "fr": ["cours"] };
|
|
10
|
+
var numberAbbrevPrefixes = {
|
|
11
|
+
"cs": ["čís.", "č."],
|
|
12
|
+
"de": ["nr."],
|
|
13
|
+
"en": ["no.", "n."]
|
|
14
|
+
};
|
|
15
|
+
var documentHeadingOrdinalMarkers = {
|
|
16
|
+
"cs": ["č.", "č"],
|
|
17
|
+
"de": ["nr.", "nr"],
|
|
18
|
+
"en": [
|
|
19
|
+
"no.",
|
|
20
|
+
"no",
|
|
21
|
+
"n.",
|
|
22
|
+
"n"
|
|
23
|
+
],
|
|
24
|
+
"global": ["#"]
|
|
25
|
+
};
|
|
26
|
+
var false_positive_shapes_default = {
|
|
27
|
+
_comment,
|
|
28
|
+
addressComponentTerms,
|
|
29
|
+
ambiguousStreetTypeTerms,
|
|
30
|
+
numberAbbrevPrefixes,
|
|
31
|
+
documentHeadingOrdinalMarkers
|
|
32
|
+
};
|
|
33
|
+
//#endregion
|
|
34
|
+
export { _comment, addressComponentTerms, ambiguousStreetTypeTerms, false_positive_shapes_default as default, documentHeadingOrdinalMarkers, numberAbbrevPrefixes };
|
|
35
|
+
|
|
36
|
+
//# sourceMappingURL=false-positive-shapes.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"false-positive-shapes.mjs","names":[],"sources":["../src/data/false-positive-shapes.json"],"sourcesContent":[""],"mappings":""}
|