• 自然语言处理4-5:语言模型之平滑操作


    为什么需要平滑操作

    假设有一个预料集

    我 喜欢 喝 奶茶
    我 喜欢 吃 巧克力
    我 喜欢 健身
    天啦撸,一起同过窗 要出 第三季 了

    这个时候要计算“我喜欢喝咖啡”的概率

    假设我们用bi-gram模型来计算,也就是说

          P(我喜欢喝咖啡) = P(我)P(喜欢|我)P(喝|喜欢)P(咖啡|喝) = (3/16) * (1)  * (1/3) * (0) = 0

    但是我们都容易感觉出来,“我喜欢喝咖啡”是符合语言习惯的句子,也就是说,虽然现在的语料库中没有这个句子,但是将来也有可能出现,但是我们算出的这个句子出现的概率是0,这不符合常识。因为语料库中没有出现“喝”后面接“咖啡”,只能说明这个句子未来出现的概率比较小,但是不排除它会出现,毕竟“我喜欢喝”这个前缀的概率该是很大的,“喝 咖啡”没有出现,只能说明“喝”后面接“咖啡”的概率很小,但是就将这个句子的概率定为0是不科学的。那么,该如何做才能使得没出现的搭配也能有一个小的概率呢?

    Add-one smoothing

    直接给公式:

    $$P(w _{i}| w_{i-1}) = frac{C(w_{i-1}, w_{i}) + 1}{C(w_{i-1})+v} $$

    这里的v是词典库的大小,注意,是词典库的大小,不是训练的预料集分词之后的词语个数。例如,对于上面那个预料集,分词之后有16个单词,但是词典库的大小是12个。所以v是12哦。

    分母加1可以理解,为了让那些出现频次为0的$C(w_{i-1}, w_{i})$算出来的概率不为0,从而避免了因为它使得整个句子的概率为0了。

    可是为什么分子要加v呢,笨蛋,为了使得$sum_{w_{i}}^{}  frac{C(w_{i-1}, w_{i}) + 1}{C(w_{i-1})+v} $为1啊,物理意义就是,词典库中有v个词汇,$w_{i-1}$后面接的单词在这v个词汇之中的概率要为1,也就是加起来为1。

    add-k Smoothing

    没啥好说的,上公式:

    $$P(w _{i}| w_{i-1}) = frac{C(w_{i-1}, w_{i}) + k}{C(w_{i-1})+kv} $$

    只是由加1变成了加k而已啦。add-one smoothing和add-k smoothing都是拉普拉斯平滑

    interpolation

    但是其实上面介绍的两个平滑还是会有一个问题没有解决

    下面举一个例子

    假设我们有语料库

    in the bathroom
    the kitchen
    kithcen
    arboretum

    如果通过add-one smoothing,我们计算P(kitchen|in the)和P(arboretum|in the)的值是一样的,因为他们的频次都是0,所以值都是(0+1)/(1+ 7) = 1/8。但是我们直观感觉,in the kitchen 肯定要比in the arboretum的概率要大得多,那么这种感觉是怎么来的呢?因为kitchen和the kitchen出现的次数大于arboretum和the arboretum啊笨蛋。所以我们计算tri-gram模型的概率的时候,如果能够考虑bi-gram和unigram的概率,那么就能避免上述情况了。

    公式也很简单,如下:

    $$P^{'} (w_{n}|w_{n-1},w_{n-2}) = lambda _{1}P (w_{n}|w_{n-1},w_{n-2})  +lambda _{2}P (w_{n}|w_{n-1})+lambda _{3}P (w_{n})$$

    其中$lambda _{1},lambda _{2},lambda _{3}$是可以变化的参数,且满足$lambda _{1} + lambda _{2} + lambda _{3} = 1$

     good-turning smoothing

    老规矩,先说为什么需要发明这个算法,请看下图哦

     Q1:总共18条鱼,有一条鲨鱼,好简单,不就是1/18吗

    Q2:对哈,还有可能出现新鱼种,但是这个该怎么算呢,又不知道新鱼种的比例之类的,没关系,对于前面18个已经钓到的鱼来说,鲨鱼,草鱼,鳗鱼都只是钓到了一次,所以是不是可以认为是新鱼种呢,所以概率就是1/6

    Q3:咦,既然新鱼种也占了一部分,那确实不能再用1/18表示接下来钓到鲨鱼的概率了呢,那么怎么表示呢,就是如下的公式:

    如果对一个语料库进行统计之后,要预测接下来出现某个单词的概率

    对于没有出现的单词:

    $$P = frac{N_1}{N} $$

    对于出现c次的单词:

    $$P = frac{(c+1)N_{C+1}}{N_C*N} $$

    这里的$N_c$指的是在预料集中出现频次为c的单词的个数

    实践证明,good-turning算法得出的概率和实际情况很符合,如下图所示:第一列r是出现频次,第二列Nr是相应频次的单词个数,第三列是根据good-turning算法算出的下一次会出现的概率,第四列是在测试集中对相应频次的单词的个数的统计结果,与第三列很相似啊,兄嘚!!!!太激动了,仿佛是我发的论文一样。靠,原来不是我发的

  • 相关阅读:
    JSP基础学习(二)
    JSP基础学习(一)
    Android 使用开源xUtils来实现多线程下载(非原创)
    Android 多线程断点下载(非原创)
    Android HttpClient框架get和post方式提交数据(非原创)
    Android ListView使用(非原创)
    ScrollView 的使用(非原创)
    Android SQLite API的使用(非原创)
    Android SQLite的使用2(非原创)
    位运算
  • 原文地址:https://www.cnblogs.com/loubin/p/13720987.html
Copyright © 2020-2023  润新知