@mailwoman/match 8.1.0 → 8.2.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/blocking.ts +18 -7
- package/clustering.ts +12 -2
- package/comparators.ts +9 -3
- package/em.ts +30 -9
- package/fellegi-sunter.ts +83 -27
- package/gbt.ts +44 -12
- package/out/blocking.d.ts +15 -5
- package/out/blocking.d.ts.map +1 -1
- package/out/blocking.js +2 -2
- package/out/blocking.js.map +1 -1
- package/out/clustering.d.ts +6 -2
- package/out/clustering.d.ts.map +1 -1
- package/out/clustering.js.map +1 -1
- package/out/comparators.d.ts +3 -1
- package/out/comparators.d.ts.map +1 -1
- package/out/comparators.js +5 -3
- package/out/comparators.js.map +1 -1
- package/out/em.d.ts +24 -8
- package/out/em.d.ts.map +1 -1
- package/out/em.js +4 -2
- package/out/em.js.map +1 -1
- package/out/fellegi-sunter.d.ts +81 -27
- package/out/fellegi-sunter.d.ts.map +1 -1
- package/out/fellegi-sunter.js +12 -4
- package/out/fellegi-sunter.js.map +1 -1
- package/out/gbt.d.ts +15 -5
- package/out/gbt.d.ts.map +1 -1
- package/out/gbt.js +26 -9
- package/out/gbt.js.map +1 -1
- package/out/tf.d.ts +21 -7
- package/out/tf.d.ts.map +1 -1
- package/out/tf.js +1 -1
- package/out/tf.js.map +1 -1
- package/package.json +2 -2
- package/tf.ts +23 -8
package/out/blocking.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blocking.js","sourceRoot":"","sources":["../blocking.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;
|
|
1
|
+
{"version":3,"file":"blocking.js","sourceRoot":"","sources":["../blocking.ts"],"names":[],"mappings":"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"}
|
package/out/clustering.d.ts
CHANGED
|
@@ -19,13 +19,17 @@
|
|
|
19
19
|
* over-merge risk is already damped: blocking keeps candidate sets local, so chains can't run
|
|
20
20
|
* across the whole dataset.
|
|
21
21
|
*/
|
|
22
|
-
/**
|
|
22
|
+
/**
|
|
23
|
+
* A scored candidate pair: two records and the match weight (bits) the scorer assigned them.
|
|
24
|
+
*/
|
|
23
25
|
export interface ScoredLink<R> {
|
|
24
26
|
a: R;
|
|
25
27
|
b: R;
|
|
26
28
|
weight: number;
|
|
27
29
|
}
|
|
28
|
-
/**
|
|
30
|
+
/**
|
|
31
|
+
* Options for {@link cluster}.
|
|
32
|
+
*/
|
|
29
33
|
export interface ClusterOptions {
|
|
30
34
|
/**
|
|
31
35
|
* Link two records only when their match weight is at or above this (bits) — the precision/recall knob.
|
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
|
|
1
|
+
{"version":3,"file":"clustering.d.ts","sourceRoot":"","sources":["../clustering.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH;;GAEG;AACH,MAAM,WAAW,UAAU,CAAC,CAAC;IAC5B,CAAC,EAAE,CAAC,CAAA;IACJ,CAAC,EAAE,CAAC,CAAA;IACJ,MAAM,EAAE,MAAM,CAAA;CACd;AAED;;GAEG;AACH,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;AAoDD;;;;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,CA6G7G;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,GAAG,SAAS,CAoBnF"}
|
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
|
@@ -31,7 +31,9 @@ export declare function jaroWinkler(a: string, b: string, opts?: {
|
|
|
31
31
|
maxPrefix?: number;
|
|
32
32
|
boostThreshold?: number;
|
|
33
33
|
}): number;
|
|
34
|
-
/**
|
|
34
|
+
/**
|
|
35
|
+
* Normalized Levenshtein similarity in [0, 1]: `1 - editDistance / max(len)`.
|
|
36
|
+
*/
|
|
35
37
|
export declare function levenshteinSimilarity(a: string, b: string): number;
|
|
36
38
|
/**
|
|
37
39
|
* Name-aware similarity in [0, 1]. Jaro-Winkler by default, with the compound-surname fallback the literature
|
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,CAmDjD;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,CAiBR;AAED;;GAEG;AACH,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
|
@@ -82,7 +82,9 @@ export function jaroWinkler(a, b, opts = {}) {
|
|
|
82
82
|
}
|
|
83
83
|
return base + prefix * weight * (1 - base);
|
|
84
84
|
}
|
|
85
|
-
/**
|
|
85
|
+
/**
|
|
86
|
+
* Normalized Levenshtein similarity in [0, 1]: `1 - editDistance / max(len)`.
|
|
87
|
+
*/
|
|
86
88
|
export function levenshteinSimilarity(a, b) {
|
|
87
89
|
if (a === b)
|
|
88
90
|
return 1;
|
|
@@ -103,8 +105,8 @@ export function levenshteinSimilarity(a, b) {
|
|
|
103
105
|
* Case- and whitespace-insensitive. Empty input scores 0.
|
|
104
106
|
*/
|
|
105
107
|
export function nameSimilarity(a, b) {
|
|
106
|
-
const x = a.trim().toLowerCase().
|
|
107
|
-
const y = b.trim().toLowerCase().
|
|
108
|
+
const x = a.trim().toLowerCase().replaceAll(/\s+/g, " ");
|
|
109
|
+
const y = b.trim().toLowerCase().replaceAll(/\s+/g, " ");
|
|
108
110
|
if (!x || !y)
|
|
109
111
|
return 0;
|
|
110
112
|
if (x === y)
|
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;IAEnB,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC;QAAE,OAAO,CAAC,CAAA;IAElC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IAChE,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAU,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACnD,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAU,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAEnD,IAAI,OAAO,GAAG,CAAC,CAAA;IAEf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAA;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC,CAAA;QAExC,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAClC,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAAE,SAAQ;YAC1C,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;YAClB,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"comparators.js","sourceRoot":"","sources":["../comparators.ts"],"names":[],"mappings":"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"}
|
package/out/em.d.ts
CHANGED
|
@@ -22,22 +22,38 @@
|
|
|
22
22
|
* and sanity- check that the recovered `m` exceeds `u` on the top agreement level.
|
|
23
23
|
*/
|
|
24
24
|
import type { Comparison, FellegiSunterModel } from "./fellegi-sunter.ts";
|
|
25
|
-
/**
|
|
25
|
+
/**
|
|
26
|
+
* Reduce a record pair to its agreement pattern — the per-comparison level index (`-1` = missing).
|
|
27
|
+
*/
|
|
26
28
|
export declare function agreementPattern<R>(comparisons: Comparison<R>[], a: R, b: R): number[];
|
|
27
|
-
/**
|
|
29
|
+
/**
|
|
30
|
+
* Options for {@link estimateParameters}.
|
|
31
|
+
*/
|
|
28
32
|
export interface EmOptions {
|
|
29
|
-
/**
|
|
33
|
+
/**
|
|
34
|
+
* Hard iteration cap. Default 100.
|
|
35
|
+
*/
|
|
30
36
|
maxIterations?: number;
|
|
31
|
-
/**
|
|
37
|
+
/**
|
|
38
|
+
* Convergence tolerance on the largest parameter change between iterations. Default 1e-6.
|
|
39
|
+
*/
|
|
32
40
|
tolerance?: number;
|
|
33
|
-
/**
|
|
41
|
+
/**
|
|
42
|
+
* Starting prior match rate. Defaults to the model's `lambda`.
|
|
43
|
+
*/
|
|
34
44
|
initialLambda?: number;
|
|
35
45
|
}
|
|
36
|
-
/**
|
|
46
|
+
/**
|
|
47
|
+
* The fitted model plus convergence diagnostics.
|
|
48
|
+
*/
|
|
37
49
|
export interface EmResult<R> {
|
|
38
|
-
/**
|
|
50
|
+
/**
|
|
51
|
+
* The input model with every level's `m`/`u` and the prior `lambda` re-estimated.
|
|
52
|
+
*/
|
|
39
53
|
model: FellegiSunterModel<R>;
|
|
40
|
-
/**
|
|
54
|
+
/**
|
|
55
|
+
* The estimated prior match rate.
|
|
56
|
+
*/
|
|
41
57
|
lambda: number;
|
|
42
58
|
iterations: number;
|
|
43
59
|
converged: boolean;
|
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;AAOzE
|
|
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;;GAEG;AACH,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;;GAEG;AACH,MAAM,WAAW,SAAS;IACzB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ,CAAC,CAAC;IAC1B;;OAEG;IACH,KAAK,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAA;IAC5B;;OAEG;IACH,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,CAyFb"}
|
package/out/em.js
CHANGED
|
@@ -25,7 +25,9 @@
|
|
|
25
25
|
* Tiny floor mixed into the M-step so an unobserved level never produces a zero (→ infinite weight).
|
|
26
26
|
*/
|
|
27
27
|
const EPSILON = 1e-9;
|
|
28
|
-
/**
|
|
28
|
+
/**
|
|
29
|
+
* Reduce a record pair to its agreement pattern — the per-comparison level index (`-1` = missing).
|
|
30
|
+
*/
|
|
29
31
|
export function agreementPattern(comparisons, a, b) {
|
|
30
32
|
return comparisons.map((comparison) => comparison.assess(a, b));
|
|
31
33
|
}
|
|
@@ -45,7 +47,7 @@ export function estimateParameters(model, patterns, opts = {}) {
|
|
|
45
47
|
let lambda = opts.initialLambda ?? model.lambda;
|
|
46
48
|
let iterations = 0;
|
|
47
49
|
let converged = false;
|
|
48
|
-
if (patterns.length
|
|
50
|
+
if (!patterns.length) {
|
|
49
51
|
return { model, lambda, iterations, converged };
|
|
50
52
|
}
|
|
51
53
|
for (; iterations < maxIterations; iterations++) {
|
package/out/em.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"em.js","sourceRoot":"","sources":["../em.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH;;GAEG;AACH,MAAM,OAAO,GAAG,IAAI,CAAA;AAEpB
|
|
1
|
+
{"version":3,"file":"em.js","sourceRoot":"","sources":["../em.ts"],"names":[],"mappings":"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"}
|
package/out/fellegi-sunter.d.ts
CHANGED
|
@@ -24,26 +24,46 @@
|
|
|
24
24
|
* agreement count more than a common one layers on top. This module is the deterministic core
|
|
25
25
|
* those build on: given the levels, it produces the weights, the probability, and the decision.
|
|
26
26
|
*/
|
|
27
|
-
/**
|
|
27
|
+
/**
|
|
28
|
+
* One agreement level of a comparison, with its match / non-match probabilities.
|
|
29
|
+
*/
|
|
28
30
|
export interface ComparisonLevel {
|
|
29
|
-
/**
|
|
31
|
+
/**
|
|
32
|
+
* Human-readable label for debugging (`exact`, `high`, `different`).
|
|
33
|
+
*/
|
|
30
34
|
label: string;
|
|
31
|
-
/**
|
|
35
|
+
/**
|
|
36
|
+
* P(a pair lands in this level | it is a true match). A measure of data quality.
|
|
37
|
+
*/
|
|
32
38
|
m: number;
|
|
33
|
-
/**
|
|
39
|
+
/**
|
|
40
|
+
* P(a pair lands in this level | it is NOT a match). A measure of coincidence / cardinality.
|
|
41
|
+
*/
|
|
34
42
|
u: number;
|
|
35
|
-
/**
|
|
43
|
+
/**
|
|
44
|
+
* For similarity-driven comparisons: the minimum similarity (inclusive) to qualify.
|
|
45
|
+
*/
|
|
36
46
|
minSimilarity?: number;
|
|
37
|
-
/**
|
|
47
|
+
/**
|
|
48
|
+
* For distance-driven comparisons: the maximum distance in km (inclusive) to qualify.
|
|
49
|
+
*/
|
|
38
50
|
maxKm?: number;
|
|
39
51
|
}
|
|
40
|
-
/**
|
|
52
|
+
/**
|
|
53
|
+
* A per-field comparison: pull a value from each record and assign an agreement level.
|
|
54
|
+
*/
|
|
41
55
|
export interface Comparison<R> {
|
|
42
|
-
/**
|
|
56
|
+
/**
|
|
57
|
+
* Field name, for attribution.
|
|
58
|
+
*/
|
|
43
59
|
name: string;
|
|
44
|
-
/**
|
|
60
|
+
/**
|
|
61
|
+
* Levels ordered highest agreement → lowest (`exact` first, `different` last).
|
|
62
|
+
*/
|
|
45
63
|
levels: ComparisonLevel[];
|
|
46
|
-
/**
|
|
64
|
+
/**
|
|
65
|
+
* Index into {@link levels}, or `-1` when either value is missing (no evidence → weight 0).
|
|
66
|
+
*/
|
|
47
67
|
assess(a: R, b: R): number;
|
|
48
68
|
/**
|
|
49
69
|
* Optional term-frequency adjustment: on the levels it names, replace the level's average `u` with the agreeing
|
|
@@ -59,43 +79,73 @@ export interface Comparison<R> {
|
|
|
59
79
|
* {@link TermFrequencyAdjustment.minimumFrequency} so an ultra-rare value can't produce an unbounded boost.
|
|
60
80
|
*/
|
|
61
81
|
export interface TermFrequencyAdjustment<R> {
|
|
62
|
-
/**
|
|
82
|
+
/**
|
|
83
|
+
* Relative frequency of a value in the data, in (0, 1]. Typically computed on-the-fly.
|
|
84
|
+
*/
|
|
63
85
|
frequency(value: string): number;
|
|
64
|
-
/**
|
|
86
|
+
/**
|
|
87
|
+
* The level indices the adjustment applies to (typically just the exact level).
|
|
88
|
+
*/
|
|
65
89
|
levels: ReadonlySet<number>;
|
|
66
|
-
/**
|
|
90
|
+
/**
|
|
91
|
+
* The agreeing value to look up for a pair (a normalized field value), or null to skip.
|
|
92
|
+
*/
|
|
67
93
|
value(a: R, b: R): string | null | undefined;
|
|
68
|
-
/**
|
|
94
|
+
/**
|
|
95
|
+
* Scale the adjustment in [0, 1]. Default 1.
|
|
96
|
+
*/
|
|
69
97
|
weight?: number;
|
|
70
|
-
/**
|
|
98
|
+
/**
|
|
99
|
+
* Floor for the looked-up frequency, bounding the boost on ultra-rare values. Default 1e-4.
|
|
100
|
+
*/
|
|
71
101
|
minimumFrequency?: number;
|
|
72
102
|
}
|
|
73
|
-
/**
|
|
103
|
+
/**
|
|
104
|
+
* A Fellegi-Sunter model: the field comparisons plus the prior match rate `λ`.
|
|
105
|
+
*/
|
|
74
106
|
export interface FellegiSunterModel<R> {
|
|
75
107
|
comparisons: Comparison<R>[];
|
|
76
|
-
/**
|
|
108
|
+
/**
|
|
109
|
+
* Prior probability that two records drawn at random are a match.
|
|
110
|
+
*/
|
|
77
111
|
lambda: number;
|
|
78
112
|
}
|
|
79
|
-
/**
|
|
113
|
+
/**
|
|
114
|
+
* The scored outcome for one record pair.
|
|
115
|
+
*/
|
|
80
116
|
export interface PairScore {
|
|
81
|
-
/**
|
|
117
|
+
/**
|
|
118
|
+
* Total match weight in bits (`log2` odds).
|
|
119
|
+
*/
|
|
82
120
|
weight: number;
|
|
83
|
-
/**
|
|
121
|
+
/**
|
|
122
|
+
* Match probability in [0, 1].
|
|
123
|
+
*/
|
|
84
124
|
probability: number;
|
|
85
|
-
/**
|
|
125
|
+
/**
|
|
126
|
+
* Per-field breakdown — what drove the score.
|
|
127
|
+
*/
|
|
86
128
|
contributions: Array<{
|
|
87
129
|
name: string;
|
|
88
130
|
level: string | null;
|
|
89
131
|
weight: number;
|
|
90
132
|
}>;
|
|
91
133
|
}
|
|
92
|
-
/**
|
|
134
|
+
/**
|
|
135
|
+
* The terminal decision for a pair under upper / lower match-weight thresholds.
|
|
136
|
+
*/
|
|
93
137
|
export type MatchDecision = "match" | "review" | "non-match";
|
|
94
|
-
/**
|
|
138
|
+
/**
|
|
139
|
+
* The Bayes-factor weight of a single level, in bits: `log2(m / u)`.
|
|
140
|
+
*/
|
|
95
141
|
export declare function levelWeight(level: ComparisonLevel): number;
|
|
96
|
-
/**
|
|
142
|
+
/**
|
|
143
|
+
* The prior match weight in bits: `log2(λ / (1 - λ))`.
|
|
144
|
+
*/
|
|
97
145
|
export declare function priorWeight(lambda: number): number;
|
|
98
|
-
/**
|
|
146
|
+
/**
|
|
147
|
+
* Convert a total match weight (bits) to a probability, numerically stable for extreme weights.
|
|
148
|
+
*/
|
|
99
149
|
export declare function probabilityFromWeight(weight: number): number;
|
|
100
150
|
/**
|
|
101
151
|
* A comparison driven by a similarity function and a tier of `minSimilarity` thresholds (the StatCan/Splink recipe).
|
|
@@ -105,11 +155,15 @@ export declare function probabilityFromWeight(weight: number): number;
|
|
|
105
155
|
export declare function similarityComparison<R>(config: {
|
|
106
156
|
name: string;
|
|
107
157
|
extract: (record: R) => string | null | undefined;
|
|
108
|
-
/**
|
|
158
|
+
/**
|
|
159
|
+
* Defaults to {@link nameSimilarity}.
|
|
160
|
+
*/
|
|
109
161
|
similarity?: (a: string, b: string) => number;
|
|
110
162
|
levels: ComparisonLevel[];
|
|
111
163
|
}): Comparison<R>;
|
|
112
|
-
/**
|
|
164
|
+
/**
|
|
165
|
+
* Score a record pair: total match weight, probability, and the per-field contributions.
|
|
166
|
+
*/
|
|
113
167
|
export declare function scorePair<R>(model: FellegiSunterModel<R>, a: R, b: R): PairScore;
|
|
114
168
|
/**
|
|
115
169
|
* Classify a score against upper / lower match-weight thresholds (in bits): at or above `upper` is a link, at or below
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fellegi-sunter.d.ts","sourceRoot":"","sources":["../fellegi-sunter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAIH
|
|
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
|
@@ -25,13 +25,17 @@
|
|
|
25
25
|
* those build on: given the levels, it produces the weights, the probability, and the decision.
|
|
26
26
|
*/
|
|
27
27
|
import { nameSimilarity } from "./comparators.js";
|
|
28
|
-
/**
|
|
28
|
+
/**
|
|
29
|
+
* The Bayes-factor weight of a single level, in bits: `log2(m / u)`.
|
|
30
|
+
*/
|
|
29
31
|
export function levelWeight(level) {
|
|
30
32
|
if (level.u <= 0)
|
|
31
33
|
return level.m > 0 ? Infinity : 0;
|
|
32
34
|
return Math.log2(level.m / level.u);
|
|
33
35
|
}
|
|
34
|
-
/**
|
|
36
|
+
/**
|
|
37
|
+
* The prior match weight in bits: `log2(λ / (1 - λ))`.
|
|
38
|
+
*/
|
|
35
39
|
export function priorWeight(lambda) {
|
|
36
40
|
if (lambda <= 0)
|
|
37
41
|
return -Infinity;
|
|
@@ -39,7 +43,9 @@ export function priorWeight(lambda) {
|
|
|
39
43
|
return Infinity;
|
|
40
44
|
return Math.log2(lambda / (1 - lambda));
|
|
41
45
|
}
|
|
42
|
-
/**
|
|
46
|
+
/**
|
|
47
|
+
* Convert a total match weight (bits) to a probability, numerically stable for extreme weights.
|
|
48
|
+
*/
|
|
43
49
|
export function probabilityFromWeight(weight) {
|
|
44
50
|
return 1 / (1 + 2 ** -weight);
|
|
45
51
|
}
|
|
@@ -67,7 +73,9 @@ export function similarityComparison(config) {
|
|
|
67
73
|
},
|
|
68
74
|
};
|
|
69
75
|
}
|
|
70
|
-
/**
|
|
76
|
+
/**
|
|
77
|
+
* Score a record pair: total match weight, probability, and the per-field contributions.
|
|
78
|
+
*/
|
|
71
79
|
export function scorePair(model, a, b) {
|
|
72
80
|
let weight = priorWeight(model.lambda);
|
|
73
81
|
const contributions = [];
|
|
@@ -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
|
@@ -17,7 +17,9 @@
|
|
|
17
17
|
* ({@link gbtScore}). The trained {@link GBT} is plain JSON (`{trees, lr, base}`), so a model
|
|
18
18
|
* trains offline once and ships as a data file.
|
|
19
19
|
*/
|
|
20
|
-
/**
|
|
20
|
+
/**
|
|
21
|
+
* A trained tree: an internal split (feature `f` ≤ `thr` → `lo`, else `hi`) or a `leaf` value.
|
|
22
|
+
*/
|
|
21
23
|
export type TreeNode = {
|
|
22
24
|
leaf: number;
|
|
23
25
|
} | {
|
|
@@ -30,21 +32,29 @@ export type TreeNode = {
|
|
|
30
32
|
* Per-feature candidate split thresholds: midpoints for few-valued/binary features, quantiles for continuous.
|
|
31
33
|
*/
|
|
32
34
|
export declare function buildThresholds(X: number[][]): number[][];
|
|
33
|
-
/**
|
|
35
|
+
/**
|
|
36
|
+
* A trained gradient-boosted-tree model: an additive ensemble over a base log-odds. Plain JSON.
|
|
37
|
+
*/
|
|
34
38
|
export interface GBT {
|
|
35
39
|
trees: TreeNode[];
|
|
36
40
|
lr: number;
|
|
37
41
|
base: number;
|
|
38
42
|
}
|
|
39
|
-
/**
|
|
43
|
+
/**
|
|
44
|
+
* Hyperparameters for {@link trainGBT}.
|
|
45
|
+
*/
|
|
40
46
|
export interface GBTOpts {
|
|
41
47
|
rounds: number;
|
|
42
48
|
depth: number;
|
|
43
49
|
lr: number;
|
|
44
50
|
minLeaf: number;
|
|
45
51
|
}
|
|
46
|
-
/**
|
|
52
|
+
/**
|
|
53
|
+
* Gradient-boosted regression trees on logistic loss, with per-sample class weights `w`.
|
|
54
|
+
*/
|
|
47
55
|
export declare function trainGBT(X: number[][], y: number[], w: number[], opts: GBTOpts): GBT;
|
|
48
|
-
/**
|
|
56
|
+
/**
|
|
57
|
+
* GBT score (logit) for one feature vector. Threshold-comparable like the FS weight.
|
|
58
|
+
*/
|
|
49
59
|
export declare function gbtScore(m: GBT, x: number[]): number;
|
|
50
60
|
//# sourceMappingURL=gbt.d.ts.map
|
package/out/gbt.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gbt.d.ts","sourceRoot":"","sources":["../gbt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;
|
|
1
|
+
{"version":3,"file":"gbt.d.ts","sourceRoot":"","sources":["../gbt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAYH;;GAEG;AACH,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,CA+BzD;AAiGD;;GAEG;AACH,MAAM,WAAW,GAAG;IACnB,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;CACZ;AAED;;GAEG;AACH,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;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,GAAG,GAAG,CAqCpF;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAQpD"}
|
package/out/gbt.js
CHANGED
|
@@ -17,6 +17,14 @@
|
|
|
17
17
|
* ({@link gbtScore}). The trained {@link GBT} is plain JSON (`{trees, lr, base}`), so a model
|
|
18
18
|
* trains offline once and ships as a data file.
|
|
19
19
|
*/
|
|
20
|
+
/**
|
|
21
|
+
* Distinct values at or below which every split point is tried exactly rather than by quantile.
|
|
22
|
+
*/
|
|
23
|
+
const MAX_EXACT_SPLIT_VALUES = 5;
|
|
24
|
+
/**
|
|
25
|
+
* Quantile split points evaluated for a continuous feature.
|
|
26
|
+
*/
|
|
27
|
+
const QUANTILE_SPLIT_COUNT = 6;
|
|
20
28
|
const sigmoid = (z) => 1 / (1 + Math.exp(-Math.max(-30, Math.min(30, z))));
|
|
21
29
|
/**
|
|
22
30
|
* Per-feature candidate split thresholds: midpoints for few-valued/binary features, quantiles for continuous.
|
|
@@ -26,11 +34,11 @@ export function buildThresholds(X) {
|
|
|
26
34
|
const out = [];
|
|
27
35
|
for (let f = 0; f < dim; f++) {
|
|
28
36
|
const vals = X.map((r) => r[f]);
|
|
29
|
-
const uniq = [...new Set(vals)].
|
|
37
|
+
const uniq = [...new Set(vals)].toSorted((p, q) => p - q);
|
|
30
38
|
if (uniq.length <= 1) {
|
|
31
39
|
out.push([]);
|
|
32
40
|
}
|
|
33
|
-
else if (uniq.length <=
|
|
41
|
+
else if (uniq.length <= MAX_EXACT_SPLIT_VALUES) {
|
|
34
42
|
const t = [];
|
|
35
43
|
for (let k = 0; k < uniq.length - 1; k++) {
|
|
36
44
|
t.push((uniq[k] + uniq[k + 1]) / 2);
|
|
@@ -38,9 +46,9 @@ export function buildThresholds(X) {
|
|
|
38
46
|
out.push(t);
|
|
39
47
|
}
|
|
40
48
|
else {
|
|
41
|
-
const sorted = [...vals].
|
|
49
|
+
const sorted = [...vals].toSorted((p, q) => p - q);
|
|
42
50
|
const t = [];
|
|
43
|
-
for (let q = 1; q <=
|
|
51
|
+
for (let q = 1; q <= QUANTILE_SPLIT_COUNT; q++) {
|
|
44
52
|
t.push(sorted[Math.floor((q / 7) * (sorted.length - 1))]);
|
|
45
53
|
}
|
|
46
54
|
out.push([...new Set(t)]);
|
|
@@ -48,7 +56,9 @@ export function buildThresholds(X) {
|
|
|
48
56
|
}
|
|
49
57
|
return out;
|
|
50
58
|
}
|
|
51
|
-
/**
|
|
59
|
+
/**
|
|
60
|
+
* Weighted SSE of target `g` over `rows` around their weighted mean.
|
|
61
|
+
*/
|
|
52
62
|
function nodeSSE(rows, g, w) {
|
|
53
63
|
let wsum = 0;
|
|
54
64
|
let wg = 0;
|
|
@@ -64,7 +74,9 @@ function nodeSSE(rows, g, w) {
|
|
|
64
74
|
}
|
|
65
75
|
return sse;
|
|
66
76
|
}
|
|
67
|
-
/**
|
|
77
|
+
/**
|
|
78
|
+
* Greedy depth-limited weighted regression tree on target `g` (the boosting residual).
|
|
79
|
+
*/
|
|
68
80
|
function fitRegTree(rows, X, g, w, thresholds, depth, minLeaf) {
|
|
69
81
|
let wsum = 0;
|
|
70
82
|
let wg = 0;
|
|
@@ -117,7 +129,9 @@ function predictTree(t, x) {
|
|
|
117
129
|
}
|
|
118
130
|
return n.leaf;
|
|
119
131
|
}
|
|
120
|
-
/**
|
|
132
|
+
/**
|
|
133
|
+
* Gradient-boosted regression trees on logistic loss, with per-sample class weights `w`.
|
|
134
|
+
*/
|
|
121
135
|
export function trainGBT(X, y, w, opts) {
|
|
122
136
|
const N = X.length;
|
|
123
137
|
const thresholds = buildThresholds(X);
|
|
@@ -137,7 +151,8 @@ export function trainGBT(X, y, w, opts) {
|
|
|
137
151
|
const g = new Array(N);
|
|
138
152
|
for (let i = 0; i < N; i++) {
|
|
139
153
|
g[i] = y[i] - sigmoid(F[i]);
|
|
140
|
-
}
|
|
154
|
+
}
|
|
155
|
+
// negative gradient of logistic loss
|
|
141
156
|
const tree = fitRegTree(rowsAll, X, g, w, thresholds, opts.depth, opts.minLeaf);
|
|
142
157
|
for (let i = 0; i < N; i++) {
|
|
143
158
|
F[i] += opts.lr * predictTree(tree, X[i]);
|
|
@@ -146,7 +161,9 @@ export function trainGBT(X, y, w, opts) {
|
|
|
146
161
|
}
|
|
147
162
|
return { trees, lr: opts.lr, base };
|
|
148
163
|
}
|
|
149
|
-
/**
|
|
164
|
+
/**
|
|
165
|
+
* GBT score (logit) for one feature vector. Threshold-comparable like the FS weight.
|
|
166
|
+
*/
|
|
150
167
|
export function gbtScore(m, x) {
|
|
151
168
|
let f = m.base;
|
|
152
169
|
for (const t of m.trees) {
|