You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自然语言处理中计算PMI时如何处理零词频问题?

处理PMI计算中的除零及语料未出现词的通用方法

先明确触发除零的真实场景

你之前的示例里P(x)*P(y)其实不为0——因为x和y都有明确的出现次数(至少30次),边缘概率P(x)和P(y)都大于0。真正会导致P(x)*P(y)=0的情况,是x或y从未在整个语料中出现过(总出现次数为0),此时对应的边缘概率为0。

通用处理方案

1. 提前过滤+条件赋值

  • 预处理阶段先筛掉语料中完全没出现过的词,只保留有出现记录的词对进行计算,从根源避免零概率问题。
  • 如果遇到漏网的词对(比如动态生成的未知词),直接给PMI赋值为负无穷或NaN:从PMI的定义(衡量共现的意外程度)来看,从未出现的词没有统计关联意义,负无穷能准确表达“完全无关联”,同时避免报错。
  • Python实现示例:
    import math
    
    def compute_pmi(p_xy, p_x, p_y):
        # 捕获x或y未出现的情况
        if p_x == 0 or p_y == 0:
            return -float('inf')
        # 计算PMI
        return math.log2(p_xy / (p_x * p_y))
    

2. 加法平滑(Laplace平滑)

  • 当语料规模较小,或者不想做额外过滤时,给所有计数(共现计数、词的总出现计数、语料总上下文窗口数)加一个小正数α(通常取1),再计算平滑后的概率:
    • 平滑后边缘概率:P'(x) = (count(x) + α) / (total_windows + α * vocab_size)
    • 平滑后共现概率:P'(x,y) = (count(x,y) + α) / (total_windows + α * vocab_size²)
  • 注意:α别取太大,否则会稀释真实的共现信号,α=1是最通用的默认值,适合大多数场景。这种方法不需要额外条件判断,直接通过平滑避免零概率。

补充:共现次数为0但词本身有出现的情况

如果x和y都在语料中出现,但从未共现(P(x,y)=0),此时计算PMI会得到log2(0/(P(x)*P(y))) = -inf,这是合理的——因为两个词完全没有共现关联,负无穷符合PMI的语义,不需要额外处理。

内容的提问来源于stack exchange,提问作者AlinaOs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 20:26:20