This page documents exactly how the tool turns a brand name into a 0–100 conflict-risk score: the signals it measures, the weight each one carries, how they combine, how the score maps to a risk band, and what the number does and doesn’t cover. It is the specification the engine actually runs on, and it changes whenever the engine does. Most tools publish a score and the names of a few algorithms. The specifics below are the method itself, because a number you can’t inspect is a number you can’t trust.
The engine version this describes is 1.4.0-p2, and that version is shown on every result alongside the data date, so you always know which method produced a given score.
The four signals
Every candidate mark is compared to your name on four independent axes. The first three measure how close the names are; the fourth measures whether the goods overlap.
Sound (phonetic)
Catches sound-alike marks even when spelling differs. A pair counts as sounding alike only when two different phonetic encoders agree: a consonant-skeleton encoder (Metaphone) and a vowel-preserving one (NYSIIS). We take the lower of the two similarities, and requiring both to agree prevents false matches like KRAVENDISH vs CORVENTIS, which share a consonant skeleton but not their vowels. Very short phonetic codes are down-weighted, because a 2–3 character code collapses unrelated words (e.g. cat/car).
Spelling (orthographic)
Catches look-alike spellings and typo-style edits. It blends two string-similarity measures, Jaro similarity and normalized edit (Levenshtein) distance, averaged so it stays sensitive to letter transpositions (google/googel) without inheriting Jaro’s high coincidental-overlap floor. We deliberately do not use Jaro-Winkler: its shared-prefix bonus inflated the similarity of distinct names that merely start the same way.
Meaning (semantic)
Catches marks that convey a related idea even when they neither sound nor look alike. Each mark is embedded into a vector with a sentence-transformer model (all-MiniLM-L6-v2), and similarity is the cosine distance between your name’s vector and each mark’s, retrieved with an approximate-nearest-neighbor index over the whole corpus.
Goods-class relatedness (the gate)
Confusion only bites when the goods overlap, so goods-class relatedness is not a fourth weighted term. It is a multiplicative gate on the name score. A perfect name match in a totally unrelated class is dampened; a match in the same or a related class keeps its full weight. If you enter no class, overlap can’t be assessed, so the gate is neutral (it neither raises nor lowers the score) rather than assumed. The gate never drops below a floor of 0.30, so an unrelated class tempers a strong name match without fully cancelling it. How the gate values are derived is described under the goods-class gate below.
The weights
The three name signals are combined as a weighted average. Spelling carries the most weight because it is the most reliable signal; phonetic encoding is noisier (short codes collapse unrelated words), so it is weighted below spelling. That change cut false “high” readings from roughly 30% of distinct pairs to about 3%.
| Signal | Weight | Why |
|---|---|---|
| Spelling (orthographic) | 0.45 | Most reliable look-alike signal |
| Sound (phonetic) | 0.30 | Noisier than spelling; down-weighted |
| Meaning (semantic) | 0.25 | Complements the two string signals |
How the signals combine
The name signals are averaged by their weights, then the goods-class gate is applied, then the result is normalized against how common your name pattern is. In plain terms:
name score = (0.30 × sound + 0.45 × spelling + 0.25 × meaning) ÷ (sum of present weights)
When a signal isn’t available (for example a name with no meaningful embedding), its weight is dropped and the remaining weights are renormalized, so the score is always an average over the signals actually present, never a partial signal read as low. One override: when spelling is near-identical (≥ 0.95), the name score is not allowed to fall below the spelling value, so typing a mark that already exists reads as a maximal match rather than merely a high one.
combined = name score × goods-class gate
Base-rate normalization. In a register of ~4.6 million marks, almost every string has a coincidental near-neighbor, so a raw score alone would read “high” for even a coined name. We correct for this: the final 0–100 score measures how far your name sits above the chance level for a name of its length: 0 means no closer than a random string of the same length, and 100 means an exact or near-exact collision. This is what lets the low band exist at all, and it is why a distinctive coined name scores low even though it, too, has a nearest neighbor.
The headline score reflects the single closest match the tool found. It is not a stacked sum across matches. The per-signal chips on each result show what is driving that closest match.
That whole calculation is short enough to read. This is the honest core of the engine, condensed for clarity, and it is the same three steps described above:
WEIGHTS = {"sound": 0.30, "spelling": 0.45, "meaning": 0.25}
def score(sound, spelling, meaning, class_match, name_length):
# 1. weighted average over the signals that are present
present = {"sound": sound, "spelling": spelling}
if meaning is not None:
present["meaning"] = meaning
w = sum(WEIGHTS[k] for k in present)
name = sum(WEIGHTS[k] * v for k, v in present.items()) / w
if spelling >= 0.95: # a near-exact spelling is authoritative
name = max(name, spelling)
# 2. multiply by the goods-class gate (1.0 same class, floor 0.30 unrelated,
# 1.0 neutral when no class was entered)
combined = name * class_match
# 3. normalize against the chance level for a name of this length, so a coined
# name reads low even though every name has some nearest neighbor
floor = CHANCE_FLOOR[name_length] # measured once over the ~4.6M-mark corpus
raw = combined * 100
return 0 if raw <= floor else round((raw - floor) / (100 - floor) * 100)The goods-class gate is data-mined, not hand-built
The gate is a 45×45 matrix of multipliers (one cell per pair of Nice classes), and its values are mined from data, not hand-assigned. Parties file oppositions when they believe two marks’ goods overlap, so we measured how often each pair of Nice classes co-occurs across real adversarial USPTO proceedings (opposition and cancellation records), computed a symmetric association strength (PMI / lift: how much more two classes co-occur than chance would predict), and mapped that onto a gate multiplier in the range [0.30, 1.0]. The mined matrix independently reproduced the intuitive goods groupings (foods with foods, beer with spirits, cosmetics with pharmaceuticals), which is the check that it is measuring real market relatedness rather than noise. A shared class is always a direct overlap (gate = 1.0).
Turning the score into a risk band
The 0–100 score is bucketed into a plain-language band. Two things are worth being explicit about, because we make a deliberate choice here.
The band you see is more conservative than the engine’s internal band. On the public dial we reserve “High” for a score of 70 or above, so a borderline near-match reads as “Moderate” rather than alarming red. A scary topic deserves a calm, honest presentation, not a fear-baiting one. Internally, the engine uses lower cutoffs (the natural gap between coined/random noise and genuine near-matches sits around 40). Both are shown below; the API returns the engine band, and the interface intentionally re-buckets with the display thresholds.
| Score | Displayed band |
|---|---|
| 0–39 | Low risk |
| 40–69 | Moderate risk |
| 70–100 | High risk |
| Score | Engine band |
|---|---|
| 0–19 | low |
| 20–39 | med |
| 40–100 | high |
The cutoffs are set relative to the corpus, not to legal outcomes. We tested whether real tribunal win/loss records could anchor them and found they can’t: who wins an opposition is dominated by procedure (defaults, settlements, priority) and non-similarity grounds, so the outcome doesn’t track name similarity (see the benchmarks for that measurement). The cutoffs are therefore honest, tunable thresholds on the similarity score, not predictions of what a tribunal would decide.
What the score does and doesn’t cover
These limits are part of the method. Reading the score without them is misreading it.
- Live word marks only. It screens roughly 4.6 million live word marks in the U.S. federal register. It does not evaluate logos or design marks, trade dress, common-law (unregistered) rights, or state and foreign registrations.
- A periodic snapshot, not real-time. The tool runs against a daily-refreshed copy of the register; the data date is shown on every result. It does not assess actual marketplace use or an examiner’s judgment.
- Similarity, not a legal outcome. A high score means signals worth investigating, not a prediction that an application would be refused. A low score means fewer close matches in this dataset, not that a name is unclaimed or safe to adopt.
Engine version & changelog
The current engine version is 1.4.0-p2. Every change to a weight, cutoff, or signal ticks this version and is recorded here, with what we measured and what changed as a result. Shipping a scoring change without updating this page is not allowed. A methodology page that has drifted from the engine is worse than none.
| Version | Change |
|---|---|
| v1.1 | Set the signal weights (0.45 spelling / 0.30 sound / 0.25 meaning). Weighting the noisier phonetic signal below spelling cut false “high” readings from ~30% to ~3% of distinct pairs. |
| v1.2 | Replaced the spelling metric with a Jaro + edit-distance blend (dropping Jaro-Winkler’s prefix bonus and Jaro’s coincidental-overlap floor). This is what made the low band appear for coined names instead of everything reading medium. |
| v1.3 | Made the phonetic signal require agreement between two encoders (Metaphone and NYSIIS, taking the lower similarity) with short-code down-weighting, removing vowel-dropped false sound-alikes. |
| 1.3.0-p2 | Added base-rate (density) normalization after measuring that raw cutoffs tuned on a small sample didn’t transfer to the full ~4.6M-mark corpus: the low band had gone dead. Normalizing against the chance level for a name’s length restored it. |
| 1.4.0-p2 (current) | Added the semantic signal (vector similarity over the full corpus) and replaced the hand-built goods-class gate with the data-mined 45×45 matrix described above. |
Signals, not verdicts
This tool reports what the public record shows (the marks it found and how similar they are) and never states a legal conclusion. It does not tell you a name is available, taken, clear, or safe to adopt, and it does not predict whether an application would be approved or refused. It is preliminary automated screening based on public USPTO data, not legal advice and not a substitute for a full clearance search or attorney review. Data is derived from USPTO public records; this tool is not affiliated with or endorsed by the USPTO.
See also our Benchmarks (measured results, including the negative ones), what this tool does, our Terms, and Privacy Policy.