我有一个文本中单词的共现矩阵(两个单词 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 之类的东西),要么这个问题的解决方案太微不足道,每个人都知道,但没有人谈论它。可以采取什么措施来解决这个问题?
到目前为止我的想法:
如果有任何关于与 PMI 合作时通常接受的程序的提示,我会很高兴。
为了处理
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)
。