最近、あるサイトのコードを参考に、numpy を使って Python で LDA トピック モデルの Gibbs サンプリングを実装しました。ギブス サンプリングの反復ごとに、1 つの (現在の) 単語を削除し、LDA モデルから推測された事後条件付き確率分布に従ってその単語の新しいトピックをサンプリングし、次のように単語トピック カウントを更新します。
for m, doc in enumerate(docs): #m: doc id
for n, t in enumerate(doc): #n: id of word inside document, t: id of the word globally
# discount counts for word t with associated topic z
z = z_m_n[m][n]
n_m_z[m][z] -= 1
n_z_t[z, t] -= 1
n_z[z] -= 1
n_m[m] -= 1
# sample new topic for multinomial
p_z_left = (n_z_t[:, t] + beta) / (n_z + V * beta)
p_z_right = (n_m_z[m] + alpha) / ( n_m[m] + alpha * K)
p_z = p_z_left * p_z_right
p_z /= numpy.sum(p_z)
new_z = numpy.random.multinomial(1, p_z).argmax()
# set z as the new topic and increment counts
z_m_n[m][n] = new_z
n_m_z[m][new_z] += 1
n_z_t[new_z, t] += 1
n_z[new_z] += 1
n_m[m] += 1
上記のコードでは、多項式 scipy 関数を使用して新しい (単一の) z をサンプリングします。
ここで、この論文の共同センチメント トピック モデルを実装したいと思います。ここで、必要なカウントを追跡するために次の構造が必要になります。
3D matrix containing # occurrences for a word for each topic, for each sentiment
3D matrix containing # occurrences for a topic, for each sentiment, for each document
2D matrix containing # occurrences for a topic, for each sentiment
2D matrix containing # occurrences for a sentiment for each document
ここで問題が発生します。この Gibbs サンプラーでは、ドキュメントに表示される単語ごとに、新しいトピックと感情ラベルの両方が条件付き事後分布からサンプリングされます (論文の 4 ページの方程式 5)。Pythonで「これらの2つの値をサンプリングする」にはどうすればよいですか?
前もって感謝します...