Skip to content
How it works

How Clustering Groups Complaints

One person complaining is an anecdote. The same friction described independently by fifteen people is a market. Clustering is what turns the first into the second.

Last updated 2026-08-17

Similarity without embeddings

With an embeddings provider configured, clustering uses cosine distance on vectors. Without one it uses lexical similarity, which costs nothing.

Lexical matching is harder than it sounds: two paraphrases of the same complaint often share only a third of their words. We stem tokens conservatively, and score similarity as the higher of Jaccard and a discounted overlap coefficient, because plain Jaccard badly under-reads paraphrases.

Single linkage, plus a guard

A candidate is compared against the closest existing member of a cluster, not against the union of the cluster's keywords — a union grows and dilutes as the cluster fills, which would make joining progressively harder exactly as evidence accumulates.

Single linkage risks chaining, where loosely related statements walk a cluster away from its topic. A coherence guard requires the candidate to also resemble the cluster overall, which prevents that.

The merge pass

Greedy assignment is order-dependent: whichever statement is seen first anchors a bucket, and a near-miss can strand a sibling in its own cluster. A merge pass afterwards folds together clusters that turn out to describe the same problem.

See it in practice.

Browse opportunities