ゼロから作るDeep Learning②のPMIの計算方法について
ゼロから作るDeep Learning②のPMIの計算方法について
本書79p. にて定義されるPMIの計算方法について納得いかず意見・ご指摘を求めるべく投稿します。
コーパス(You say goodbye and I say hello.)の共起行列Cを基にPMIを計算するところで、
全単語数に相当するNを共起行列の全合計で以って数えている部分、
元のコーパスの単語数は8なのに対して、
np.sum(C)は14となりこの時点で倍近い値を取っています。
YouとsayについてPMIを求めると、本来ならば
PMI = log2(1 * 8 / 1 * 2) = 2
になると思うのですが、本書では
PMI = log2(1 * 14 / 1 * 4) = 1.807
となっています。
細かいことは気にしないと言うことで近似解をとっているのかとも思いましたが、言及がないためモヤモヤしています。
ご存知の方、ご教示いただけると幸いです。
ソースコード
def ppmi(C, verbose=False, eps=1e-8):
M = np.zeros_like(C, dtype=np.float32)
N = np.sum(C)
S = np.sum(C, axis=0)
total = C.shape[0] * C.shape[1]
for i in range(C.shape[0]):
for j in range(C.shape[1]):
pmi = np.log2(C[i,j] * N / (S[i]*S[j]) + eps)
M[i, j] = max(0, pmi)
return M
0