Methodology

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 weights, engine 1.4.0-p2. Sum to 1.0 when all three are present.
SignalWeightWhy
Spelling (orthographic)0.45Most reliable look-alike signal
Sound (phonetic)0.30Noisier than spelling; down-weighted
Meaning (semantic)0.25Complements 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.

Displayed risk band (what the interface shows). Deliberately conservative.
ScoreDisplayed band
0–39Low risk
40–69Moderate risk
70–100High risk
Engine band (returned by the API on the base-rate-normalized score). Lower cutoffs.
ScoreEngine band
0–19low
20–39med
40–100high

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.

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.

Scoring changelog. Each entry: what was measured → what changed.
VersionChange
v1.1Set 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.2Replaced 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.3Made 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-p2Added 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.

Check a brand name now →

See also our Benchmarks (measured results, including the negative ones), what this tool does, our Terms, and Privacy Policy.