Latent Dirichlet Allocationによるトピックモデリング | 次元削減と特徴量抽出 | Pythonによる機械学習を学ぶ

スポンサーリンク
スポンサーリンク
amazon
スマイルSALE
--:--:--
ad. 価格範囲を指定して商品を探せます

Latent Dirichlet Allocation(LDA)によるトピックモデリング

Latent Dirichlet Allocation(LDA)は、大量の文書から共通するトピックを自動的に抽出するためのトピックモデリング手法です。

LDAでは、1つの文書は複数のトピックの組み合わせで構成されており、各トピックは複数の単語の分布で表されると考えます。例えば、ニュース記事の集合から「政治」「スポーツ」「経済」などのトピックを見つけることができます。

LDAによるトピックモデリングを図で理解する

LDAによるトピックモデリングを図で理解する

LDAとは

LDAは、文書集合の中に隠れているトピック構造を推定する手法です。

文書を単語の集まりとして扱い、どの単語がどのトピックに属しやすいか、また各文書がどのトピックをどの程度含んでいるかを推定します。

  • 大量の文書からトピックを抽出できる
  • 文書ごとのトピック割合を推定できる
  • トピックごとに関連単語を確認できる
  • ニュース記事、レビュー、SNS投稿などの分析に使える

LDAの基本的な考え方

LDAでは、文書と単語の関係を次のように考えます。

要素 考え方
文書 複数のトピックが混ざって構成されている
トピック 複数の単語の出現確率で表される
単語 いずれかのトピックから生成される

例えば、あるニュース記事は「政治70%、経済30%」のように、複数のトピックを含むものとして表現できます。

LDAの処理の流れ

  1. 文書データを集める
  2. 文章を単語に分割する
  3. ストップワードなど不要な単語を除去する
  4. 単語辞書とコーパスを作成する
  5. LDAモデルを学習する
  6. トピックごとの単語と文書ごとのトピック割合を確認する

テキストの前処理

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を使う際のポイント

  • 不要語や記号を取り除く前処理が重要
  • トピック数は複数試して比較する
  • 抽出された単語からトピック名を人間が解釈する
  • 短すぎる文書では結果が不安定になりやすい
  • 可視化ツールを使うとトピックの関係を理解しやすい