WIMS · Statistical Report · 2026-06-01

Entity Matching Pipeline — v2 → v3 Iteration Report

Canonical holders · Patent applicants · Stopword improvements · Script detection · AI queue
v2 · 2026-06-01 · TM only · 4.57M per-application · LEI + translit v3 · 2026-06-01 · TM canonical + Patents · improved fuzzy · AI queue built
1

What Changed in v3

ARCH
Canonical trademark holders — source changed from trademark_item_holder (4.57M per-application entries, one row per trademark-application pair) to trademark_holder_names (1,262,112 canonical unique entities). 3.6× reduction in source size; eliminates duplicate matching of the same legal entity across its portfolio.
NEW
Patent applicant matching addedmatch:patents pipeline now runs against the local DB of 1,479,325 unique applicants collected from patent.applicant via collect:db:applicants. Previously ran live against the API with no local storage.
FIX
Geographic + industry stopwords expandedFUZZY_STOPWORDS extended with 26 Chinese city/province names (Shenzhen, Beijing, Shanghai, Guangdong, Dongguan, Suzhou, Hangzhou, Nanjing, Chengdu, Wuhan, Tianjin, Zhejiang, Jiangsu, Fujian, Shandong, Liaoning, Hebei, Henan, Hunan, Sichuan, Yunnan, Xinjiang, Chongqing, Foshan, Zhongshan, Zhuhai, Xiamen, Qingdao, Ningbo) and 9 industry structure words (electronic, electronics, industrial, biotechnology, biotech, chemical, chemicals, manufacturing, manufacturer). Eliminates false positives like "Shenzhen Wing Electronic" → "Shenzhen YDF Electronic" (shared geographic+industry tokens driving a bogus 85% ratio match).
NEW
Script detection (collect:transliterate) — all 1,262,112 canonical holders tagged with script type (latin / cjk / hangul / arabic / thai / cyrillic / hebrew / greek) in 8.5 seconds. Enables per-script analytics and future transliteration pipeline routing.
FIX
Patent worker tokenSet filter appliedmatch:patents worker now applies the buildCompanyTokenSet pre-filter before FTS, identical to match:tm. Previously called getFtsCandidates for every applicant regardless of token overlap. Also fixed FTS call from name.toLowerCase() to normalizeFuzzy(name) for consistent suffix-stripping.
NEW
AI queue built — 1,073,293 entries queued across two tracks: 17,447 uncertain (existing matches at conf 0.50–0.94 pending confirm/reject) and 1,055,846 no-match candidates (unmatched holders with FTS hits, top-3 candidates each). 819,970 unmatched holders skipped (no FTS overlap — primarily non-Latin scripts).
DATA
Full DB-direct collection — all five entity types now collected via collect:db directly from the production PostgreSQL DB tunnel: companies (9,697 non-draft → 13,764 after enrichment), trademark holders (canonical), patent applicants (1.48M), brands, products. Previous runs used the REST API with no local storage for applicants.
2

Top-Level KPIs

⚠️

Source change caveat: v2 matched against 4.57M per-application holders; v3 matches against 1.26M canonical entities. Raw count comparisons are not apples-to-apples — a single canonical match covers all trademark applications filed by that entity. The effective "entity coverage" in v3 is meaningfully denser per unique legal entity.

TM Source — Canonical Holders
4,570,000 1,262,112
−72.4% · per-app → canonical
Patent Applicants (new)
1,479,325
New source in v3
TM Unique Entities Matched
314,029 16,697
1.32% canonical rate · each = N applications
Patent Unique Entities Matched
11,415
0.77% of 1.48M applicants
Combined Unique Matched
28,112
TM + Patent combined
TM Fuzzy Match Rows
58,266 8,585
−85.3% · stopword cleanup
Fuzzy Avg Confidence (TM)
75.99% 71.55%
Remaining matches are genuine
Translit Matches (TM)
509 84
+CJK ×9, canonical dedup
AI Queue — Total Pending
1,073,293
17,447 uncertain + 1,055,846 no-match
3

Match Method Breakdown — v3

Trademark Holders (1,262,112 source)

Exact
7,186 rows
34.4%
Fuzzy
8,585 rows
41.1%
LEI / GLEIF
4,725 rows
22.6%
DBA / Alias
323 rows
1.5%
Translit CJK
46 rows
0.22%
Translit Cyrillic
35 rows
0.17%
Translit other
3 rows
<0.1%

Total: 20,903 rows · 16,697 unique holders

Patent Applicants (1,479,325 source)

Fuzzy
6,502 rows
45.2%
LEI / GLEIF
4,873 rows
33.9%
Exact
2,880 rows
20.0%
DBA / Alias
130 rows
0.9%

Total: 14,385 rows · 11,415 unique applicants

Average Confidence per Method

Trademark Holders

Exact
94.70%
DBA
87.88%
Translit CJK
87.72%
LEI
86.97%
Translit Cyr.
74.83%
Fuzzy
71.55%

Patent Applicants

Exact
99.80%
DBA
95.15%
LEI
87.11%
Fuzzy
79.31%
📊

Fuzzy quality delta: After expanding stopwords, TM fuzzy dropped from 58,266 to 8,585 rows (−85.3%). False positive patterns like "Shenzhen Wing Electronic" → "Shenzhen YDF Electronic" (only geographic + industry structure tokens matching) are eliminated. Patent fuzzy dropped from 8,519 to 6,502 (−23.7%) with avg confidence rising from 77.1% to 79.3%.

4

Script Coverage — Canonical TM Holders

All 1,262,112 canonical holders tagged via collect:transliterate (8.5 sec, ~150K/sec). Script detection runs on the name string directly; the script column is used for analytics and future transliteration routing.

Latin
929,770 · 73.7% of canonical
16,162 matched · 1.74% match rate
CJK
187,564 · 14.9%
261 matched · 0.14% · mostly LEI + translit
Hangul (Korean)
44,355 · 3.5%
12 matched · 0.03%
Arabic
41,676 · 3.3%
36 matched · 0.09%
Thai
29,613 · 2.3%
53 matched · 0.18%
Cyrillic
26,459 · 2.1%
162 matched · 0.61% · translit pipeline
Hebrew
1,611 · 0.1%
1 matched · 0.06%
Greek
1,064 · 0.1%
10 matched · 0.94%
🌏

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%. These are primarily foreign entities with no Latin-script representation in the WIMS2 company database — the ceiling for deterministic matching is low here, making them the primary target for AI scoring.

5

AI Queue — Priority Tier Breakdown

Total Pending
1,073,293
100% pending · none processed yet
Track: Uncertain Matches
17,447
1.63% · priority 0.60–1.00
Track: No-Match Candidates
1,055,846
98.4% · priority 0.00–0.58
Skipped (no FTS candidates)
819,970
mostly non-Latin scripts

Priority Tiers — Detailed

Tier Track Priority Range Avg Priority Entries % of Queue Description
P2 uncertain 0.75 – 0.90 0.830 7,170 0.67% Existing matches conf 0.75–0.89 — high-value confirm/reject (LEI + high fuzzy)
P3 uncertain 0.60 – 0.75 0.666 10,277 0.96% Existing matches conf 0.60–0.74 — borderline fuzzy / low translit waiting for verdict
P4 no_match 0.40 – 0.60 0.522 425,445 39.6% Top FTS candidate (rank 1) for unmatched holders — most likely to produce a new link
P5 no_match 0.20 – 0.40 0.348 334,769 31.2% FTS rank 2 candidates — secondary evaluation for same holders as P4
P6 no_match 0.00 – 0.20 0.174 295,632 27.5% FTS rank 3 candidates — long-tail; meaningful only if P4/P5 rejected
💡

Practical recommendation: Run AI on P2+P3 first (17,447 entries · ~17 hrs at 17 q/min) to validate existing matches at near-zero cost. Then evaluate throughput before committing to the P4 batch (425K entries · 17+ days). P5/P6 have diminishing returns — a rejected P4 makes the P5/P6 entries for the same holder moot.

6

AI Processing — Time & Cost Estimates

Baseline: 17 queries/minute per process. Parallel processes run on separate GPU instances; throughput scales linearly. GCP pricing is on-demand, us-central1, approximate 2026 rates. Total cost is invariant to parallelism (same GPU-hours consumed); wall-clock time halves per doubling.

Time by Priority Tier (1 process — 17 q/min)

Tier(s) Entries 1 process (17 q/min) 2 parallel (34 q/min) 4 parallel (68 q/min) Strategic value
P2 only 7,170 7.1 hrs 3.5 hrs 1.8 hrs Max ROI
P2 + P3 17,447 17.1 hrs 8.6 hrs 4.3 hrs All uncertain
P2P3P4 442,892 18.1 days 9.1 days 4.5 days High volume
Full queue 1,073,293 43.9 days 22.0 days 11.0 days Long tail

GCP GPU Instance Cost Estimates

ℹ️

Total GPU-hour cost is constant across parallelism levels (same total compute). More instances = same spend, less wall time. Spot/preemptible instances reduce cost ~60–70% at the risk of interruption — resumable queue mitigates this.

1 Parallel Process
g2-standard-4 · L4 GPU · 24 GB VRAM · ~$0.73/hr
n1-standard-4 + T4 · 16 GB · ~$0.53/hr
Rate 17 q/min
P2+P3 (17,447) 17.1 hrs · $12 – $17
P2–P4 (442,892) 18.1 days · $316 – $435
Full (1,073,293) 43.9 days · $766 – $1,055
Full (spot/preemptible) 43.9 days · $230 – $320
2 Parallel Processes
2 × g2-standard-4 · 2 × L4 · ~$1.46/hr
2 × n1-standard-4 + T4 · ~$1.06/hr
Rate 34 q/min
P2+P3 (17,447) 8.6 hrs · $12 – $17
P2–P4 (442,892) 9.1 days · $316 – $435
Full (1,073,293) 22.0 days · $766 – $1,055
Full (spot/preemptible) 22.0 days · $230 – $320
4 Parallel Processes
4 × g2-standard-4 · 4 × L4 · ~$2.92/hr
4 × n1-standard-4 + T4 · ~$2.12/hr
Rate 68 q/min
P2+P3 (17,447) 4.3 hrs · $12 – $17
P2–P4 (442,892) 4.5 days · $316 – $435
Full (1,073,293) 11.0 days · $766 – $1,055
Full (spot/preemptible) 11.0 days · $230 – $320
Scope Entries Expected outcomes On-demand cost (L4) Spot cost (L4 ~73% off) Verdict
P2+P3 — uncertain only 17,447 Confirm/reject ~17K existing links; expected ~40–60% survive $12 – $17 $3 – $5 Run first
P4 — top FTS no-match 425,445 New matches from ~425K unmatched holders; ~1–3% success = 4K–13K new links $306 – $420 $92 – $126 High value, high time
P5+P6 — rank 2/3 FTS 630,401 Marginal; most are for same holders whose P4 already resolved or failed $459 – $632 $138 – $190 Low ROI
Full queue 1,073,293 All of the above $766 – $1,055 $230 – $316 Consider staged
7

v2 → v3 Change Summary

Dimensionv2 (prev report)v3 (current)Direction
TM source size 4,570,000 per-application 1,262,112 canonical −72.4% dedup
Patent source Not matched (API live-fetch) 1,479,325 local DB New pipeline
TM fuzzy rows 58,266 8,585 −85.3% false positives
Patent fuzzy rows 8,519 (API partial) 6,502 (full DB) Cleaner + complete
TM fuzzy avg conf 75.99% 71.55% Remaining matches are tighter
Patent fuzzy avg conf 77.1% 79.3% +2.2 pp improvement
Translit matches (TM) 509 rows (Cyr 502, CJK 6, Gr 1) 84 rows (CJK 46, Cyr 35, Gr 2, Han 1) CJK ×7.7 with stopword fix
Script tags populated Not available 1,262,112 (100%) New analytics layer
AI queue Not built 1,073,293 pending Ready to run
Match throughput (TM) ~57K/min (12 workers) ~100K/min (12 workers) +75% · canonical is denser
Match throughput (Patents) ~34K/min (12 workers) ~46K/min (12 workers) +35% · tokenSet filter

Recommended Next Steps

PriorityActionExpected ImpactEst. Cost / Time
Immediate Run run:ai-queue on P2+P3 (uncertain matches, 17,447 entries) Validate existing borderline links; ~7K–10K confirmed + ~7K–10K rejected 17 hrs · <$20 on L4
High Run run:ai-queue on P4 (top no-match FTS candidates, 425K entries) Expected 4K–13K new matches from unmatched Latin holders 4.5–18 days · $90–$420
High Deduplicate upstream company entries (Nestlé ×2, Philip Morris ×3, JTI ×2, PepsiCo ×2) Prevents double-counting before API write-back; affects ~10 companies Manual review
Medium Extend AI queue to patent applicants (build patent ai_queue track) Similar yield to TM; ~0.5–1% of 1.4M unmatched = 7K–14K new patent links Same as TM P4 timeline
Medium Expand GLEIF LEI bridge — direct GLEIF name→company matching beyond Wikidata 74 Increases LEI coverage from ~4K (TM) toward higher ceiling Compute only · pipeline change
Low Export high-confidence matches (exact + LEI + DBA) for API write-back ~22K production-ready entity links available immediately Minimal · export script