gensimのLdaModelでtop_topic()を使おうとしたらいろいろバグが残っていたので、とりあえず手元で動くようにしてみました。詳細はMLに報告しましたが、これが正しい解法かは自信がありません。
問題は複数ありますが、まずは名前空間に不備があります。”np”と”ifilter”という2つの関数をglobalで利用しようとして失敗します。これは以下のように無理やり定義してやれば問題を回避できます。
import gensim gensim.models.ldamodel.np = gensim.models.ldamodel.numpy import itertools gensim.models.ldamodel.ifilter = itertools.ifilter # for python2.x #gensim.models.ldamodel.ifilter = itertools.filter # for python3
これ以外に、LdaModel.top_topics()に与えたcorpusによってはKeyErrorが発生する問題があります。これはMLにも書いたようなパッチで回避できました。
--- ldamodel.py.old 2015-06-01 22:40:03.484170877 +0900
+++ ldamodel.py 2015-06-01 22:42:06.016170862 +0900
@@ -776,9 +776,14 @@
for topic in xrange(len(topics)):
topic_coherence_sum = 0.0
for word_m in topics[topic][1:]:
- doc_frequency_m = len(doc_word_list[word_m])
- m_set = set(doc_word_list[word_m])
+ x = doc_word_list.get(word_m, None)
+ if x is None:
+ continue
+ doc_frequency_m = len(x)
+ m_set = set(x)
for word_l in topics[topic][:-1]:
+ if doc_word_list.get(word_l, None) is None:
+ continue
l_set = set(doc_word_list[word_l])
co_doc_frequency = len(m_set.intersection(l_set))
topic_coherence_sum += numpy.log(
私の環境では、これでgensim 0.11.1においてtop_topicsが機能するようになりました。