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.