我想实现 Good-Turing 平滑方法,这将改善我的语言模型。
让我们从理论开始(为简单起见,考虑一元模型)。
有一个语料库(例如文学作品或任何大型文本)。通过它我们正在构建一个语言模型。我们建好之后,就可以求出该词出现的概率。我使用 MLE(最大似然估计)创建了这个模型,其困惑度值很高(构建模型的质量值,值高则不好)。
我找到了一种使用 Good-Turing 平滑来改进它的方法:
这里:
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
我在 Python 3 上的代码:
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) 并得到数学域错误
平滑后如何计算最常用词的概率?
读了几篇文章后,我对这个主题的研究得出了以下公式的构造:
所以主要问题是:如何获得这个E函数? 我发现了这个:
但我不知道如何在 scipy 等中搜索 a 和 b 系数
E 只是一个线性函数,可以自动参数化,所以不用担心。您还可以使用 PyTorch 中的 Belu