Harukaのnote

Linuxやプログラミング,写真,旅行等の記録帳

BoWをgensimのLSIで次元圧縮する際のエラー

はじめに

今回は本当にメモ程度に残します。
対策も英語のサイトばかりでしたので。

下記のようなコードで準備したデータをscikit-learnのsvm.SVCでfitすると、データのサイズが違うよ、とエラーが出ました。

# 分かち書きされたテキストのリスト
list_wakati = get_words(df_train)
# BoW用の辞書
dictionary = make_dict(list_wakati)

bow_corpus = get_BoW(dictionary, list_wakati)
n_topics = 300
lsi_model = models.LsiModel(bow_corpus, id2word = dictionary, num_topics = n_topics)
lsi_corpus = lsi_model[bow_corpus]

理由は、LsiModelで圧縮されたデータは、0を省略するらしく、num_topicsで指定した次元に満たないものができるかららしいです。

対策としては、gensim.matutilsのparse2fullで整形してやるといけるみたいです。

shaped_values = []
# LSIで圧縮すると、サイズが n_topics に満たないものがいくつか作られる
# そのため、 sparse2full で整形する
for values in lsi_corpus:
    vec = matutils.sparse2full(values, n_topics)
    shaped_values.append(vec)

「gensim lsi different size」みたいな感じで検索をかけましたが、なかなかでてこず困りました^^;