INDEX
Latent Dirichlet Allocation(LDA)によるトピックモデリング
Latent Dirichlet Allocation(LDA)は、大量の文書から共通するトピックを自動的に抽出するためのトピックモデリング手法です。
LDAでは、1つの文書は複数のトピックの組み合わせで構成されており、各トピックは複数の単語の分布で表されると考えます。例えば、ニュース記事の集合から「政治」「スポーツ」「経済」などのトピックを見つけることができます。
LDAによるトピックモデリングを図で理解する

LDAとは
LDAは、文書集合の中に隠れているトピック構造を推定する手法です。
文書を単語の集まりとして扱い、どの単語がどのトピックに属しやすいか、また各文書がどのトピックをどの程度含んでいるかを推定します。
- 大量の文書からトピックを抽出できる
- 文書ごとのトピック割合を推定できる
- トピックごとに関連単語を確認できる
- ニュース記事、レビュー、SNS投稿などの分析に使える
LDAの基本的な考え方
LDAでは、文書と単語の関係を次のように考えます。
| 要素 | 考え方 |
|---|---|
| 文書 | 複数のトピックが混ざって構成されている |
| トピック | 複数の単語の出現確率で表される |
| 単語 | いずれかのトピックから生成される |
例えば、あるニュース記事は「政治70%、経済30%」のように、複数のトピックを含むものとして表現できます。
LDAの処理の流れ
- 文書データを集める
- 文章を単語に分割する
- ストップワードなど不要な単語を除去する
- 単語辞書とコーパスを作成する
- LDAモデルを学習する
- トピックごとの単語と文書ごとのトピック割合を確認する
テキストの前処理
LDAを適用する前に、テキストを単語単位に分割し、不要な単語を取り除きます。
ライブラリのインストール
pip install gensim nltk
トークナイズとストップワード除去
import nltk
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
nltk.download('punkt')
nltk.download('stopwords')
# サンプルテキスト
text = "LDA is a topic modeling technique that is widely used in NLP."
# ストップワードを取得
stop_words = set(stopwords.words('english'))
# 小文字化して単語に分割
tokens = word_tokenize(text.lower())
# 不要な単語を除去
filtered_tokens = [
word for word in tokens
if word.isalpha() and word not in stop_words
]
print(filtered_tokens)
このコードでは、英文を単語に分割し、意味を持ちにくい一般的な単語を除去しています。
LDAモデルの実装
gensimを使うと、LDAモデルを比較的簡単に構築できます。
from gensim import corpora
from gensim.models import LdaModel
# 前処理済みのテキスト
texts = [
["lda", "topic", "modeling", "technique", "nlp", "widely", "used"],
["politics", "election", "government", "policy"],
["sports", "team", "player", "game"],
["economy", "market", "stock", "finance"]
]
# 単語辞書を作成
dictionary = corpora.Dictionary(texts)
# コーパスを作成
corpus = [dictionary.doc2bow(text) for text in texts]
# LDAモデルを作成
lda = LdaModel(
corpus=corpus,
num_topics=2,
id2word=dictionary,
passes=15,
random_state=42
)
# トピックを表示
topics = lda.print_topics(num_words=4)
for topic in topics:
print(topic)
このコードでは、前処理済みの文書データから単語辞書とコーパスを作成し、LDAモデルでトピックを抽出しています。
LDAの出力結果の見方
LDAの出力では、各トピックに関連する単語とその重みが表示されます。
Topic 0: 0.20*"sports" + 0.18*"team" + 0.16*"game" + 0.15*"player"
Topic 1: 0.22*"market" + 0.19*"finance" + 0.17*"economy" + 0.15*"stock"
このような結果から、Topic 0はスポーツ関連、Topic 1は経済関連のトピックであると解釈できます。
LDAの主なパラメータ
| パラメータ | 説明 |
|---|---|
num_topics |
抽出するトピック数 |
passes |
学習時にコーパスを何回繰り返し処理するか |
alpha |
文書がどの程度複数トピックを含むかに影響する |
eta |
各トピックがどの程度多様な単語を含むかに影響する |
random_state |
結果の再現性を保つための乱数設定 |
トピック数を変更する例
トピック数は、データの内容や分析目的に応じて調整します。
lda = LdaModel(
corpus=corpus,
num_topics=3,
id2word=dictionary,
passes=15,
random_state=42
)
topics = lda.print_topics(num_words=4)
for topic in topics:
print(topic)
num_topicsを変更することで、抽出されるトピックの粒度が変わります。
LDAの長所と短所
| 長所 | 短所 |
|---|---|
| 大量の文書から自動的にトピックを抽出できる | トピック数を事前に指定する必要がある |
| 文書ごとのトピック割合を確認できる | 結果の解釈に人間の判断が必要 |
| 教師なしで文書構造を分析できる | 前処理の品質に結果が大きく左右される |
| ニュース、レビュー、SNS分析などに応用しやすい | 短い文章ではトピックが安定しにくい場合がある |
LDAの活用例
- ニュース記事の分類: 政治、経済、スポーツなどの話題を抽出する
- 論文分析: 研究分野やテーマの傾向を把握する
- SNS分析: 投稿内容から話題や関心を抽出する
- レビュー分析: 商品レビューから共通する不満や評価ポイントを見つける
- 問い合わせ分析: 顧客からの問い合わせ内容を分類する
LDAを使う際のポイント
- 不要語や記号を取り除く前処理が重要
- トピック数は複数試して比較する
- 抽出された単語からトピック名を人間が解釈する
- 短すぎる文書では結果が不安定になりやすい
- 可視化ツールを使うとトピックの関係を理解しやすい