@mailwoman/match 4.16.2 → 5.0.0
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/out/blocking.d.ts +16 -18
- package/out/blocking.d.ts.map +1 -1
- package/out/blocking.js +16 -18
- package/out/blocking.js.map +1 -1
- package/out/clustering.d.ts +14 -20
- package/out/clustering.d.ts.map +1 -1
- package/out/clustering.js +12 -13
- package/out/clustering.js.map +1 -1
- package/out/comparators.d.ts +11 -12
- package/out/comparators.d.ts.map +1 -1
- package/out/comparators.js +11 -12
- package/out/comparators.js.map +1 -1
- package/out/distance.d.ts +21 -26
- package/out/distance.d.ts.map +1 -1
- package/out/distance.js +21 -26
- package/out/distance.js.map +1 -1
- package/out/em.d.ts +3 -3
- package/out/em.d.ts.map +1 -1
- package/out/em.js +4 -5
- package/out/em.js.map +1 -1
- package/out/fellegi-sunter.d.ts +12 -14
- package/out/fellegi-sunter.d.ts.map +1 -1
- package/out/fellegi-sunter.js +5 -6
- package/out/fellegi-sunter.js.map +1 -1
- package/out/gbt.d.ts +1 -2
- package/out/gbt.d.ts.map +1 -1
- package/out/gbt.js +1 -2
- package/out/gbt.js.map +1 -1
- package/out/tf.d.ts +7 -8
- package/out/tf.d.ts.map +1 -1
- package/out/tf.js +7 -8
- package/out/tf.js.map +1 -1
- package/package.json +11 -11
package/out/blocking.d.ts
CHANGED
|
@@ -26,33 +26,31 @@ export interface LatLon {
|
|
|
26
26
|
longitude: number;
|
|
27
27
|
}
|
|
28
28
|
/**
|
|
29
|
-
* A spatial-cell block key: a configurable lat/lon grid. `precisionDegrees` sets the cell size
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* cells, so a pair straddling a cell boundary still meets.
|
|
29
|
+
* A spatial-cell block key: a configurable lat/lon grid. `precisionDegrees` sets the cell size (default 0.05° ≈ 5.5 km
|
|
30
|
+
* of latitude — deliberately generous, per the literature, so same-place records reliably co-block). With `neighbors`
|
|
31
|
+
* (default `true`) a record also keys its 8 adjacent cells, so a pair straddling a cell boundary still meets.
|
|
33
32
|
*
|
|
34
|
-
* Note: an equal-_degree_ grid (longitude cells shrink toward the poles) and neighbour expansion
|
|
35
|
-
*
|
|
36
|
-
*
|
|
33
|
+
* Note: an equal-_degree_ grid (longitude cells shrink toward the poles) and neighbour expansion inflates block sizes
|
|
34
|
+
* ~9×; an equal-area H3/geohash index with a single-cell + neighbour-query is the refinement. Behaviour — proximity
|
|
35
|
+
* co-blocking — is the same.
|
|
37
36
|
*/
|
|
38
37
|
export declare function geoCellKey<R>(extract: (record: R) => LatLon | null | undefined, opts?: {
|
|
39
38
|
precisionDegrees?: number;
|
|
40
39
|
neighbors?: boolean;
|
|
41
40
|
}): BlockingKey<R>;
|
|
42
41
|
/**
|
|
43
|
-
* An exact-value block key (the canonical address key, a postcode, an email domain…), normalized
|
|
44
|
-
*
|
|
45
|
-
*
|
|
42
|
+
* An exact-value block key (the canonical address key, a postcode, an email domain…), normalized and optionally
|
|
43
|
+
* truncated to a leading `prefix` of characters (a cheaper, higher-recall rule). A missing or empty value produces no
|
|
44
|
+
* key.
|
|
46
45
|
*/
|
|
47
46
|
export declare function exactKey<R>(extract: (record: R) => string | null | undefined, opts?: {
|
|
48
47
|
prefix?: number;
|
|
49
48
|
normalize?: (value: string) => string;
|
|
50
49
|
}): BlockingKey<R>;
|
|
51
50
|
/**
|
|
52
|
-
* A conjunctive block key — the cross-product of its sub-keys, joined (Geo-ER's "name AND
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
* rule is too loose.
|
|
51
|
+
* A conjunctive block key — the cross-product of its sub-keys, joined (Geo-ER's "name AND distance"). A record is keyed
|
|
52
|
+
* by every combination of one sub-key from each input, so two records co-block only when they agree on _all_ inputs.
|
|
53
|
+
* Tighter blocks, lower recall — use when a single rule is too loose.
|
|
56
54
|
*/
|
|
57
55
|
export declare function conjunction<R>(...keys: BlockingKey<R>[]): BlockingKey<R>;
|
|
58
56
|
/** The outcome of a blocking pass. */
|
|
@@ -66,10 +64,10 @@ export interface BlockResult<R> {
|
|
|
66
64
|
}>;
|
|
67
65
|
}
|
|
68
66
|
/**
|
|
69
|
-
* Generate candidate pairs from `records` via one or more blocking keys (their union). Builds an
|
|
70
|
-
*
|
|
71
|
-
* `
|
|
72
|
-
*
|
|
67
|
+
* Generate candidate pairs from `records` via one or more blocking keys (their union). Builds an inverted index (key →
|
|
68
|
+
* records) and emits the unique within-block pairs. A block larger than `maxBlockSize` is skipped and reported in
|
|
69
|
+
* `droppedBlocks` rather than blowing up into a quadratic scan — an explicit, visible coverage limit, not a silent
|
|
70
|
+
* drop.
|
|
73
71
|
*/
|
|
74
72
|
export declare function block<R>(records: readonly R[], blockingKeys: BlockingKey<R> | BlockingKey<R>[], opts?: {
|
|
75
73
|
maxBlockSize?: number;
|
package/out/blocking.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blocking.d.ts","sourceRoot":"","sources":["../blocking.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,qGAAqG;AACrG,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,MAAM,EAAE,CAAA;AAEpD,uDAAuD;AACvD,MAAM,WAAW,MAAM;IACtB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CACjB;AAED
|
|
1
|
+
{"version":3,"file":"blocking.d.ts","sourceRoot":"","sources":["../blocking.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,qGAAqG;AACrG,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,MAAM,EAAE,CAAA;AAEpD,uDAAuD;AACvD,MAAM,WAAW,MAAM;IACtB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAC3B,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,EACjD,IAAI,GAAE;IAAE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3D,WAAW,CAAC,CAAC,CAAC,CAwBhB;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EACzB,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,EACjD,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;CAAO,GACnE,WAAW,CAAC,CAAC,CAAC,CAahB;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAaxE;AAED,sCAAsC;AACtC,MAAM,WAAW,WAAW,CAAC,CAAC;IAC7B,iGAAiG;IACjG,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IACpB,sGAAsG;IACtG,aAAa,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACnD;AAED;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,CAAC,EACtB,OAAO,EAAE,SAAS,CAAC,EAAE,EACrB,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,EAC/C,IAAI,GAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAA;CAAO,GAClC,WAAW,CAAC,CAAC,CAAC,CA+ChB"}
|
package/out/blocking.js
CHANGED
|
@@ -19,14 +19,13 @@
|
|
|
19
19
|
* default, and any block too large to scan is _reported_, never silently dropped.
|
|
20
20
|
*/
|
|
21
21
|
/**
|
|
22
|
-
* A spatial-cell block key: a configurable lat/lon grid. `precisionDegrees` sets the cell size
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
* cells, so a pair straddling a cell boundary still meets.
|
|
22
|
+
* A spatial-cell block key: a configurable lat/lon grid. `precisionDegrees` sets the cell size (default 0.05° ≈ 5.5 km
|
|
23
|
+
* of latitude — deliberately generous, per the literature, so same-place records reliably co-block). With `neighbors`
|
|
24
|
+
* (default `true`) a record also keys its 8 adjacent cells, so a pair straddling a cell boundary still meets.
|
|
26
25
|
*
|
|
27
|
-
* Note: an equal-_degree_ grid (longitude cells shrink toward the poles) and neighbour expansion
|
|
28
|
-
*
|
|
29
|
-
*
|
|
26
|
+
* Note: an equal-_degree_ grid (longitude cells shrink toward the poles) and neighbour expansion inflates block sizes
|
|
27
|
+
* ~9×; an equal-area H3/geohash index with a single-cell + neighbour-query is the refinement. Behaviour — proximity
|
|
28
|
+
* co-blocking — is the same.
|
|
30
29
|
*/
|
|
31
30
|
export function geoCellKey(extract, opts = {}) {
|
|
32
31
|
const step = opts.precisionDegrees ?? 0.05;
|
|
@@ -49,9 +48,9 @@ export function geoCellKey(extract, opts = {}) {
|
|
|
49
48
|
};
|
|
50
49
|
}
|
|
51
50
|
/**
|
|
52
|
-
* An exact-value block key (the canonical address key, a postcode, an email domain…), normalized
|
|
53
|
-
*
|
|
54
|
-
*
|
|
51
|
+
* An exact-value block key (the canonical address key, a postcode, an email domain…), normalized and optionally
|
|
52
|
+
* truncated to a leading `prefix` of characters (a cheaper, higher-recall rule). A missing or empty value produces no
|
|
53
|
+
* key.
|
|
55
54
|
*/
|
|
56
55
|
export function exactKey(extract, opts = {}) {
|
|
57
56
|
const normalize = opts.normalize ?? ((v) => v.trim().toLowerCase().replace(/\s+/g, " "));
|
|
@@ -66,10 +65,9 @@ export function exactKey(extract, opts = {}) {
|
|
|
66
65
|
};
|
|
67
66
|
}
|
|
68
67
|
/**
|
|
69
|
-
* A conjunctive block key — the cross-product of its sub-keys, joined (Geo-ER's "name AND
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
* rule is too loose.
|
|
68
|
+
* A conjunctive block key — the cross-product of its sub-keys, joined (Geo-ER's "name AND distance"). A record is keyed
|
|
69
|
+
* by every combination of one sub-key from each input, so two records co-block only when they agree on _all_ inputs.
|
|
70
|
+
* Tighter blocks, lower recall — use when a single rule is too loose.
|
|
73
71
|
*/
|
|
74
72
|
export function conjunction(...keys) {
|
|
75
73
|
return (record) => {
|
|
@@ -84,10 +82,10 @@ export function conjunction(...keys) {
|
|
|
84
82
|
};
|
|
85
83
|
}
|
|
86
84
|
/**
|
|
87
|
-
* Generate candidate pairs from `records` via one or more blocking keys (their union). Builds an
|
|
88
|
-
*
|
|
89
|
-
* `
|
|
90
|
-
*
|
|
85
|
+
* Generate candidate pairs from `records` via one or more blocking keys (their union). Builds an inverted index (key →
|
|
86
|
+
* records) and emits the unique within-block pairs. A block larger than `maxBlockSize` is skipped and reported in
|
|
87
|
+
* `droppedBlocks` rather than blowing up into a quadratic scan — an explicit, visible coverage limit, not a silent
|
|
88
|
+
* drop.
|
|
91
89
|
*/
|
|
92
90
|
export function block(records, blockingKeys, opts = {}) {
|
|
93
91
|
const keys = Array.isArray(blockingKeys) ? blockingKeys : [blockingKeys];
|
package/out/blocking.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blocking.js","sourceRoot":"","sources":["../blocking.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAWH
|
|
1
|
+
{"version":3,"file":"blocking.js","sourceRoot":"","sources":["../blocking.ts"],"names":[],"mappings":"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"}
|
package/out/clustering.d.ts
CHANGED
|
@@ -28,41 +28,35 @@ export interface ScoredLink<R> {
|
|
|
28
28
|
/** Options for {@link cluster}. */
|
|
29
29
|
export interface ClusterOptions {
|
|
30
30
|
/**
|
|
31
|
-
* Link two records only when their match weight is at or above this (bits) — the precision/recall
|
|
32
|
-
* knob.
|
|
31
|
+
* Link two records only when their match weight is at or above this (bits) — the precision/recall knob.
|
|
33
32
|
*/
|
|
34
33
|
threshold: number;
|
|
35
34
|
/**
|
|
36
35
|
* How the above-threshold link graph resolves into clusters:
|
|
37
36
|
*
|
|
38
|
-
* - `"single"` (default) — connected components (union-find). Fast; ANY above-threshold link fuses
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
* over-merge fix (Dedupe). Falls back to single-linkage for any component larger than
|
|
45
|
-
* {@link maxAverageLinkageComponent}.
|
|
37
|
+
* - `"single"` (default) — connected components (union-find). Fast; ANY above-threshold link fuses two groups, so a
|
|
38
|
+
* single weak link can over-merge unrelated records through a transitive chain.
|
|
39
|
+
* - `"average"` — agglomerative average-linkage refinement WITHIN each connected component: two sub-clusters merge only
|
|
40
|
+
* when the AVERAGE weight of the links between them clears the threshold, so a lone weak bridge no longer fuses two
|
|
41
|
+
* otherwise-dense groups. The documented over-merge fix (Dedupe). Falls back to single-linkage for any component
|
|
42
|
+
* larger than {@link maxAverageLinkageComponent}.
|
|
46
43
|
*/
|
|
47
44
|
linkage?: "single" | "average";
|
|
48
45
|
/**
|
|
49
|
-
* Components larger than this skip the O(k³) average-linkage refine and keep single-linkage.
|
|
50
|
-
* Default 64.
|
|
46
|
+
* Components larger than this skip the O(k³) average-linkage refine and keep single-linkage. Default 64.
|
|
51
47
|
*/
|
|
52
48
|
maxAverageLinkageComponent?: number;
|
|
53
49
|
}
|
|
54
50
|
/**
|
|
55
|
-
* Cluster records into canonical entities by connected components of the above-threshold link
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
* so pass the same record objects to both arguments.
|
|
51
|
+
* Cluster records into canonical entities by connected components of the above-threshold link graph. Every input record
|
|
52
|
+
* lands in exactly one cluster — a record with no qualifying link is a singleton. Links referencing a record not in
|
|
53
|
+
* `records` are ignored. Reference identity is used, so pass the same record objects to both arguments.
|
|
59
54
|
*/
|
|
60
55
|
export declare function cluster<R>(records: readonly R[], links: Iterable<ScoredLink<R>>, opts: ClusterOptions): R[][];
|
|
61
56
|
/**
|
|
62
|
-
* Pick a cluster's most complete record as its canonical representative — the one with the fewest
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
* source to trust).
|
|
57
|
+
* Pick a cluster's most complete record as its canonical representative — the one with the fewest empty fields (`null`
|
|
58
|
+
* / `undefined` / `""`). Ties keep the earliest. A basic, generic canonicalizer; field-level merging across the cluster
|
|
59
|
+
* is the application's job (it knows which source to trust).
|
|
66
60
|
*/
|
|
67
61
|
export declare function representative<R extends object>(group: readonly R[]): R | undefined;
|
|
68
62
|
//# sourceMappingURL=clustering.d.ts.map
|
package/out/clustering.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clustering.d.ts","sourceRoot":"","sources":["../clustering.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,iGAAiG;AACjG,MAAM,WAAW,UAAU,CAAC,CAAC;IAC5B,CAAC,EAAE,CAAC,CAAA;IACJ,CAAC,EAAE,CAAC,CAAA;IACJ,MAAM,EAAE,MAAM,CAAA;CACd;AAED,mCAAmC;AACnC,MAAM,WAAW,cAAc;IAC9B
|
|
1
|
+
{"version":3,"file":"clustering.d.ts","sourceRoot":"","sources":["../clustering.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,iGAAiG;AACjG,MAAM,WAAW,UAAU,CAAC,CAAC;IAC5B,CAAC,EAAE,CAAC,CAAA;IACJ,CAAC,EAAE,CAAC,CAAA;IACJ,MAAM,EAAE,MAAM,CAAA;CACd;AAED,mCAAmC;AACnC,MAAM,WAAW,cAAc;IAC9B;;OAEG;IACH,SAAS,EAAE,MAAM,CAAA;IACjB;;;;;;;;;OASG;IACH,OAAO,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;IAC9B;;OAEG;IACH,0BAA0B,CAAC,EAAE,MAAM,CAAA;CACnC;AAkDD;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,GAAG,CAAC,EAAE,EAAE,CA4F7G;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,GAAG,SAAS,CAkBnF"}
|
package/out/clustering.js
CHANGED
|
@@ -20,10 +20,10 @@
|
|
|
20
20
|
* across the whole dataset.
|
|
21
21
|
*/
|
|
22
22
|
/**
|
|
23
|
-
* Refine one connected component by agglomerative average-linkage. Starts with every member a
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
23
|
+
* Refine one connected component by agglomerative average-linkage. Starts with every member a singleton and repeatedly
|
|
24
|
+
* merges the cluster pair with the highest _average_ inter-cluster link weight while that average is at or above
|
|
25
|
+
* `threshold`; clusters with no link between them never merge. O(k³) in the component size, so callers gate it on a
|
|
26
|
+
* size cap.
|
|
27
27
|
*/
|
|
28
28
|
function averageLinkageRefine(members, edges, threshold) {
|
|
29
29
|
const clusters = members.map((_, i) => [i]);
|
|
@@ -61,10 +61,9 @@ function averageLinkageRefine(members, edges, threshold) {
|
|
|
61
61
|
return clusters.map((local) => local.map((i) => members[i]));
|
|
62
62
|
}
|
|
63
63
|
/**
|
|
64
|
-
* Cluster records into canonical entities by connected components of the above-threshold link
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
* so pass the same record objects to both arguments.
|
|
64
|
+
* Cluster records into canonical entities by connected components of the above-threshold link graph. Every input record
|
|
65
|
+
* lands in exactly one cluster — a record with no qualifying link is a singleton. Links referencing a record not in
|
|
66
|
+
* `records` are ignored. Reference identity is used, so pass the same record objects to both arguments.
|
|
68
67
|
*/
|
|
69
68
|
export function cluster(records, links, opts) {
|
|
70
69
|
const index = new Map();
|
|
@@ -124,7 +123,8 @@ export function cluster(records, links, opts) {
|
|
|
124
123
|
// Average-linkage refinement: split each component where its sub-clusters are joined only by a weak
|
|
125
124
|
// bridge (the average inter-cluster link weight, over ALL edges between them, falls below the threshold).
|
|
126
125
|
const maxComponent = opts.maxAverageLinkageComponent ?? 64;
|
|
127
|
-
const localOf = new Map();
|
|
126
|
+
const localOf = new Map();
|
|
127
|
+
// member → its index within its own group
|
|
128
128
|
for (const members of groups.values())
|
|
129
129
|
members.forEach((m, i) => localOf.set(m, i));
|
|
130
130
|
const groupEdges = new Map();
|
|
@@ -148,10 +148,9 @@ export function cluster(records, links, opts) {
|
|
|
148
148
|
return result;
|
|
149
149
|
}
|
|
150
150
|
/**
|
|
151
|
-
* Pick a cluster's most complete record as its canonical representative — the one with the fewest
|
|
152
|
-
*
|
|
153
|
-
*
|
|
154
|
-
* source to trust).
|
|
151
|
+
* Pick a cluster's most complete record as its canonical representative — the one with the fewest empty fields (`null`
|
|
152
|
+
* / `undefined` / `""`). Ties keep the earliest. A basic, generic canonicalizer; field-level merging across the cluster
|
|
153
|
+
* is the application's job (it knows which source to trust).
|
|
155
154
|
*/
|
|
156
155
|
export function representative(group) {
|
|
157
156
|
let best;
|
package/out/clustering.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clustering.js","sourceRoot":"","sources":["../clustering.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;
|
|
1
|
+
{"version":3,"file":"clustering.js","sourceRoot":"","sources":["../clustering.ts"],"names":[],"mappings":"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"}
|
package/out/comparators.d.ts
CHANGED
|
@@ -17,15 +17,14 @@
|
|
|
17
17
|
* Fellegi-Sunter agreement levels (and the m/u weights) is the scorer's job, not theirs.
|
|
18
18
|
*/
|
|
19
19
|
/**
|
|
20
|
-
* Jaro similarity in [0, 1]. Two empty strings are identical (1); one empty is 0. Counts matching
|
|
21
|
-
*
|
|
20
|
+
* Jaro similarity in [0, 1]. Two empty strings are identical (1); one empty is 0. Counts matching characters within a
|
|
21
|
+
* sliding window of `floor(max(len)/2) - 1`, discounting half-transpositions.
|
|
22
22
|
*/
|
|
23
23
|
export declare function jaro(a: string, b: string): number;
|
|
24
24
|
/**
|
|
25
|
-
* Jaro-Winkler similarity in [0, 1]: Jaro with a bonus for a shared prefix — `jw = jaro + prefix *
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
* Winkler.
|
|
25
|
+
* Jaro-Winkler similarity in [0, 1]: Jaro with a bonus for a shared prefix — `jw = jaro + prefix * weight * (1 -
|
|
26
|
+
* jaro)`, prefix capped at `maxPrefix` (Winkler's standard 4), `weight` the scaling factor (standard 0.1). Only boosts
|
|
27
|
+
* when `jaro` already clears `boostThreshold` (0.7), per Winkler.
|
|
29
28
|
*/
|
|
30
29
|
export declare function jaroWinkler(a: string, b: string, opts?: {
|
|
31
30
|
weight?: number;
|
|
@@ -35,13 +34,13 @@ export declare function jaroWinkler(a: string, b: string, opts?: {
|
|
|
35
34
|
/** Normalized Levenshtein similarity in [0, 1]: `1 - editDistance / max(len)`. */
|
|
36
35
|
export declare function levenshteinSimilarity(a: string, b: string): number;
|
|
37
36
|
/**
|
|
38
|
-
* Name-aware similarity in [0, 1]. Jaro-Winkler by default, with the compound-surname fallback the
|
|
39
|
-
*
|
|
37
|
+
* Name-aware similarity in [0, 1]. Jaro-Winkler by default, with the compound-surname fallback the literature
|
|
38
|
+
* prescribes:
|
|
40
39
|
*
|
|
41
|
-
* - If one name's tokens are a strict subset of the other's (`Lopez` ⊂ `Garcia Lopez`), that is
|
|
42
|
-
*
|
|
43
|
-
* - Otherwise return the better of Jaro-Winkler and normalized edit similarity, so a single token
|
|
44
|
-
*
|
|
40
|
+
* - If one name's tokens are a strict subset of the other's (`Lopez` ⊂ `Garcia Lopez`), that is strong partial agreement
|
|
41
|
+
* J-W misses — floor the score at 0.9.
|
|
42
|
+
* - Otherwise return the better of Jaro-Winkler and normalized edit similarity, so a single token that is a substring of
|
|
43
|
+
* a longer compound (`Garcia` vs `Garcialopez`) still scores sensibly.
|
|
45
44
|
*
|
|
46
45
|
* Case- and whitespace-insensitive. Empty input scores 0.
|
|
47
46
|
*/
|
package/out/comparators.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"comparators.d.ts","sourceRoot":"","sources":["../comparators.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH;;;GAGG;AACH,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"comparators.d.ts","sourceRoot":"","sources":["../comparators.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH;;;GAGG;AACH,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CA2CjD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAC1B,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAO,GACzE,MAAM,CAeR;AAED,kFAAkF;AAClF,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAOlE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAkB3D"}
|
package/out/comparators.js
CHANGED
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
*/
|
|
19
19
|
import { distance as levenshteinDistance } from "fastest-levenshtein";
|
|
20
20
|
/**
|
|
21
|
-
* Jaro similarity in [0, 1]. Two empty strings are identical (1); one empty is 0. Counts matching
|
|
22
|
-
*
|
|
21
|
+
* Jaro similarity in [0, 1]. Two empty strings are identical (1); one empty is 0. Counts matching characters within a
|
|
22
|
+
* sliding window of `floor(max(len)/2) - 1`, discounting half-transpositions.
|
|
23
23
|
*/
|
|
24
24
|
export function jaro(a, b) {
|
|
25
25
|
if (a === b)
|
|
@@ -62,10 +62,9 @@ export function jaro(a, b) {
|
|
|
62
62
|
return (matches / la + matches / lb + (matches - transpositions) / matches) / 3;
|
|
63
63
|
}
|
|
64
64
|
/**
|
|
65
|
-
* Jaro-Winkler similarity in [0, 1]: Jaro with a bonus for a shared prefix — `jw = jaro + prefix *
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
* Winkler.
|
|
65
|
+
* Jaro-Winkler similarity in [0, 1]: Jaro with a bonus for a shared prefix — `jw = jaro + prefix * weight * (1 -
|
|
66
|
+
* jaro)`, prefix capped at `maxPrefix` (Winkler's standard 4), `weight` the scaling factor (standard 0.1). Only boosts
|
|
67
|
+
* when `jaro` already clears `boostThreshold` (0.7), per Winkler.
|
|
69
68
|
*/
|
|
70
69
|
export function jaroWinkler(a, b, opts = {}) {
|
|
71
70
|
const weight = opts.weight ?? 0.1;
|
|
@@ -90,13 +89,13 @@ export function levenshteinSimilarity(a, b) {
|
|
|
90
89
|
return 1 - levenshteinDistance(a, b) / longest;
|
|
91
90
|
}
|
|
92
91
|
/**
|
|
93
|
-
* Name-aware similarity in [0, 1]. Jaro-Winkler by default, with the compound-surname fallback the
|
|
94
|
-
*
|
|
92
|
+
* Name-aware similarity in [0, 1]. Jaro-Winkler by default, with the compound-surname fallback the literature
|
|
93
|
+
* prescribes:
|
|
95
94
|
*
|
|
96
|
-
* - If one name's tokens are a strict subset of the other's (`Lopez` ⊂ `Garcia Lopez`), that is
|
|
97
|
-
*
|
|
98
|
-
* - Otherwise return the better of Jaro-Winkler and normalized edit similarity, so a single token
|
|
99
|
-
*
|
|
95
|
+
* - If one name's tokens are a strict subset of the other's (`Lopez` ⊂ `Garcia Lopez`), that is strong partial agreement
|
|
96
|
+
* J-W misses — floor the score at 0.9.
|
|
97
|
+
* - Otherwise return the better of Jaro-Winkler and normalized edit similarity, so a single token that is a substring of
|
|
98
|
+
* a longer compound (`Garcia` vs `Garcialopez`) still scores sensibly.
|
|
100
99
|
*
|
|
101
100
|
* Case- and whitespace-insensitive. Empty input scores 0.
|
|
102
101
|
*/
|
package/out/comparators.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"comparators.js","sourceRoot":"","sources":["../comparators.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,QAAQ,IAAI,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAErE;;;GAGG;AACH,MAAM,UAAU,IAAI,CAAC,CAAS,EAAE,CAAS;IACxC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAA;IACrB,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,CAAA;IACnB,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"comparators.js","sourceRoot":"","sources":["../comparators.ts"],"names":[],"mappings":"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"}
|
package/out/distance.d.ts
CHANGED
|
@@ -20,16 +20,15 @@
|
|
|
20
20
|
import type { LatLon } from "./blocking.js";
|
|
21
21
|
import type { Comparison, ComparisonLevel } from "./fellegi-sunter.js";
|
|
22
22
|
/**
|
|
23
|
-
* Great-circle (haversine) distance in km between two coordinates. The formula's one true home is
|
|
24
|
-
*
|
|
25
|
-
*
|
|
23
|
+
* Great-circle (haversine) distance in km between two coordinates. The formula's one true home is `@mailwoman/spatial`;
|
|
24
|
+
* this is a thin domain-typed adapter from `match`'s `LatLon` ({ latitude, longitude }) onto the canonical scalar
|
|
25
|
+
* helper — not a second implementation.
|
|
26
26
|
*/
|
|
27
27
|
export declare const haversineKm: (a: LatLon, b: LatLon) => number;
|
|
28
28
|
/**
|
|
29
|
-
* A geo-distance comparison: bucket the great-circle distance between two records' coordinates into
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* no evidence.
|
|
29
|
+
* A geo-distance comparison: bucket the great-circle distance between two records' coordinates into ordered agreement
|
|
30
|
+
* levels. Levels must be ordered NEAREST first by `maxKm`, the last acting as the `far` catch-all (`maxKm` omitted →
|
|
31
|
+
* unbounded). A missing/invalid coordinate on either side yields no evidence.
|
|
33
32
|
*/
|
|
34
33
|
export declare function distanceComparison<R>(config: {
|
|
35
34
|
name: string;
|
|
@@ -37,30 +36,27 @@ export declare function distanceComparison<R>(config: {
|
|
|
37
36
|
levels: ComparisonLevel[];
|
|
38
37
|
}): Comparison<R>;
|
|
39
38
|
/**
|
|
40
|
-
* Default distance levels, nearest → far, with boundaries at rooftop / block / locality scale. The
|
|
41
|
-
*
|
|
42
|
-
* error.
|
|
39
|
+
* Default distance levels, nearest → far, with boundaries at rooftop / block / locality scale. The m/u are illustrative
|
|
40
|
+
* seeds (EM re-estimates them); the boundaries reflect typical geocoder error.
|
|
43
41
|
*/
|
|
44
42
|
export declare const DEFAULT_DISTANCE_LEVELS: ComparisonLevel[];
|
|
45
43
|
/**
|
|
46
44
|
* The collapsed spatial-agreement comparison — ONE non-redundant geographic signal.
|
|
47
45
|
*
|
|
48
|
-
* The first matcher carried TWO spatial comparisons: canonical-address-key similarity AND
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
46
|
+
* The first matcher carried TWO spatial comparisons: canonical-address-key similarity AND great-circle distance. They
|
|
47
|
+
* double-count — an exact key match implies distance ≈ 0, so a co-located pair banked the same evidence twice, and the
|
|
48
|
+
* redundant vote is exactly what over-merges distinct providers at a shared clinic address. This folds them into one
|
|
49
|
+
* comparison:
|
|
52
50
|
*
|
|
53
|
-
* - **level 0 `same-key`** — an EXACT canonical-key match: the strongest tier, and the one the
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
* - **levels 1…n** — great-circle distance buckets for pairs whose keys DIFFER, so "123 Main St" vs
|
|
57
|
-
*
|
|
58
|
-
* geo-first point of the whole design).
|
|
51
|
+
* - **level 0 `same-key`** — an EXACT canonical-key match: the strongest tier, and the one the inverse-address-frequency
|
|
52
|
+
* adjustment rides ({@link withTermFrequency} on level 0), so agreement on a crowded shared key is down-weighted
|
|
53
|
+
* toward worthless while a rare one keeps full weight.
|
|
54
|
+
* - **levels 1…n** — great-circle distance buckets for pairs whose keys DIFFER, so "123 Main St" vs "123 Main Street Apt
|
|
55
|
+
* 2" that geocode to the same rooftop still earns near-agreement (the geo-first point of the whole design).
|
|
59
56
|
* - Keys differ and no usable coordinate → no evidence.
|
|
60
57
|
*
|
|
61
|
-
* Exactly one spatial vote, no redundancy. Pass {@link DEFAULT_SPATIAL_LEVELS} or your own; index 0
|
|
62
|
-
*
|
|
63
|
-
* `far`).
|
|
58
|
+
* Exactly one spatial vote, no redundancy. Pass {@link DEFAULT_SPATIAL_LEVELS} or your own; index 0 must be the
|
|
59
|
+
* exact-key tier, indices 1…n the distance buckets nearest → far by `maxKm` (last = `far`).
|
|
64
60
|
*/
|
|
65
61
|
export declare function spatialComparison<R>(config: {
|
|
66
62
|
name: string;
|
|
@@ -69,9 +65,8 @@ export declare function spatialComparison<R>(config: {
|
|
|
69
65
|
levels: ComparisonLevel[];
|
|
70
66
|
}): Comparison<R>;
|
|
71
67
|
/**
|
|
72
|
-
* Default levels for {@link spatialComparison}: an exact same-key tier on top of the distance
|
|
73
|
-
*
|
|
74
|
-
* sums to 1).
|
|
68
|
+
* Default levels for {@link spatialComparison}: an exact same-key tier on top of the distance buckets. `m`/`u` are
|
|
69
|
+
* EM-estimable seeds (m decreasing, u increasing down the tiers; each column ≈ sums to 1).
|
|
75
70
|
*/
|
|
76
71
|
export declare const DEFAULT_SPATIAL_LEVELS: ComparisonLevel[];
|
|
77
72
|
//# sourceMappingURL=distance.d.ts.map
|
package/out/distance.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"distance.d.ts","sourceRoot":"","sources":["../distance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;
|
|
1
|
+
{"version":3,"file":"distance.d.ts","sourceRoot":"","sources":["../distance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAEtE;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,GAAG,MAAM,EAAE,GAAG,MAAM,KAAG,MACa,CAAA;AAEhE;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,EAAE;IAC7C,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IACjD,MAAM,EAAE,eAAe,EAAE,CAAA;CACzB,GAAG,UAAU,CAAC,CAAC,CAAC,CAsBhB;AAED;;;GAGG;AACH,eAAO,MAAM,uBAAuB,EAAE,eAAe,EAKpD,CAAA;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE;IAC5C,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IAC7C,UAAU,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IACpD,MAAM,EAAE,eAAe,EAAE,CAAA;CACzB,GAAG,UAAU,CAAC,CAAC,CAAC,CA2BhB;AAED;;;GAGG;AACH,eAAO,MAAM,sBAAsB,EAAE,eAAe,EAMnD,CAAA"}
|
package/out/distance.js
CHANGED
|
@@ -19,16 +19,15 @@
|
|
|
19
19
|
*/
|
|
20
20
|
import { haversineKm as greatCircleKm } from "@mailwoman/spatial";
|
|
21
21
|
/**
|
|
22
|
-
* Great-circle (haversine) distance in km between two coordinates. The formula's one true home is
|
|
23
|
-
*
|
|
24
|
-
*
|
|
22
|
+
* Great-circle (haversine) distance in km between two coordinates. The formula's one true home is `@mailwoman/spatial`;
|
|
23
|
+
* this is a thin domain-typed adapter from `match`'s `LatLon` ({ latitude, longitude }) onto the canonical scalar
|
|
24
|
+
* helper — not a second implementation.
|
|
25
25
|
*/
|
|
26
26
|
export const haversineKm = (a, b) => greatCircleKm(a.latitude, a.longitude, b.latitude, b.longitude);
|
|
27
27
|
/**
|
|
28
|
-
* A geo-distance comparison: bucket the great-circle distance between two records' coordinates into
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
* no evidence.
|
|
28
|
+
* A geo-distance comparison: bucket the great-circle distance between two records' coordinates into ordered agreement
|
|
29
|
+
* levels. Levels must be ordered NEAREST first by `maxKm`, the last acting as the `far` catch-all (`maxKm` omitted →
|
|
30
|
+
* unbounded). A missing/invalid coordinate on either side yields no evidence.
|
|
32
31
|
*/
|
|
33
32
|
export function distanceComparison(config) {
|
|
34
33
|
const valid = (c) => !!c && Number.isFinite(c.latitude) && Number.isFinite(c.longitude);
|
|
@@ -50,9 +49,8 @@ export function distanceComparison(config) {
|
|
|
50
49
|
};
|
|
51
50
|
}
|
|
52
51
|
/**
|
|
53
|
-
* Default distance levels, nearest → far, with boundaries at rooftop / block / locality scale. The
|
|
54
|
-
*
|
|
55
|
-
* error.
|
|
52
|
+
* Default distance levels, nearest → far, with boundaries at rooftop / block / locality scale. The m/u are illustrative
|
|
53
|
+
* seeds (EM re-estimates them); the boundaries reflect typical geocoder error.
|
|
56
54
|
*/
|
|
57
55
|
export const DEFAULT_DISTANCE_LEVELS = [
|
|
58
56
|
{ label: "same-building", maxKm: 0.05, m: 0.7, u: 0.001 },
|
|
@@ -63,22 +61,20 @@ export const DEFAULT_DISTANCE_LEVELS = [
|
|
|
63
61
|
/**
|
|
64
62
|
* The collapsed spatial-agreement comparison — ONE non-redundant geographic signal.
|
|
65
63
|
*
|
|
66
|
-
* The first matcher carried TWO spatial comparisons: canonical-address-key similarity AND
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
*
|
|
64
|
+
* The first matcher carried TWO spatial comparisons: canonical-address-key similarity AND great-circle distance. They
|
|
65
|
+
* double-count — an exact key match implies distance ≈ 0, so a co-located pair banked the same evidence twice, and the
|
|
66
|
+
* redundant vote is exactly what over-merges distinct providers at a shared clinic address. This folds them into one
|
|
67
|
+
* comparison:
|
|
70
68
|
*
|
|
71
|
-
* - **level 0 `same-key`** — an EXACT canonical-key match: the strongest tier, and the one the
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
* - **levels 1…n** — great-circle distance buckets for pairs whose keys DIFFER, so "123 Main St" vs
|
|
75
|
-
*
|
|
76
|
-
* geo-first point of the whole design).
|
|
69
|
+
* - **level 0 `same-key`** — an EXACT canonical-key match: the strongest tier, and the one the inverse-address-frequency
|
|
70
|
+
* adjustment rides ({@link withTermFrequency} on level 0), so agreement on a crowded shared key is down-weighted
|
|
71
|
+
* toward worthless while a rare one keeps full weight.
|
|
72
|
+
* - **levels 1…n** — great-circle distance buckets for pairs whose keys DIFFER, so "123 Main St" vs "123 Main Street Apt
|
|
73
|
+
* 2" that geocode to the same rooftop still earns near-agreement (the geo-first point of the whole design).
|
|
77
74
|
* - Keys differ and no usable coordinate → no evidence.
|
|
78
75
|
*
|
|
79
|
-
* Exactly one spatial vote, no redundancy. Pass {@link DEFAULT_SPATIAL_LEVELS} or your own; index 0
|
|
80
|
-
*
|
|
81
|
-
* `far`).
|
|
76
|
+
* Exactly one spatial vote, no redundancy. Pass {@link DEFAULT_SPATIAL_LEVELS} or your own; index 0 must be the
|
|
77
|
+
* exact-key tier, indices 1…n the distance buckets nearest → far by `maxKm` (last = `far`).
|
|
82
78
|
*/
|
|
83
79
|
export function spatialComparison(config) {
|
|
84
80
|
const valid = (c) => !!c && Number.isFinite(c.latitude) && Number.isFinite(c.longitude);
|
|
@@ -104,9 +100,8 @@ export function spatialComparison(config) {
|
|
|
104
100
|
};
|
|
105
101
|
}
|
|
106
102
|
/**
|
|
107
|
-
* Default levels for {@link spatialComparison}: an exact same-key tier on top of the distance
|
|
108
|
-
*
|
|
109
|
-
* sums to 1).
|
|
103
|
+
* Default levels for {@link spatialComparison}: an exact same-key tier on top of the distance buckets. `m`/`u` are
|
|
104
|
+
* EM-estimable seeds (m decreasing, u increasing down the tiers; each column ≈ sums to 1).
|
|
110
105
|
*/
|
|
111
106
|
export const DEFAULT_SPATIAL_LEVELS = [
|
|
112
107
|
{ label: "same-key", m: 0.85, u: 0.01 },
|
package/out/distance.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"distance.js","sourceRoot":"","sources":["../distance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,WAAW,IAAI,aAAa,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"distance.js","sourceRoot":"","sources":["../distance.ts"],"names":[],"mappings":"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"}
|
package/out/em.d.ts
CHANGED
|
@@ -43,9 +43,9 @@ export interface EmResult<R> {
|
|
|
43
43
|
converged: boolean;
|
|
44
44
|
}
|
|
45
45
|
/**
|
|
46
|
-
* Estimate `m`/`u` and the prior `λ` from unlabeled agreement patterns via EM. The patterns are
|
|
47
|
-
*
|
|
48
|
-
*
|
|
46
|
+
* Estimate `m`/`u` and the prior `λ` from unlabeled agreement patterns via EM. The patterns are per-comparison level
|
|
47
|
+
* indices (as produced by {@link agreementPattern}); a `-1` (missing) field contributes no evidence to either class. The
|
|
48
|
+
* model's existing level `m`/`u` seed the iteration.
|
|
49
49
|
*/
|
|
50
50
|
export declare function estimateParameters<R>(model: FellegiSunterModel<R>, patterns: number[][], opts?: EmOptions): EmResult<R>;
|
|
51
51
|
//# sourceMappingURL=em.d.ts.map
|
package/out/em.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"em.d.ts","sourceRoot":"","sources":["../em.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"em.d.ts","sourceRoot":"","sources":["../em.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAOzE,uGAAuG;AACvG,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAEtF;AAED,8CAA8C;AAC9C,MAAM,WAAW,SAAS;IACzB,uCAAuC;IACvC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,8FAA8F;IAC9F,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,qDAAqD;AACrD,MAAM,WAAW,QAAQ,CAAC,CAAC;IAC1B,sFAAsF;IACtF,KAAK,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAA;IAC5B,sCAAsC;IACtC,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,OAAO,CAAA;CAClB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EACnC,KAAK,EAAE,kBAAkB,CAAC,CAAC,CAAC,EAC5B,QAAQ,EAAE,MAAM,EAAE,EAAE,EACpB,IAAI,GAAE,SAAc,GAClB,QAAQ,CAAC,CAAC,CAAC,CAoFb"}
|
package/out/em.js
CHANGED
|
@@ -22,8 +22,7 @@
|
|
|
22
22
|
* and sanity- check that the recovered `m` exceeds `u` on the top agreement level.
|
|
23
23
|
*/
|
|
24
24
|
/**
|
|
25
|
-
* Tiny floor mixed into the M-step so an unobserved level never produces a zero (→ infinite
|
|
26
|
-
* weight).
|
|
25
|
+
* Tiny floor mixed into the M-step so an unobserved level never produces a zero (→ infinite weight).
|
|
27
26
|
*/
|
|
28
27
|
const EPSILON = 1e-9;
|
|
29
28
|
/** Reduce a record pair to its agreement pattern — the per-comparison level index (`-1` = missing). */
|
|
@@ -31,9 +30,9 @@ export function agreementPattern(comparisons, a, b) {
|
|
|
31
30
|
return comparisons.map((comparison) => comparison.assess(a, b));
|
|
32
31
|
}
|
|
33
32
|
/**
|
|
34
|
-
* Estimate `m`/`u` and the prior `λ` from unlabeled agreement patterns via EM. The patterns are
|
|
35
|
-
*
|
|
36
|
-
*
|
|
33
|
+
* Estimate `m`/`u` and the prior `λ` from unlabeled agreement patterns via EM. The patterns are per-comparison level
|
|
34
|
+
* indices (as produced by {@link agreementPattern}); a `-1` (missing) field contributes no evidence to either class. The
|
|
35
|
+
* model's existing level `m`/`u` seed the iteration.
|
|
37
36
|
*/
|
|
38
37
|
export function estimateParameters(model, patterns, opts = {}) {
|
|
39
38
|
const maxIterations = opts.maxIterations ?? 100;
|
package/out/em.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"em.js","sourceRoot":"","sources":["../em.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH
|
|
1
|
+
{"version":3,"file":"em.js","sourceRoot":"","sources":["../em.ts"],"names":[],"mappings":"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"}
|
package/out/fellegi-sunter.d.ts
CHANGED
|
@@ -46,18 +46,17 @@ export interface Comparison<R> {
|
|
|
46
46
|
/** Index into {@link levels}, or `-1` when either value is missing (no evidence → weight 0). */
|
|
47
47
|
assess(a: R, b: R): number;
|
|
48
48
|
/**
|
|
49
|
-
* Optional term-frequency adjustment: on the levels it names, replace the level's average `u`
|
|
50
|
-
*
|
|
51
|
-
*
|
|
49
|
+
* Optional term-frequency adjustment: on the levels it names, replace the level's average `u` with the agreeing
|
|
50
|
+
* value's actual frequency, so agreement on a rare value (`Vijayan`) outweighs agreement on a common one (`Smith`).
|
|
51
|
+
* See `withTermFrequency`.
|
|
52
52
|
*/
|
|
53
53
|
termFrequency?: TermFrequencyAdjustment<R>;
|
|
54
54
|
}
|
|
55
55
|
/**
|
|
56
|
-
* Per-value term-frequency adjustment for a comparison (the Splink/Winkler mechanism). `m` is
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
* can't produce an unbounded boost.
|
|
56
|
+
* Per-value term-frequency adjustment for a comparison (the Splink/Winkler mechanism). `m` is unchanged; on an
|
|
57
|
+
* agreement level the effective `u` becomes the value's own frequency, adding `log2(u_level / frequency)` to the weight
|
|
58
|
+
* — large and positive for rare values, negative for common ones. Floored at
|
|
59
|
+
* {@link TermFrequencyAdjustment.minimumFrequency} so an ultra-rare value can't produce an unbounded boost.
|
|
61
60
|
*/
|
|
62
61
|
export interface TermFrequencyAdjustment<R> {
|
|
63
62
|
/** Relative frequency of a value in the data, in (0, 1]. Typically computed on-the-fly. */
|
|
@@ -99,10 +98,9 @@ export declare function priorWeight(lambda: number): number;
|
|
|
99
98
|
/** Convert a total match weight (bits) to a probability, numerically stable for extreme weights. */
|
|
100
99
|
export declare function probabilityFromWeight(weight: number): number;
|
|
101
100
|
/**
|
|
102
|
-
* A comparison driven by a similarity function and a tier of `minSimilarity` thresholds (the
|
|
103
|
-
*
|
|
104
|
-
*
|
|
105
|
-
* evidence.
|
|
101
|
+
* A comparison driven by a similarity function and a tier of `minSimilarity` thresholds (the StatCan/Splink recipe).
|
|
102
|
+
* Levels must be ordered highest → lowest similarity, the last acting as the `different` catch-all (`minSimilarity` 0).
|
|
103
|
+
* A missing value on either side yields no evidence.
|
|
106
104
|
*/
|
|
107
105
|
export declare function similarityComparison<R>(config: {
|
|
108
106
|
name: string;
|
|
@@ -114,8 +112,8 @@ export declare function similarityComparison<R>(config: {
|
|
|
114
112
|
/** Score a record pair: total match weight, probability, and the per-field contributions. */
|
|
115
113
|
export declare function scorePair<R>(model: FellegiSunterModel<R>, a: R, b: R): PairScore;
|
|
116
114
|
/**
|
|
117
|
-
* Classify a score against upper / lower match-weight thresholds (in bits): at or above `upper` is
|
|
118
|
-
*
|
|
115
|
+
* Classify a score against upper / lower match-weight thresholds (in bits): at or above `upper` is a link, at or below
|
|
116
|
+
* `lower` a non-link, and the band between is clerical review (abstain).
|
|
119
117
|
*/
|
|
120
118
|
export declare function decide(score: PairScore, thresholds: {
|
|
121
119
|
upper: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fellegi-sunter.d.ts","sourceRoot":"","sources":["../fellegi-sunter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAIH,qFAAqF;AACrF,MAAM,WAAW,eAAe;IAC/B,yEAAyE;IACzE,KAAK,EAAE,MAAM,CAAA;IACb,qFAAqF;IACrF,CAAC,EAAE,MAAM,CAAA;IACT,iGAAiG;IACjG,CAAC,EAAE,MAAM,CAAA;IACT,wFAAwF;IACxF,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,0FAA0F;IAC1F,KAAK,CAAC,EAAE,MAAM,CAAA;CACd;AAED,2FAA2F;AAC3F,MAAM,WAAW,UAAU,CAAC,CAAC;IAC5B,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,mFAAmF;IACnF,MAAM,EAAE,eAAe,EAAE,CAAA;IACzB,gGAAgG;IAChG,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,MAAM,CAAA;IAC1B;;;;OAIG;IACH,aAAa,CAAC,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAA;CAC1C;AAED
|
|
1
|
+
{"version":3,"file":"fellegi-sunter.d.ts","sourceRoot":"","sources":["../fellegi-sunter.ts"],"names":[],"mappings":"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"}
|
package/out/fellegi-sunter.js
CHANGED
|
@@ -44,10 +44,9 @@ export function probabilityFromWeight(weight) {
|
|
|
44
44
|
return 1 / (1 + 2 ** -weight);
|
|
45
45
|
}
|
|
46
46
|
/**
|
|
47
|
-
* A comparison driven by a similarity function and a tier of `minSimilarity` thresholds (the
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
* evidence.
|
|
47
|
+
* A comparison driven by a similarity function and a tier of `minSimilarity` thresholds (the StatCan/Splink recipe).
|
|
48
|
+
* Levels must be ordered highest → lowest similarity, the last acting as the `different` catch-all (`minSimilarity` 0).
|
|
49
|
+
* A missing value on either side yields no evidence.
|
|
51
50
|
*/
|
|
52
51
|
export function similarityComparison(config) {
|
|
53
52
|
const similarity = config.similarity ?? nameSimilarity;
|
|
@@ -96,8 +95,8 @@ export function scorePair(model, a, b) {
|
|
|
96
95
|
return { weight, probability: probabilityFromWeight(weight), contributions };
|
|
97
96
|
}
|
|
98
97
|
/**
|
|
99
|
-
* Classify a score against upper / lower match-weight thresholds (in bits): at or above `upper` is
|
|
100
|
-
*
|
|
98
|
+
* Classify a score against upper / lower match-weight thresholds (in bits): at or above `upper` is a link, at or below
|
|
99
|
+
* `lower` a non-link, and the band between is clerical review (abstain).
|
|
101
100
|
*/
|
|
102
101
|
export function decide(score, thresholds) {
|
|
103
102
|
if (score.weight >= thresholds.upper)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fellegi-sunter.js","sourceRoot":"","sources":["../fellegi-sunter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"fellegi-sunter.js","sourceRoot":"","sources":["../fellegi-sunter.ts"],"names":[],"mappings":"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"}
|
package/out/gbt.d.ts
CHANGED
|
@@ -27,8 +27,7 @@ export type TreeNode = {
|
|
|
27
27
|
hi: TreeNode;
|
|
28
28
|
};
|
|
29
29
|
/**
|
|
30
|
-
* Per-feature candidate split thresholds: midpoints for few-valued/binary features, quantiles for
|
|
31
|
-
* continuous.
|
|
30
|
+
* Per-feature candidate split thresholds: midpoints for few-valued/binary features, quantiles for continuous.
|
|
32
31
|
*/
|
|
33
32
|
export declare function buildThresholds(X: number[][]): number[][];
|
|
34
33
|
/** A trained gradient-boosted-tree model: an additive ensemble over a base log-odds. Plain JSON. */
|
package/out/gbt.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gbt.d.ts","sourceRoot":"","sources":["../gbt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,mGAAmG;AACnG,MAAM,MAAM,QAAQ,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,QAAQ,CAAA;CAAE,CAAA;AAIhG
|
|
1
|
+
{"version":3,"file":"gbt.d.ts","sourceRoot":"","sources":["../gbt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,mGAAmG;AACnG,MAAM,MAAM,QAAQ,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,QAAQ,CAAA;CAAE,CAAA;AAIhG;;GAEG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,CAyBzD;AAuFD,oGAAoG;AACpG,MAAM,WAAW,GAAG;IACnB,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;CACZ;AAED,4CAA4C;AAC5C,MAAM,WAAW,OAAO;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;CACf;AAED,6FAA6F;AAC7F,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,GAAG,GAAG,CA2BpF;AAED,yFAAyF;AACzF,wBAAgB,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAMpD"}
|
package/out/gbt.js
CHANGED
|
@@ -19,8 +19,7 @@
|
|
|
19
19
|
*/
|
|
20
20
|
const sigmoid = (z) => 1 / (1 + Math.exp(-Math.max(-30, Math.min(30, z))));
|
|
21
21
|
/**
|
|
22
|
-
* Per-feature candidate split thresholds: midpoints for few-valued/binary features, quantiles for
|
|
23
|
-
* continuous.
|
|
22
|
+
* Per-feature candidate split thresholds: midpoints for few-valued/binary features, quantiles for continuous.
|
|
24
23
|
*/
|
|
25
24
|
export function buildThresholds(X) {
|
|
26
25
|
const dim = X[0]?.length ?? 0;
|
package/out/gbt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gbt.js","sourceRoot":"","sources":["../gbt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,MAAM,OAAO,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAE1F
|
|
1
|
+
{"version":3,"file":"gbt.js","sourceRoot":"","sources":["../gbt.ts"],"names":[],"mappings":"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"}
|
package/out/tf.d.ts
CHANGED
|
@@ -28,19 +28,18 @@ export interface TermFrequencyTable {
|
|
|
28
28
|
readonly distinct: number;
|
|
29
29
|
}
|
|
30
30
|
/**
|
|
31
|
-
* Build a {@link TermFrequencyTable} from an iterable of values (e.g. every `given` name in the
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
* values.
|
|
31
|
+
* Build a {@link TermFrequencyTable} from an iterable of values (e.g. every `given` name in the dataset). Values are
|
|
32
|
+
* normalized (default: trim + lowercase + collapse whitespace) before counting, and `frequency()` normalizes its
|
|
33
|
+
* argument the same way, so callers pass raw field values.
|
|
35
34
|
*/
|
|
36
35
|
export declare function buildTermFrequencyTable(values: Iterable<string | null | undefined>, opts?: {
|
|
37
36
|
normalize?: (value: string) => string;
|
|
38
37
|
}): TermFrequencyTable;
|
|
39
38
|
/**
|
|
40
|
-
* Attach a term-frequency adjustment to a comparison. By default it applies to the exact level
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
39
|
+
* Attach a term-frequency adjustment to a comparison. By default it applies to the exact level (index 0) and looks up
|
|
40
|
+
* the value via `value(a, b)` — usually the agreeing field extracted from one side. Returns a new comparison; the
|
|
41
|
+
* underlying `assess` and levels are untouched, so this composes with EM (which re-estimates the base `m`/`u` the
|
|
42
|
+
* adjustment sits on top of).
|
|
44
43
|
*/
|
|
45
44
|
export declare function withTermFrequency<R>(comparison: Comparison<R>, config: {
|
|
46
45
|
table: TermFrequencyTable;
|
package/out/tf.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tf.d.ts","sourceRoot":"","sources":["../tf.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAA2B,MAAM,qBAAqB,CAAA;AAE9E,+FAA+F;AAC/F,MAAM,WAAW,kBAAkB;IAClC,+EAA+E;IAC/E,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;IAChC,mDAAmD;IACnD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,4CAA4C;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CACzB;AAID
|
|
1
|
+
{"version":3,"file":"tf.d.ts","sourceRoot":"","sources":["../tf.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAA2B,MAAM,qBAAqB,CAAA;AAE9E,+FAA+F;AAC/F,MAAM,WAAW,kBAAkB;IAClC,+EAA+E;IAC/E,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;IAChC,mDAAmD;IACnD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,4CAA4C;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CACzB;AAID;;;;GAIG;AACH,wBAAgB,uBAAuB,CACtC,MAAM,EAAE,QAAQ,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,EAC3C,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;CAAO,GAClD,kBAAkB,CAuBpB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAClC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,EACzB,MAAM,EAAE;IACP,KAAK,EAAE,kBAAkB,CAAA;IACzB,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IAChD,gEAAgE;IAChE,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;IACzB,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,6EAA6E;IAC7E,gBAAgB,CAAC,EAAE,MAAM,CAAA;CACzB,GACC,UAAU,CAAC,CAAC,CAAC,CAUf"}
|
package/out/tf.js
CHANGED
|
@@ -19,10 +19,9 @@
|
|
|
19
19
|
*/
|
|
20
20
|
const defaultNormalize = (value) => value.trim().toLowerCase().replace(/\s+/g, " ");
|
|
21
21
|
/**
|
|
22
|
-
* Build a {@link TermFrequencyTable} from an iterable of values (e.g. every `given` name in the
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
* values.
|
|
22
|
+
* Build a {@link TermFrequencyTable} from an iterable of values (e.g. every `given` name in the dataset). Values are
|
|
23
|
+
* normalized (default: trim + lowercase + collapse whitespace) before counting, and `frequency()` normalizes its
|
|
24
|
+
* argument the same way, so callers pass raw field values.
|
|
26
25
|
*/
|
|
27
26
|
export function buildTermFrequencyTable(values, opts = {}) {
|
|
28
27
|
const normalize = opts.normalize ?? defaultNormalize;
|
|
@@ -48,10 +47,10 @@ export function buildTermFrequencyTable(values, opts = {}) {
|
|
|
48
47
|
};
|
|
49
48
|
}
|
|
50
49
|
/**
|
|
51
|
-
* Attach a term-frequency adjustment to a comparison. By default it applies to the exact level
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
50
|
+
* Attach a term-frequency adjustment to a comparison. By default it applies to the exact level (index 0) and looks up
|
|
51
|
+
* the value via `value(a, b)` — usually the agreeing field extracted from one side. Returns a new comparison; the
|
|
52
|
+
* underlying `assess` and levels are untouched, so this composes with EM (which re-estimates the base `m`/`u` the
|
|
53
|
+
* adjustment sits on top of).
|
|
55
54
|
*/
|
|
56
55
|
export function withTermFrequency(comparison, config) {
|
|
57
56
|
const adjustment = {
|
package/out/tf.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tf.js","sourceRoot":"","sources":["../tf.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAcH,MAAM,gBAAgB,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;AAEnG
|
|
1
|
+
{"version":3,"file":"tf.js","sourceRoot":"","sources":["../tf.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAcH,MAAM,gBAAgB,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;AAEnG;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CACtC,MAA2C,EAC3C,OAAkD,EAAE;IAEpD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,gBAAgB,CAAA;IACpD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAA;IACxC,IAAI,KAAK,GAAG,CAAC,CAAA;IAEb,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC5B,IAAI,KAAK,IAAI,IAAI;YAAE,SAAQ;QAC3B,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,CAAA;QAE5B,IAAI,CAAC,GAAG;YAAE,SAAQ;QAClB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QAC3C,KAAK,EAAE,CAAA;IACR,CAAC;IAED,OAAO;QACN,KAAK;QACL,QAAQ,EAAE,MAAM,CAAC,IAAI;QACrB,SAAS,CAAC,KAAK;YACd,IAAI,KAAK,KAAK,CAAC;gBAAE,OAAO,CAAC,CAAA;YAEzB,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAA;QACnD,CAAC;KACD,CAAA;AACF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAChC,UAAyB,EACzB,MASC;IAED,MAAM,UAAU,GAA+B;QAC9C,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC;QACnD,MAAM,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;QACrC,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;KACzC,CAAA;IAED,OAAO,EAAE,GAAG,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,CAAA;AACpD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mailwoman/match",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "5.0.0",
|
|
4
4
|
"description": "The geocode-first record matcher: block → score → cluster. This first cut ships the string comparators (Jaro / Jaro-Winkler + an edit-distance fallback for compound surnames) that the Fellegi-Sunter scorer is built on.",
|
|
5
5
|
"license": "AGPL-3.0-only",
|
|
6
6
|
"repository": {
|
|
@@ -8,6 +8,12 @@
|
|
|
8
8
|
"url": "https://github.com/sister-software/mailwoman.git",
|
|
9
9
|
"directory": "match"
|
|
10
10
|
},
|
|
11
|
+
"files": [
|
|
12
|
+
"out/**/*.js",
|
|
13
|
+
"out/**/*.js.map",
|
|
14
|
+
"out/**/*.d.ts",
|
|
15
|
+
"out/**/*.d.ts.map"
|
|
16
|
+
],
|
|
11
17
|
"type": "module",
|
|
12
18
|
"exports": {
|
|
13
19
|
"./package.json": "./package.json",
|
|
@@ -20,20 +26,14 @@
|
|
|
20
26
|
"./em": "./out/em.js",
|
|
21
27
|
"./tf": "./out/tf.js"
|
|
22
28
|
},
|
|
29
|
+
"publishConfig": {
|
|
30
|
+
"access": "public"
|
|
31
|
+
},
|
|
23
32
|
"dependencies": {
|
|
24
|
-
"@mailwoman/spatial": "
|
|
33
|
+
"@mailwoman/spatial": "5.0.0",
|
|
25
34
|
"fastest-levenshtein": "^1.0.16"
|
|
26
35
|
},
|
|
27
36
|
"devDependencies": {
|
|
28
37
|
"@types/node": ">=26.0.1"
|
|
29
|
-
},
|
|
30
|
-
"files": [
|
|
31
|
-
"out/**/*.js",
|
|
32
|
-
"out/**/*.js.map",
|
|
33
|
-
"out/**/*.d.ts",
|
|
34
|
-
"out/**/*.d.ts.map"
|
|
35
|
-
],
|
|
36
|
-
"publishConfig": {
|
|
37
|
-
"access": "public"
|
|
38
38
|
}
|
|
39
39
|
}
|