Давайте начнем с теории (для простоты рассмотрим модель униграммы).
Есть корпус (например, литературное произведение или любой большой текст). С его помощью мы строим языковую модель. После того, как мы его построили, мы можем найти вероятность появления слова. Эту модель я создал с помощью MLE (оценка максимального правдоподобия) с высоким значением недоумения (значение качества построенной модели, высокое значение — плохо).
Я нашел способ улучшить его с помощью сглаживания Гуда-Тьюринга:
[img]https://i.sstatic .net/8X20F.gif[/img]
Здесь:
Код: Выделить всё
P - the probability of use of the word
c - the number of use of the word
N_c - the count words with a frequency - c
N - the count words in the corpus
Код: Выделить всё
def good_turing(tokens):
N = len(tokens) + 1
C = Counter(tokens)
N_c = Counter(list(C.values()))
assert(N == sum([k * v for k, v in N_c.items()]))
default_value = N_c[1] / N
model = defaultdict(lambda: default_value)
types = C.keys()
B = len(types)
for _type in types:
c = C[_type]
model[_type] = (c + 1) * N_c[c + 1] / (N_c[c] * N) # Exception - "math domain error"
return model
- слово с частота c + 1 не может быть в корпусе, поэтому мы пытаемся
взять log(0) и получить Math Domain Error - как рассчитать вероятность наиболее часто используемого слова после сглаживания?
[img]https://i.sstatic .net/LuTFg.gif[/img]
Итак, главный вопрос: как получить эту функцию E ?
Я нашел это:

но я не знаю, как искать коэффициенты a и b в scipy или т. д.
Подробнее здесь: https://stackoverflow.com/questions/396 ... n-problems