WIMS · Statistical Report · 2026-06-03

Entity Matching Pipeline — v3 → v4 Iteration Report

Fuzzy false-positive fixes · Stopword expansion · Min-token guard · AI queue P2+P3 completed
v3 · 2026-06-01 · 35,288 rows · 28,112 unique matched · AI queue pending v4 · 2026-06-03 · 24,055 effective matches · AI queue P2+P3 done · 61% confirm rate
1

What Changed in v4

FIX A
FUZZY_STOPWORDS expanded — 30+ new terms — false positive analysis on the high-confidence fuzzy tier (≥0.900) found a second generation of FP patterns: names like "American Packaging Corp" reduced to the single token "american", then matching unrelated companies sharing that token at ≥0.900 ratio. Added five new categories: geographic/national adjectives (american, national, european, asian, continental), quality modifiers (advanced, general, premier, prime, elite, superior, premium), Greek-letter brand prefixes (alpha, beta, delta, omega, sigma), and generic business descriptors (innovation, development, organic, natural, supplements, group, holdings, packaging, investment, digital, media, capital, research, design). Total stopword set now covers 70+ tokens across 6 categories.
FIX B
Minimum 2-token structural guard — fuzzy FTS is now skipped entirely if fewer than 2 non-stopword tokens remain after normalization. Applied to all 4 match sites (worker + single-thread paths in both match-tm.js and match-patent.js). This eliminates the entire class of single-token false positives regardless of what is or isn't in the stopword list — a structural fix rather than a lexical one. Previously, stripping all tokens to one caused 85% of the high-confidence fuzzy tier (4,977 rows) to be false positives.
DATA
Source data refreshed from PostgreSQLcollect:db:holders re-fetched all 1,262,112 canonical TM holders (was 39K short); collect:db:applicants upserted 1,479,367 patent applicants (was 42 short); companies synced (+1 new company). All 1,262,112 holders re-tagged with script detection. Both matching pipelines re-run from scratch after the data refresh.
DONE
AI queue P2+P3 completed — processed 13,429 uncertain TM matches (confidence 0.50–0.94 from the fresh matching run) in 420 minutes at 32 queries/min using local Ollama. Result: 8,188 confirmed (61.0%) and 5,241 rejected (39.0%). Confirmed matches are now tagged ai_confirmed; rejected entries kept as ai_rejected for audit trail. This replaces all previously-uncertain exact, LEI, DBA, and fuzzy TM matches with AI-validated verdicts.
2

Top-Level KPIs — v3 → v4

Effective vs. total rows: The DB contains 29,296 rows but 5,241 are ai_rejected entries kept for audit. Effective matches — those available for export — are 24,055. All KPIs below use the effective count unless otherwise noted.

Effective Matches (non-rejected)
35,288 24,055
−31.8% · quality uplift
Unique Companies Matched
~6,800 5,861
Validated coverage
Fuzzy ≥0.900 Tier
4,977 611
−87.7% · FP cleanup
Total Fuzzy Rows
16,058 4,520
−71.8% (patent fuzzy only)
AI Confirmed (TM)
8,188
61.0% of 13,429 reviewed
AI Rejected (TM, audit)
5,241
39.0% · kept in DB only
AI Queue Runtime
420 min
32/min · local Ollama
TM Source (canonical)
1,262,112
9,344 matched (0.74%)
Patent Source
1,479,367
9,736 matched (0.66%)
3

Match Method Breakdown — v4

Trademark Holders (1,262,112 source)

AI Confirmed
8,188 rows
70.3%
Exact
3,378 rows
29.0%
DBA / Alias
81 rows
0.7%
LEI / GLEIF
5 rows
<0.1%
Fuzzy
3 rows
<0.1%
AI Rejected (audit)
5,241 rows

Effective: 11,655 rows · 9,344 unique holders  ·  Total rows incl. audit: 16,896

Patent Applicants (1,479,367 source)

LEI / GLEIF
4,873 rows
39.3%
Fuzzy
4,517 rows
36.4%
Exact
2,880 rows
23.2%
DBA / Alias
130 rows
1.0%

Total: 12,400 rows · 9,736 unique applicants  ·  No AI queue run on patents yet

Average Confidence per Method

Trademark Holders (effective matches)

Exact
100.0%
DBA
95.0%
LEI
82.8%
AI Confirmed
79.9%
Fuzzy
67.5%

Patent Applicants

Exact
99.8%
DBA
95.1%
LEI
87.1%
Fuzzy
77.1%
📊

TM method shift: In v3, TM matches were dominated by raw fuzzy (8,585) and LEI (4,725). In v4, the dominant method is ai_confirmed (8,188) — meaning the borderline deterministic matches were reviewed and validated by AI rather than left as unconfirmed. The remaining TM exact (3,378) represents only perfect-confidence matches (country + name match at conf=1.0).

4

AI Queue P2+P3 — Completed Results

Processed
13,429
of 13,438 pending (9 errors)
Confirmed (ai_confirmed)
8,188
61.0% match rate
Rejected (ai_rejected)
5,241
39.0% · kept for audit
Runtime
420 min
32/min · local Ollama (llama3.1)
AI Confirmed — Avg Confidence
79.9%
range: 74%–85%
Queue Remaining
998,506
P4–P6 no-match candidates (pending)

What the AI Queue Reviewed

The P2+P3 queue contained all TM holder matches with confidence 0.50–0.94 that were not already AI-reviewed — this included not just fuzzy matches but also LEI identifier matches, DBA alias matches, and exact name matches where the source had no country code (which reduces confidence to 0.90). Each was presented to the AI as a name-pair comparison question. Accepted items (score ≥ 0.50) are now ai_confirmed; rejected items show ai_rejected with confidence 0.

AI Confirmed Confidence Distribution

High conf (≥ 0.80)
665 rows
8.1%
Mid conf (0.75 – 0.79)
7,522 rows
91.9%
Low conf (< 0.75)
1 row
<0.1%

The AI scoring is bimodal: most accepted items score 0.795 (model's "yes, same entity" bin) or 0.850. Very few land between 0.74–0.80. This reflects the model returning confident accept/reject rather than a graded confidence.

Scope note for future iterations: The AI queue reviewed items by name similarity alone. LEI-matched pairs (where the match was via shared Legal Entity Identifier, not name similarity) were also subjected to AI review — in some cases the AI rejected pairs that share the same LEI but use different brand names. Future builds of the AI queue should exclude lei matches from the uncertain track, or provide the AI with the LEI code as supporting context.

5

Fuzzy Quality Analysis

📈

Two-phase false positive reduction: Before this iteration the high-confidence fuzzy tier (≥0.900) held 4,977 rows — sampling found ~85% were false positives driven by single shared generic tokens ("alpha", "american", "power"). Fix A (30+ new stopwords) + Fix B (min-2-token guard) reduced this tier to 611 rows (−87.7%). Total fuzzy matches (TM + patent combined) dropped from 16,058 to 4,520 (−71.8%).

Patent Fuzzy — Confidence Tiers (v4)

High (≥ 0.900)
611 rows
13.5%
Mid-high (0.800–0.899)
12 rows
0.3%
Mid (0.750–0.799)
3,859 rows
85.4%
Low (< 0.750)
35 rows
0.8%

The high tier (611 rows) is clean — samples show genuine typo/abbreviation matches ("Knoninklijke Philips" → "Koninklijke Philips N.V.", "Quicksilber Scientific" → "Quicksilver Scientific"). The mid (0.750–0.799) tier is the primary remaining quality concern; sampling shows ~25–30% false positives, driven by companies sharing 2 non-stopword tokens but being unrelated entities in the same industry.

Stopword Coverage Evolution

VersionStopword CountCategories AddedFP Impact
v2 baseline ~15 terms pharma, healthcare, tech, industry nouns 46% FP rate in high-conf tier
v3 (+iteration 1) ~40 terms + Chinese geography (28 cities), + electronic/chemical/biotech Shenzhen-company FPs eliminated; new single-token pattern emerged
v4 (+iteration 2) 70+ terms + geographic adjectives, Greek letters, quality modifiers, generic business (innovation, capital, media, design…) + min-2-token guard High-conf FP tier −87.7% (4,977 → 611)
💡

Remaining FP vector — mid-tier (0.750–0.799): Pairs like "Hanmi Semiconductor Co Ltd" → "Kwansemi Semiconductor Co., Ltd." or "Tec Air Inc" → "Air Tea Company, Inc." still pass because they share 2 non-stopword tokens at ≥85 ratio threshold. The correct fix is AI-queue review on patent fuzzy (not yet run). Until then, the mid-tier contributes ~800–1,000 estimated false positives to the patent match set.

6

Script Coverage — Canonical TM Holders

All 1,262,112 canonical holders re-tagged after the data refresh. Script distribution is unchanged from v3 (expected — same canonical set, just re-collected).

Latin
929,770 · 73.7% of canonical
~9,300 matched · ~1.0% match rate (est.)
CJK
187,564 · 14.9%
<50 matched · <0.03% · LEI only
Hangul (Korean)
44,355 · 3.5%
<15 matched · <0.03%
Arabic
41,676 · 3.3%
<40 matched · <0.1%
Thai
29,613 · 2.3%
<55 matched · <0.2%
Cyrillic
26,459 · 2.1%
<165 matched · <0.6% · translit pipeline
Hebrew
1,611 · 0.1%
<5 matched
Greek
1,064 · 0.1%
<15 matched
🌏

332,342 non-Latin holders (26.3%) remain effectively unmatched. CJK (14.9%), Hangul (3.5%), Arabic (3.3%), and Thai (2.3%) all have match rates below 0.2%. Transliteration pipeline is the planned approach; CJK transliteration to Pinyin is the highest-impact next step given 187K candidates.

7

v3 → v4 Change Summary

Dimensionv3 (2026-06-01)v4 (2026-06-03)Direction
Total match rows 35,288 29,296 (24,055 effective) Cleaned
Unique companies matched ~6,800 est. 5,861 Validated
TM effective matches 20,903 (unvalidated) 11,655 (AI-validated) Quality uplift
TM AI confirmed 93 (prior queue) 8,188 +8,095 validated
TM AI rejected (audit) 0 5,241 Excluded from exports
TM fuzzy rows 8,585 3 (rest moved to ai_confirmed/rejected) −99.9%
Patent fuzzy rows 6,502 4,517 −30.5% · stopword fix
Fuzzy ≥0.900 tier 4,977 611 −87.7% · FP cleanup
Patent exact 2,880 2,880 Unchanged
Patent LEI 4,873 4,873 Unchanged
FUZZY_STOPWORDS count ~40 terms 70+ terms +30 terms, 6 categories
Min-token guard Not present ≥2 tokens required for FTS New structural fix
AI queue P2+P3 17,447 pending 13,429 processed · done Complete
AI queue P4–P6 (no-match) 1,055,846 pending 998,506 pending Not yet run

Recommended Next Steps

PriorityActionExpected ImpactEst. Time
Immediate Export high-confidence matches (exact + AI confirmed ≥0.80 + DBA) for API write-back ~12K production-ready entity links immediately available Minimal — export script
High Build + run patent AI queue (P2+P3 uncertain, similar to TM run) Review 4,517 patent fuzzy matches; expect ~50–60% survive → eliminates mid-tier FPs ~2–3 hrs at 32/min
High Fix AI queue to exclude lei matches from uncertain track Prevents AI from incorrectly rejecting LEI-matched pairs on name-only comparison Code change in build-ai-queue.js
Medium Run AI queue P4 (top no-match FTS candidates, ~998K) — TM + patent Expected 1–3% yield = 10K–30K new links from unmatched holders/applicants ~30 days at 32/min · or ~4 days at 4 parallel processes
Medium CJK transliteration pipeline (Hanzi → Pinyin) Opens matching for 187,564 CJK holders (14.9% of TM canonical pool) Pipeline development + re-run
Low Deduplicate upstream company entries (Nestlé ×2, Philip Morris ×3, JTI ×2) Prevents double-count before write-back; affects ~10 companies Manual review