gensimとjanomeを用いたLDAを行います。 必要なデータは一行ごとに文章が入ったtxtファイルです。
LDA用のデータの作成
data.txt
には一行ごとに文章が保存されています。
この文章から名詞のみを取り出して、word_vector
に保存していきます。
import codecs as cd import gensim from janome.tokenizer import Tokenizer from gensim import corpora, models, similarities filename = 'data.txt' file = cd.open(filename, 'r', 'utf-8') lines = filed.readlines() t = Tokenizer() wvs = [] for i, line in enumerate(lines): # 一つのページのワードのベクトル word_vector = [] # 短すぎる場合は無視 if len(line)<30: continue # 記号以外はベクトル作成 else: tokens = t.tokenize(line) for token in tokens: if token.part_of_speech[:2] == '名詞': word_vector += [token.base_form] # データを連結 wvs += [word_vector]
単語の辞書を作成して出力
wvs
には文章ごとの単語のリストが保存されているので、ここからコーパスを作成します。
なんども使う事になるはずなので、外部のファイルに出力しておきます。
no_below=2
で二回以下しか出現したい単語は無視しますno_above=0.3
で全部の文章の30パーセント以上に出現したワードは一般的すぎるワードとして無視します
# 辞書作成 dictionary = corpora.Dictionary(wvs) dictionary.filter_extremes(no_below=2, no_above=0.3) dictionary.save_as_text('dict.txt') # コーパスを作成 corpus = [dictionary.doc2bow(text) for text in wvs] corpora.MmCorpus.serialize('cop.mm', corpus)
外部に保存したコーパスと辞書の読み込み
dictionary = gensim.corpora.Dictionary.load_from_text('dict.txt') corpus = corpora.MmCorpus('cop.mm')
LDAの実行
topic_N
がトピックの数です。lda.print_topic(i)
でトピックを可視化します。
コード
topic_N = 20 lda = gensim.models.ldamodel.LdaModel(corpus=corpus, num_topics=topic_N, id2word=dictionary) for i in range(topic_N): print('TOPIC:', i, '__', lda.print_topic(i))
出力例
TOPIC: 1 __ 0.031*"ログイン" + 0.025*"かっこいい" + 0.019*"用品" + 0.017*"インテリア" + 0.017*"美容" + 0.017*"品" + 0.016*"ファッション" + 0.013*"方" + 0.011*"メンズ" + 0.011*"アップ" ...
- 作者: 岩田具治
- 出版社/メーカー: 講談社
- 発売日: 2015/04/08
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る