The Report Was About Sports; the Bug Was About Grammar
The complaint from live use was ordinary: disliking sports articles did not make sports go away. Chasing it produced two corrections, and the second one is the interesting one because it had nothing to do with sports.
With muting wired up, one shelf started hiding articles that had no relationship to anything the reader had rejected — a restaurant piece and a drought story, each scoring around negative six point seven. They shared no subject with the disliked article. What they shared were ordinary Korean connective words, which had accumulated heavy negative weight because they appear in almost every Korean headline, including the ones that got disliked.
The Patch You Reach For First Is Language-Shaped
The obvious fix is to extend the stopword list. It works, for that language, until the next one — and the list will always be shaped like whatever language its author speaks. The original list here was English-shaped with a handful of Korean newsroom words bolted on, which is exactly how you would expect it to look, and exactly why it leaked.
Worse, a stopword list is a claim about vocabulary made ahead of time, by someone who is not looking at the corpus. It cannot know that a word which is a stopword in general prose is a meaningful term in a particular feed, and it cannot notice a new common word arriving.
Ask the Corpus Instead
The general rule is older than any of this and language-agnostic: a term's usefulness is inversely related to how many documents contain it. A token appearing in most of the pool cannot help you choose within that pool, whatever it means and whatever language it is in.
So compute it. Over the rows actually being filtered, count how many contain each token, and ignore any token above a share of the set. The threshold is deliberately low — a token in more than about a seventh of the shelf is already nearly useless as a discriminator — and there is a floor on the number of rows, because document frequency measured over a handful of items is noise.
This is self-maintaining in a way a list can never be. It adapts per shelf, so a word that is common on one topic shelf and rare on another is treated correctly on both. It handles a language nobody anticipated. And it needs no upkeep.
Measure It Per Filtered Set, Not Globally
One design choice worth defending: the frequency is computed over the rows being filtered right now, not over the whole store. That sounds like extra work for a worse estimate, and it is the right call — because "common" is a property relative to the choice you are making. On a shelf about one country, that country's name is in everything and discriminates nothing; on a general headlines shelf, the same token is a strong signal.