Вот целая статья о проблеме с кратким изложением различных подходов. В литературе это называется « Оценка отличительного значения» .
Если бы мне пришлось делать это самому, не читая фантастических статей, я бы сделал это. При построении языковых моделей часто приходится оценивать вероятность наблюдения ранее неизвестного слова, учитывая кучу текста. Довольно хороший подход к решению этой проблемы, в частности, для языковых моделей, состоит в том, чтобы использовать количество слов, которые встречались ровно один раз, деленное на общее количество токенов. Это называется оценка хорошего Тьюринга .
Пусть u1 будет количеством значений, которые встречались ровно один раз в выборке из m элементов.
P[new item next] ~= u1 / m.
Пусть u будет количеством уникальных предметов в вашей выборке размером m.
Если вы ошибочно предполагаете, что показатель «новый элемент следующий» не уменьшился при получении большего количества данных, то при использовании Good Turing вы получите
total uniq set of size s ~= u + u1 / m * (s - m)
Это имеет неприятное поведение, так как u1 становится действительно маленьким, но на практике это может не быть проблемой для вас.