さいとー・ま

さいとー・ま

さいとう・まの。おしごとは manoestasmanoあっとgmail.com (あっとを いれかえてください)まで。

テキストマイニングへの道03――トピックモデルとの格闘1

はじめに

今回は念願のトピックモデルをしていきたいと思って行った格闘を記録しておく。特に有用な知見はないと思うので、期待しないように。

トピックモデルとは、データがどういうジャンルの話をしているかをグループ分けしてくれるものだと思う。まだ、何も分かっておらず、トピックモデルを使うといいと聞いただけの段階なので信用しないでください。

今回はpythonというプログラミング言語を使っていく。
前回はgoogle colaboratoryを使っていたが、今回はjupyter notebookを使う。
【初心者向け】Jupyter Notebookの使い方!インスト…|Udemy メディア
を参考のこと。

Mecab

トピックモデルを使うには、Mecabという日本語を解析するものをインストールをするとよいらしい。
rinsaka.com
これのWindowsのやり方に従った。ちなみに、「Windows では MeCab をインストールした後,Anaconda Prompt で pip を使って mecab-python3 をインストールする」ことができていなくて、長い間悪戦苦闘していた。

スクリプト

とりあえず、次のようなスクリプトを使うと、それぞれの行がそれぞれのモデルがどれくらい登場しているといえるのか分かるのだと思う。次のサイトを主に参照した。
qiita.com
また、おそらく絵文字を上手く処理できなかったみたいなので、絵文字を消すために、emojiというモジュールをimportして、emoji.replace_emoji(line)をそれぞれの行で行った。
それぞれMeCabとemojiは

pip install mecab-python3

pip install emoji

とインストールした。
変えるところとしては、***.txtというファイル名。

import MeCab
import emoji
from gensim.corpora.dictionary import Dictionary
from gensim.models import LdaModel
from collections import defaultdict

# MeCabオブジェクトの生成
mt = MeCab.Tagger('')
mt.parse('')

# トピック数の設定
NUM_TOPICS = 10

if __name__ == "__main__":
# トレーニングデータの読み込み
# train_texts は二次元のリスト
# テキストデータを一件ずつ分かち書き(名詞、動詞、形容詞に限定)して train_texts に格納するだけ
train_texts =
with open('***.txt', 'r', encoding='utf-8') as f: # ***のところを自分のファイル名にかえる。
for line in f:
line = emoji.replace_emoji(line)
text =

node = mt.parseToNode(line.strip())
while node:
fields = node.feature.split(",")
if fields[0] == '名詞' or fields[0] == '動詞' or fields[0] == '形容詞':
text.append(node.surface)
node = node.next
train_texts.append(text)

# モデル作成
dictionary = Dictionary(train_texts)
corpus = [dictionary.doc2bow(text) for text in train_texts]
lda = LdaModel(corpus=corpus, num_topics=NUM_TOPICS, id2word=dictionary)

# テストデータ読み込み
# test_texts は train_texts と同じフォーマット
test_texts =
raw_test_texts =

with open('***.txt', 'r', encoding='utf-8') as f: # ***のところを自分のファイル名にかえる。
for line in f:
line = emoji.replace_emoji(line)
text = []
raw_test_texts.append(line.strip())
node = mt.parseToNode(line.strip())
while node:
fields = node.feature.split(",")
if fields[0] == '名詞' or fields[0] == '動詞' or fields[0] == '形容詞':
text.append(node.surface)
node = node.next
test_texts.append(text)

# テストデータをモデルに掛ける
score_by_topic = defaultdict(int)
test_corpus = [dictionary.doc2bow(text) for text in test_texts]

# クラスタリング結果を出力
for unseen_doc, raw_train_text in zip(test_corpus, raw_test_texts):
print(raw_train_text, end='\t')
for topic, score in lda[unseen_doc]:
score_by_topic[int(topic)] = float(score)
for i in range(NUM_TOPICS):
print('{:.2f}'.format(score_by_topic[i]), end='\t')
print()

そして、この後にモデルを閲覧するために、chatGPTの書いてくれた次のスクリプトを使う。

!pip install pyLDAvis
import pyLDAvis.gensim_models as gensimvis
vis_data = gensimvis.prepare(lda, corpus, dictionary)
pyLDAvis.display(vis_data)

この二つをくっつける方法は必ずあるはずだが、今回はうまくいかなかったので、次の課題と言うことにしておこう。
ちなみに、これだと頻繁に使われて意味のない単語ばかりが拾われてあまり意味がなかった。ストップワードというものを除去する手法を今後学んでいきたいと思っている。