← Back to game

How it works

LatentGuess treats every word as a point in a 300-dimensional semantic space. The game asks which hidden word best explains the vector movement suggested by your guesses.

1. The word vectors

The vocabulary comes from Word2Vec Google News 300. Each word has a 300-number vector learned from the contexts in which it appeared in the Google News corpus. Words used in similar contexts tend to point in similar directions.

During preparation, vectors are L2-normalized and quantized to signed 8-bit integers. At runtime, a stored component b is reconstructed as b / 127. This saves space, with a small precision loss.

2. Similarity

For a guess vector g and answer vector a, the displayed similarity is their dot product:

s(g, a) = gᵀa = ∑ gᵢaᵢ

Because the vectors were normalized, this dot product is cosine similarity. The implementation computes the equivalent integer expression ∑ bᵍᵢbᵃᵢ / 127², rounds it to three decimals, and displays it as a percentage. A percentile is also calculated by ranking that similarity against every vocabulary word. These results may reflect biases in the training data.

A guess solves the round when it exactly matches the answer, or when it is a close word-form variant: a shared stem or a short prefix variation with similarity at least 0.40.

3. How a one-word hint is chosen

Let g be your guess and a the hidden word. The direction from the guess to the answer is:

Δ = a − g

For each eligible hint word c, the engine measures both its answer similarity cᵀa and how strongly it projects onto that direction. Its least-squares coefficient is:

α = (Δᵀc) / (cᵀc)

A candidate must be a positive directional step (α > 0.05), come from the curated hint pool, and not be the guess, answer, a used word, or a close morphological variant. It must be at least 25% similar to the answer. Every candidate is subject to the dynamic answer-similarity cap below, including candidates that are at least 30% similar to the guess.

s(c, g) ≥ 0.30
cap = clamp(s(g, a) + 0.30, 0.50, 0.90)

The preferred candidate makes at least 0.02 progress over the guess. Among those candidates, the engine chooses the strongest directional projection. If no otherwise-safe candidate meets the 30% guess-similarity preference, the engine relaxes that preference and returns the best eligible fallback. The same cap applies to preferred and fallback candidates.

The coefficient shown in the UI is rounded to one decimal place.

4. The displayed path

The hidden word is represented by ζ:

ζ ≈ g + αc

5. Two hints could be used

The engine can fit a second word d to the same residual direction. It solves the two-variable least-squares system for positive coefficients:

ζ ≈ g + αc + βd

The second word follows the same answer-similarity cap, 30% guess-similarity preference, and fallback behavior. It must also be sufficiently distinct from the first (cosine similarity no greater than 0.75) and have a coefficient between 0.05 and 2.0.

6. Decomposition guesses

After four guesses, a decomposition can spend one turn to ask the engine for a semantic recipe for the hidden word. Unlike a normal hint, it does not have to preserve a player-supplied guess:

ζ ≈ αc + βd (+ γe)

The engine shortlists answer-related words from the curated hint pool, rejects the answer, used words, close word-form variants, overly similar components, then solves for positive least-squares coefficients. The displayed coefficients are rounded to one decimal place before the fit is measured.

Two words are preferred. A third is included only when it raises cosine fit by at least five percentage points. The displayed fit is the cosine similarity between the complete recipe and the hidden word—not the similarity of any individual ingredient. Decompositions award no similarity points, but they use a turn and therefore reduce the remaining solve bonus.

7. Concept guesses

Concept guesses use directions in the embedding space, not similarity to a concept's name. Each direction has a positive pole and a negative pole. Most are made by averaging several normalized contrast vectors:

u_C = normalize(mean(normalize(v(pᵢ) − v(nᵢ))))

For example, plurality combines cats − cat, dogs − dog, houses − house, and many more plural–singular offsets. This reinforces the shared grammatical change while reducing the subject matter contributed by any one pair. Motion and relation use the same method.

Abstractness and emotionality are category-like rather than one repeated word relationship, so they use the direction between broad example centroids. The emotion pole includes varied examples such as happy, sad, angry, and afraid.

u_C = normalize(mean(v(abstract examples)) − mean(v(tangible examples)))

The hidden word is projected onto the direction with r = ⟨v(ζ), u_C⟩.

  • abstraction: abstract ↔ tangible
  • emotion: emotional ↔ neutral
  • motion: moving ↔ still
  • plurality: plural ↔ singular
  • relation: connected ↔ isolated