# トピックモデルについて解説！ニュース記事をLDA✕Pythonで分析してみよう！

> 当サイト【スタビジ】の本記事では、自然言語処理において古典的に用いられるトピックモデルについて簡単に解説していきます。トピックモデルの中でもよく用いられるLDAをPythonで動かしてニュース記事をトピック分類していきます。

- URL: https://toukei-lab.com/topic-model
- 公開: 2023.08.08 / 更新: 2025.04.16
- サイト: スタビジ（https://toukei-lab.com）

:::talk{who="umatan"}
当サイト【スタビジ】の本記事では、自然言語処理において古典的に用いられるトピックモデルについて簡単に解説していきます。トピックモデルの中でもよく用いられるLDAをPythonで動かしてニュース記事をトピック分類していきます。
:::

こんにちは！

データサイエンティストのウマたん([@statistics1012](https://twitter.com/statistics1012?lang=ja))です！

今回はトピックモデルについて解説していきます！

トピックモデルとは[自然言語処理](/natural-language-python)の一種で、文書を特定のトピックに分類する古典的なアプローチです。

<mark>トピックモデルの中でも最もよく用いられているLDA（潜在的ディリクレ配分法）を解説し実際にPythonで実装していきます。</mark>

今でも広く用いられているアプローチですのでぜひ理解しておきましょう！

ちなみに当メディアが運営する学習プラットフォーム「[スタアカ](https://toukei-lab.com/achademy/)」の自然言語処理コースで自然言語処理について詳しく学べますので興味のある方はチェックしてみてください！

:::box
[スタアカ：自然言語処理コース](https://toukei-lab.com/achademy/courses/nlp/)\
[![スタアカ「自然言語処理」コース](/wp-content/uploads/2026/10/achademy-course-nlp.jpg)](https://toukei-lab.com/achademy/courses/nlp/)
:::

以下のYoutube動画でも解説していますのであわせてチェックしてみてください！

::youtube{#QGdxhPVAIHQ}

## トピックモデルとは

![stories data](/wp-content/uploads/2021/01/Data-points-rafiki-e1612221774326.png)

トピックモデルの主な目的は、<mark>大量の文書から隠れたトピックを抽出</mark>し、それらのトピックが文書にどのように分布しているかを理解することです。

例えば、**「OpenAIが開発した大規模言語モデルChatGPTを欧米政府が規制」**

みたいな記事があればAI関連のトピックとも考えられますが、政治関連のトピックとも考えられます。

そのためこの文書には<mark>**AI関連のトピック**と**政治関連のトピック**が潜在的に存在</mark>していることになるのです。

![LDA](/wp-content/uploads/2023/08/39.jpg)

一方で別の記&#x4E8B;**「米国金利の上昇がFOMCにて決定付けられた」**&#x3067;は同じく政治トピックと金融トピックかもしれません。 ![LDA](/wp-content/uploads/2023/08/40.jpg)

トピックモデルが利用されるシーンとしては以下のようなものがあります！

:::box
**・文書分類とクラスタリング**: 類似のトピックを持つ文書をグループ化\
**・推奨システム**: トピックの類似性に基づいて、ユーザーに関連するコンテンツを推奨\
**・検索エンジンの改善**: 検索結果をトピックに基づいてランク付け
:::

## トピックモデルのLDAをPythonで実装

![stories pc](/wp-content/uploads/2021/01/All-the-data-bro-e1613475965440.png)

それではここから、そんなトピックモデルの1つのアプローチである**LDA**（潜在的ディリクレ配分法）をPythonで実装していきたいと思います。

トピックモデルのベースとなる文章を手に入れる必要があるので、[NEWS_API](https://newsapi.org/)を使ってニュースを取得します。

処理の流れは以下の通りです。

:::box
**1.NEWS_APIからニュース情報を取得**\
**2.ニュース情報からタイトルだけ抽出**\
**3.ニュースタイトルの文章からストップワードを削除して名詞だけに絞る**\
**4.単語出現回数をカウント**\
**5.LDAを適用させて結果を表示**
:::

あらかじめ必要なライブラリはpip installでインストールしておいてください。

ちなみにnewsapiのライブラリは

:::box
**pip install newsapi-python**
:::

でインストールする必要があるので注意してください。

それでは実際にコードを見てみましょう！まずはコード全体から！

```python
from newsapi import NewsApiClient
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.decomposition import LatentDirichletAllocation
import pandas as pd
import nltk
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
from nltk.tag import pos_tag

# NLTKのリソースをダウンロード
nltk.download('punkt')
nltk.download('averaged_perceptron_tagger')
nltk.download('stopwords')

# NEWS_APIのキーを設定
api_key = '<NEWS_APIのキー>'
newsapi = NewsApiClient(api_key=api_key)

# ニュース記事を取得
articles = newsapi.get_everything(q='latest', language='en', page_size=100)
titles = [article['title'] for article in articles['articles']]

# ストップワードの削除と名詞だけに絞る処理
stop_words = set(stopwords.words('english'))
filtered_titles = []
for title in titles:
    words = word_tokenize(title)
    words = [word for word in words if word.lower() not in stop_words]
    nouns = [word for word, pos in pos_tag(words) if pos in ['NN', 'NNS']]
    filtered_titles.append(" ".join(nouns))

# タイトルから単語の出現回数をカウント
vectorizer = CountVectorizer()
title_counts = vectorizer.fit_transform(filtered_titles)

# LDAモデルを適用
topic_num = 5
lda = LatentDirichletAllocation(n_components=topic_num, random_state=42)
lda.fit(title_counts)

# トピックごとの単語を表示
words = vectorizer.get_feature_names_out()
for topic_idx, topic in enumerate(lda.components_):
    print(f"Topic #{topic_idx}:")
    print(" ".join([words[i] for i in topic.argsort()[:-10 - 1:-1]]))

# 各記事のトピックをデータフレームに保存
doc_topic = lda.transform(title_counts)
df = pd.DataFrame(doc_topic, columns=[f'Topic {i}' for i in range(topic_num)])
df['Title'] = titles
print(df.head())
```

コードの中身を詳しく見ていきましょう！

まず、ライブラリをインポートし<mark>nltk（Natural Language Tool Kit）という自然言語処理ツールのリソースをダウンロード</mark>していきます。

```python
from newsapi import NewsApiClient
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.decomposition import LatentDirichletAllocation
import pandas as pd
import nltk
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
from nltk.tag import pos_tag

# NLTKのリソースをダウンロード
nltk.download('punkt')
nltk.download('averaged_perceptron_tagger')
nltk.download('stopwords')

```

続いてNEWS_APIのAPIキーを設定し<mark>ニュース記事を取得</mark>していきます。NEWS_APIのAPIキーは無料で取得できるので事前に取得しておきましょう！

```python
# NEWS_APIのキーを設定
api_key = '<NEWS_APIのキー>'
newsapi = NewsApiClient(api_key=api_key)

# ニュース記事を取得
articles = newsapi.get_everything(q='latest', language='en', page_size=100)
titles = [article['title'] for article in articles['articles']]
```

この時、パラメータを設定することで取得するニュースの種類を変更することが可能です。

続いて一般的に除外してもよいと考えられる”and”などの<mark>ストップワードを除外</mark>した上で名詞だけに絞り込みます。

そして<mark>特定の単語の出現回数をカウント</mark>しています。

```python
# ストップワードの削除と名詞だけに絞る処理
stop_words = set(stopwords.words('english'))
filtered_titles = []
for title in titles:
    words = word_tokenize(title)
    words = [word for word in words if word.lower() not in stop_words]
    nouns = [word for word, pos in pos_tag(words) if pos in ['NN', 'NNS']]
    filtered_titles.append(" ".join(nouns))

# タイトルから単語の出現回数をカウント
vectorizer = CountVectorizer()
title_counts = vectorizer.fit_transform(filtered_titles)
```

そしてその結果をもとに<mark>トピック分析をかけてトピックごとの単語を表示</mark>します。

```python
# LDAモデルを適用
topic_num = 5
lda = LatentDirichletAllocation(n_components=topic_num, random_state=42)
lda.fit(title_counts)

# トピックごとの単語を表示
words = vectorizer.get_feature_names_out()
for topic_idx, topic in enumerate(lda.components_):
    print(f"Topic #{topic_idx}:")
    print(" ".join([words[i] for i in topic.argsort()[:-10 - 1:-1]]))

# 各記事のトピックをデータフレームに保存
doc_topic = lda.transform(title_counts)
df = pd.DataFrame(doc_topic, columns=[f'Topic {i}' for i in range(topic_num)])
df['Title'] = titles
print(df.head())
```

結果は以下のようになりました！

![LDA](/wp-content/uploads/2023/08/LDA2.png) ![LDA](/wp-content/uploads/2023/08/LDA-1.jpg)

<mark>5つのトピックを表現する特徴的な単語が列挙されていて、それぞれのニュース記事がどのトピックに分類されそうか確率値が並んでますね！</mark>

今回は100記事で実装しましたので、若干違和感がありますがもっと記事数や文章ボリュームを増やすことで精度が向上していくと思われます。

また、今回は簡単のために英語で実装してみましたが、もし日本語でやる場合は**形態素解析**による分かち書きが必要になってきます。

その場合はMecabを使ってみましょう！

Mecabの使用方法やMecabを使った自然言語処理アプローチに関しては以下の記事でまとめています！

<https://toukei-lab.com/python-mecab>

## トピックモデル　まとめ

本記事ではトピックモデルについてまとめました！

トピックモデルではレコメンドに関わる話も多いので、こちらの[協調フィルタリングの記事](/collaborative-filtering)や[レコメンドのアルゴリズム](/recommend-algorithm)も見てみると良いでしょう！

<https://toukei-lab.com/collaborative-filtering>

<https://toukei-lab.com/recommend-algorithm>

このようなデータサイエンスの力を身に付けるためにはスタビジの記事やスクールを活用すると良いでしょう。

そして僕の経験を詰め込んだデータサイエンス特化のスクール[「スタアカ（スタビジアカデミー）」](https://toukei-lab.com/achademy/)を運営していますので，興味のある方はぜひチェックしてみてください！

### AIデータサイエンス特化スクール「スタアカ」

![スタアカ（スタビジアカデミー）のトップページ](/wp-content/uploads/2026/10/achademy-top.jpg)

<table class="table">
<tbody>
<tr>
<th>【価格】</th>
<td>ライトプラン：1,280円/月（全コースが受講し放題）<br>
プレミアムプラン：129,800円（通常149,800円・買い切り）</td>
</tr>
<tr>
<th>【オススメ度】</th>
<td><span class="stars" role="img" aria-label="5点中5点" data-value="5"></span></td>
</tr>
<tr>
<th>【サポート体制】</th>
<td><span class="stars" role="img" aria-label="5点中4点" data-value="4"></span></td>
</tr>
<tr>
<th>【受講形式】</th>
<td>オンライン形式</td>
</tr>
<tr>
<th>【学習範囲】</th>
<td>統計学・機械学習・ディープラーニングを網羅的に学ぶ<br>
生成AI（LLM・RAG・プロンプトエンジニアリング）を学ぶ<br>
SQLとPythonを組み合わせて実データを使った様々なワークを行う<br>
実践的なビジネスフレームワークを学ぶ<br>
マーケティングの実行プラン策定</td>
</tr>
</tbody>
</table>

データサイエンティストとしての自分の経験をふまえてエッセンスを詰め込んだのがこちらのスタビジアカデミー、略して「[スタアカ](https://toukei-lab.com/achademy/)」！！

当メディアが運営するスクールです。

月額1,280円のライトプランで、統計学から機械学習・生成AIまで全コースが受講し放題です！

<mark>プレミアムプランでは、24時間以内の質問対応と現役データサイエンティストとの1on1（30分×4回）を実施します！</mark>

カリキュラム自体は、他のスクールと比較して圧倒的に良い自信があるのでぜひ受講してみてください！

他のスクールのカリキュラムはPythonでの機械学習実装だけに焦点が当たっているものが多く、実務に即した内容になっていないものが多いです。

<mark>そんな課題感に対して、実務で使うことの多いSQLや機械学習のビジネス導入プロセスの理解なども合わせて学べるボリューム満点のコース</mark>になっています！

Pythonが初めての人でも学べるようなカリキュラムにしておりますので是非チェックしてみてください！

ウォルマートのデータを使って商品の予測分析をしたり、実務で使うことの多いGoogleプロダクトのBigQueryを使って投球分析をしたり、データサイエンティストに必要なビジネス・マーケティングの基礎を学んでマーケティングプランを作ってもらったりする盛りだくさんの内容になってます！

:::box
**・BigQuery上でSQL、Google Colab上でPythonを使い野球の投球分析**\
**・世界最大手小売企業のウォルマートの実データを用いた需要予測**\
**・ビジネス・マーケティングの基礎を学んで実際の企業を題材にしたマーケティングプランの策定**\
**・生成AIのAPIを使ってチャットボットやAIエージェントを作る**
:::

::button[スタアカの受講はこちら]{href="https://toukei-lab.com/achademy/" note="＼今すぐ試す／"}

データサイエンスに関する記事はこちら！

<https://toukei-lab.com/statistics-freshman>

<https://toukei-lab.com/datascience-book>

データサイエンスを勉強できるスクールやサイトは、ぜひこちらを参考にしてみてください！

<https://toukei-lab.com/datascientist-school>