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が機能するようになりました。