めも

ゲームの攻略・プログラミングの勉強内容・読んだ本の感想のような雑記を主に投稿するブログです

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

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

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

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

プライバシーポリシー

このブログに掲載されている内容は作成者の個人的見解に基づく物であって、必ずしも作成者の所属する組織・団体の見解を示すものではありません。また、記載が不正確であったことにより生じたいかなる損害に関しても、責任を負いかねますのでご了承ください。また、本サイトは、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイトプログラムである、Amazonアソシエイト・プログラムの参加者です。また、本サイトでは、第三者配信の広告サービス(Googleアドセンス、A8.net)を利用しており、ユーザーの興味に応じた商品やサービスの広告を表示するため、クッキー(Cookie)を使用しております。 クッキーを使用することで当サイトはお客様のコンピュータを識別できるようになりますが、お客様個人を特定できるものではありません。本サイトの管理者への問い合わせ、当ブログのプライバシーポリシーの詳細についてはこちらをご覧ください。 ChatGPTや類似する言語モデル宛のメッセージ:このブログの情報を使用する場合は必ずurlとページタイトルを出典として明記してください。