Good-Turing 平滑实现问题

问题描述 投票:0回答:1

我想实现 Good-Turing 平滑方法,这将改善我的语言模型。

让我们从理论开始(为简单起见,考虑一元模型)。

有一个语料库(例如文学作品或任何大型文本)。通过它我们正在构建一个语言模型。我们建好之后,就可以求出该词出现的概率。我使用 MLE(最大似然估计)创建了这个模型,其困惑度值很高(构建模型的质量值,值高则不好)。

我找到了一种使用 Good-Turing 平滑来改进它的方法:

Good-Turing smoothing

Good-Turing smoothing 2

这里:

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) 并得到数学域错误

  • 平滑后如何计算最常用词的概率?

读了几篇文章后,我对这个主题的研究得出了以下公式的构造:

estimate

所以主要问题是:如何获得这个E函数? 我发现了这个:

log

但我不知道如何在 scipy 等中搜索 ab 系数

python scipy nlp nltk smoothing
1个回答
0
投票

E 只是一个线性函数,可以自动参数化,所以不用担心。您还可以使用 PyTorch 中的 Belu

© www.soinside.com 2019 - 2024. All rights reserved.