読者です 読者をやめる 読者になる 読者になる

pythonでgensimを使ってトピックモデル(LDA)を行う

自然言語処理 python データ解析 前処理 機械学習

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*"アップ"
...

トピックモデル (機械学習プロフェッショナルシリーズ)

トピックモデル (機械学習プロフェッショナルシリーズ)