はじめに

デジタルトランスフォーメーション(DX)は急速に成長しており、それに伴い大量のテキストセットを分類する必要性が高まっています。潜在ディリクレ配分(LDA)は、テキストデータ内の隠れたトピックを特定するための一般的なアプローチであり、この問題を扱うための効果的な方法です。

この記事では、テキスト分析に最適な大規模なニュースストーリーのコレクションであるAG Newsデータセットを使用してLDAをどのように使用するかを示します。LDAは、企業がデータ駆動型の意思決定に向かって進む中で、重要なトレンドやテーマを特定するのに役立つため、今日のDX主導の環境において不可欠なツールです。

トピックモデリングとは?

トピックモデリングは、無監督の機械学習を使用して、テキストコーパス内の隠れたパターンを発見する技術であり、類似した単語をクラスタにグループ化することで基礎となるトピックを明らかにします。たとえば、内容に基づいて文書を請求書、苦情、契約などに分類することができます。

毎日生成される大量のほぼ構造化されていないデータを手動でソートすることは現実的ではありません。トピックモデリングはこのプロセスを自動化し、企業が構造化されていないデータから迅速に洞察を抽出できるようにします。

LDAの紹介:人気のトピックモデリング技術

トピックモデリングの最も一般的な方法の1つが潜在ディリクレ配分(LDA)です。LDAは簡単に言うと次のように機能します:

  1. LDAは、各文書が複数のトピックについて語っていると仮定します。
  2. 各トピックには特定の単語が関連付けられています。
  3. コンピュータは、どの単語が一緒にトピックを形成し、各文書にどのトピックが存在するかを見つけ出そうとします。

たとえば、多くの記事が「プレーヤー」、「チーム」、「スコア」、「選手権」といった単語を含む場合、LDAはこれを「スポーツ」トピックとして特定するかもしれません。

AG Newsデータセット

このブログ投稿では、AG Newsデータセットと呼ばれるニュース記事のコレクションを使用します。これは以下で構成されています:

  • 120,000のトレーニングサンプルと7,600のテストサンプル
  • 4つのクラス:世界、スポーツ、ビジネス、サイエンス/技術
  • 各クラスには30,000のトレーニングサンプルと1,900のテストサンプルがあります

このデータセットは、異なるカテゴリにわたる多様なニュース記事が含まれているため、トピックモデリングに特に適しています。

データの準備

LDAを適用する前に、データを前処理する必要があります。次のPythonスクリプトで始めましょう:

    
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer

# データの読み込み
df = pd.read_csv("/kaggle/input/ag-news-classification-dataset/train.csv")

# タイトルと内容を結合
df['Text'] = df['Title'] + ' ' + df['Description']

# 文書-単語行列の作成
vectorizer = CountVectorizer(max_df=0.95, min_df=2, stop_words='english')
doc_term_matrix = vectorizer.fit_transform(df['Text'])
    

このスクリプトは以下のことを行います:

  1. AG Newsデータセットを読み込みます
  2. 各記事のタイトルと内容を結合します
  3. CountVectorizerを使用して文書-単語行列を作成します。このプロセスでは:
    • 一般的な英語のストップワードを削除します
    • 95%以上の文書に出現する用語を無視します(max_df=0.95)
    • 2文書未満に出現する用語を無視します(min_df=2)

LDAの実装

データが準備できたので、LDAを実装しましょう:

    
from sklearn.decomposition import LatentDirichletAllocation

# LDAモデルの設定とトレーニング
lda_model = LatentDirichletAllocation(n_components=10, random_state=42)
lda_output = lda_model.fit_transform(doc_term_matrix)

# 各トピックの上位単語を表示
feature_names = vectorizer.get_feature_names()
for topic_idx, topic in enumerate(lda_model.components_):
    top_words = [feature_names[i] for i in topic.argsort()[:-10 - 1:-1]]
    print(f"トピック {topic_idx}: {', '.join(top_words)}")
    

このスクリプトの結果は以下の通りです:

  • トピック 0: oil, 39, prices, quot, oracle, peoplesoft, said, european, bid, reuters
  • トピック 1: gt, lt, 39, world, font, new, year, dvd, face, said
  • トピック 2: 39, open, world, gaza, final, game, test, australia, cup, israeli
  • トピック 3: reuters, percent, 39, sales, quarter, stocks, new, said, profit, year
  • トピック 4: 39, said, space, reuters, ap, iran, nuclear, new, palestinian, people
  • トピック 5: microsoft, new, 39, software, internet, service, computer, security, search, mobile
  • トピック 6: 39, ap, game, win, night, new, victory, team, league, lead
  • トピック 7: gt, lt, reuters, com, said, fullquote, million, company, new, target
  • トピック 8: iraq, said, president, 39, ap, bush, reuters, killed, afp, minister
  • トピック 9: 39, ap, year, season, coach, new, sports, football, time, team

結果の分析

LDAを実行した後、AG Newsデータセットの元のカテゴリにおおよそ対応するトピックが見つかるかもしれません。たとえば:

  • 世界:トピック 0, トピック 4, トピック 8
  • スポーツ:トピック 2, トピック 6, トピック 9
  • ビジネス:トピック 3, トピック 7
  • サイエンス/技術:トピック 5

ただし、「gt」、「lt」、「quot」などの無意味な単語が含まれるトピックもあります。これは、ストップワードや句読点を削除する前処理ステップによって文脈が失われた可能性があります。テキストの前処理方法を別のアプローチで改善してみましょう。

spaCyを使用して結果を改善する

より高度なテキスト前処理技術を使用することで、結果を改善できます。このための強力なツールの1つがspaCyであり、Pythonで人気のあるNLPライブラリです。パイプラインにいくつかの変更を加えてみましょう:

  • 品詞フィルタリング: 特定の品詞のみを保持することで、最も意味のある単語に焦点を当て、ノイズを減らします。
  • レマタイゼーション: 単語をその基本形に減らし、関連する単語をグループ化するのに役立ちます(たとえば、「running」、「ran」、「runs」はすべて「run」になります)。
  • 固有表現認識: spaCyのモデルは固有名詞をより適切に処理でき、ニュース記事のトピックに重要です。
    
import spacy

nlp = spacy.load("en_core_web_md")

def clean_data(data):
    include_pos = ["NOUN", "VERB", "ADV", "PROPN", "ADJ"]
    tokens = nlp(data)
    tokens = [t.lemma_ for t in tokens if t.pos_ in include_pos]
    return " ".join(tokens)

df["NormalizeText"] = df.Text.apply(clean_data)
    

データを前処理した後、以前と同様にLDAを適用できます。これが結果をどのように改善するか見てみましょう:

  • トピック 0: oil, price, reuters, stock, rise, high, new, say, dollar, year
  • トピック 1: space, win, say, new, world, athens, team, year, gold, nasa
  • トピック 2: say, red, reuters, league, sox, ap, united, new, israeli, quot
  • トピック 3: microsoft, new, software, company, google, search, service, web, user, internet

結論

LDAを使用することで、AG Newsデータセット内の意味のあるトピックを発見することができ、テキスト分類タスクにおける無監督学習の力を示しています。企業がデジタルトランスフォーメーションを進める中で、LDAのような手法は膨大なテキストデータから洞察を得る上で重要な役割を果たします。テキスト前処理方法を洗練させることで、発見されるトピックの質をさらに向上させ、LDAを実世界のアプリケーションにとってさらに価値のあるものにすることができます。