- Take the set of 500 of most popular tags on the site in question. Find and store the correlation of pairs of these tags, e.g. the proportion of the time that a question tagged
c#
is also tagged.net
. - For each user, assemble a score by tag; for each non-CW question/answer, for each tag on the question, they receive a score in that tag equal to their number of upvotes, divided by the number of tags on the question, times 1 minus the correlation between this tag and the other tags on the question, per each tag (i.e. if
c#
is correlated 0.8 with.net
and 0.3 withlinq
, then the user's score forc#
in a question that is also tagged.net
andlinq
is multiplied by 0.2 * 0.7 = 0.14). Scores for tags not found in the correlation table are not adjusted for correlation, i.e. they're simplyvotes / num_tags
. - For each tag score, apply this formula:
score = (score * 50) / (score + 50)
. (This caps the output at 50 and imposes an extremely tough curve of diminishing returns over 25.) - Sum the resulting tag scores. If the result is >= 500, the user qualifies for the Generalist badge.
The various constants in there are wild-assed guesses; the core idea is the methodology. It at least attempts to address the tag overlap issues that have plagued discussion of implementing Generalist. I expect it to be torn apart, but perhaps it's a start. :)
Please see also my suggestion for Polymath, which would be a gold badge with the same logic but 5x the awarding threshold (so 2500 if the 500-point threshold above were adopted).