计算自然语言处理中单词共现的逐点互信息(PMI)时如何处理零字数

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

我有一个文本中单词的共现矩阵(两个单词 x 和 y 被认为是同时出现的,如果它们都出现在 w 个单词的上下文窗口中)。我想计算两个单词 x 和 y 的逐点互信息,我使用通用公式

PMI(x, y) = log2(P(x, y) / P(x)*P(y))
.

在某些情况下,

P(x)*P(y) = 0
,例如:

X 不是X
30 0
不是Y 0 1500

X 不是X
30 0
不是Y 1000 100

如何处理此类情况,以避免 Python 脚本中出现数学错误(除以零)并避免弄乱数据?

我尝试在网站上查找解释 PMI 的信息,但他们没有提及这种特殊情况。要么这种情况不会经常发生(我无法相信,因为一定有“完美”PMI 之类的东西),要么这个问题的解决方案太微不足道,每个人都知道,但没有人谈论它。可以采取什么措施来解决这个问题?

到目前为止我的想法:

  1. 定义在这种情况下应该发生什么,并使用 if 子句捕获它,然后手动分配所需的值。但这对我来说似乎不准确,并且取决于许多非二元因素。例如,在表一中存在完全相关性,在表二中这种相关性相当巧合,因为几乎整个语料库都由 x 组成,并且 y 必然会随之出现。
  2. 按照此线程的评论中的建议使用某种加性平滑,即为计算中涉及的所有值添加正值。但是这个值应该是多少,以便即使对于小语料库也不会扭曲频率分布 - 1, 0.1, 0.001,完全不同的东西?

如果有任何关于与 PMI 合作时通常接受的程序的提示,我会很高兴。

nlp statistics divide-by-zero
1个回答
0
投票

为了处理

PMI(x, y) = log2(P(x, y) / P(x)*P(y))
中除零的情况。您可以在 PMI 条件下实施以下操作。

if prob_word1 == 0 or prob_word2 == 0 or prob_pair == 0:
    pointwise_mutual_information = float('-inf')
else:
    pointwise_mutual_information = math.log2(prob_pair / (prob_word1 * prob_word2))

您可以做的另一件事是计算 PPMI,即

ppmi = max(pointwise_mutual_information, 0)

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