What Changed in v3
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.
match: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.
FUZZY_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).
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.
match: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.
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.
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.
Match Method Breakdown — v3
Trademark Holders (1,262,112 source)
Total: 20,903 rows · 16,697 unique holders
Patent Applicants (1,479,325 source)
Total: 14,385 rows · 11,415 unique applicants
Average Confidence per Method
Trademark Holders
Patent Applicants
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%.
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.
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.
AI Queue — Priority Tier Breakdown
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.
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.
n1-standard-4 + T4 · 16 GB · ~$0.53/hr
2 × n1-standard-4 + T4 · ~$1.06/hr
4 × n1-standard-4 + T4 · ~$2.12/hr
| 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 |
v2 → v3 Change Summary
| Dimension | v2 (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
| Priority | Action | Expected Impact | Est. 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 |