※本記事にはPR(アフィリエイト広告)が含まれています。
こんにちは!「ブログ記事メンテナンス自動化講座」第3回へようこそ。
前回(第2回)では、既存記事のコンテンツを解析して「古くなった情報」や「更新が必要な箇所」を検出する仕組みについて解説しました。今回はその続編として、関連記事への内部リンクを自動で提案するロジックを実装していきます。
内部リンクはSEOにおいてもユーザー体験においても非常に重要な要素ですが、記事数が増えてくると「どの記事とどの記事をリンクすべきか」を人力で判断するのは大変な作業になります。この記事では、初心者の方でも理解できるように、基本的な考え方から実装の流れまでを順を追って解説します。
内部リンク自動提案とは何か?なぜ必要なのか
内部リンク自動提案とは、ブログ内の記事同士の関連性を分析し、「この記事にはこの記事へのリンクを貼ると良いですよ」という候補を自動的に算出する仕組みのことです。
内部リンクがもたらすメリット
- 読者が関連情報にアクセスしやすくなり、滞在時間が伸びる
- 検索エンジンがサイト構造を理解しやすくなり、SEO評価が向上しやすい
- 孤立した記事(どこからもリンクされていない記事)を減らせる
手動運用の限界
記事数が10本程度であれば手動でも管理できますが、100本、200本と増えてくると、関連性を正確に把握すること自体が困難になります。そこで「過去記事も含めて機械的に関連度を計算し、リンク候補をリストアップする」仕組みが必要になるのです。
関連記事を判定するロジックの設計
内部リンクの提案を自動化するには、まず「記事同士がどれくらい関連しているか」を数値化する必要があります。代表的な方法をいくつか紹介します。
方法1:キーワード・タグベースの判定
各記事に付与されているタグやカテゴリを比較し、一致数が多いほど関連度が高いと判定するシンプルな方法です。実装が容易で、記事投稿時にタグ付けの運用ルールさえ整っていれば、すぐに導入できます。
方法2:TF-IDFによる文章類似度の計算
記事本文を単語に分解し、各単語の出現頻度(TF)と希少性(IDF)を掛け合わせたベクトルを作成します。このベクトル同士の「コサイン類似度」を計算することで、本文の内容に基づいた関連度を算出できます。タグ付けに依存しないため、より精度の高い提案が可能です。
方法3:両者のハイブリッド
実務では、タグの一致度とTF-IDFによる類似度を組み合わせてスコアリングするハイブリッド方式がよく使われます。重み付けを調整することで、サイトの特性に合わせたチューニングが可能です。
実装してみよう:Pythonによるサンプルコード
ここでは、Pythonとscikit-learnを使って、シンプルな関連記事提案ロジックを実装する例を紹介します。
ステップ1:記事データの準備
まずは記事のタイトルと本文をリストとして用意します。実際の運用ではデータベースやCMSから取得する形になるでしょう。
articles = [
{"id": 1, "title": "SEO基礎講座", "content": "SEOの基本について解説します。タイトルタグや見出しの使い方が重要です。"},
{"id": 2, "title": "見出しタグの使い方", "content": "h1やh2タグの正しい使い方について詳しく説明します。"},
{"id": 3, "title": "画像の最適化方法", "content": "画像の圧縮やalt属性の設定方法について解説します。"},
]
ステップ2:TF-IDFベクトルの作成
scikit-learnのTfidfVectorizerを使って、各記事の本文をベクトル化します。
from sklearn.feature_extraction.text import TfidfVectorizer
contents = [a["content"] for a in articles]
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(contents)
ステップ3:コサイン類似度の計算
記事同士の類似度を計算し、行列として取得します。
from sklearn.metrics.pairwise import cosine_similarity
similarity_matrix = cosine_similarity(tfidf_matrix)
print(similarity_matrix)
ステップ4:関連記事候補の抽出
特定の記事に対して、類似度が高い順に関連記事を抽出するロジックを実装します。
def get_related_articles(article_id, top_n=3):
idx = next(i for i, a in enumerate(articles) if a["id"] == article_id)
scores = list(enumerate(similarity_matrix[idx]))
# 自分自身を除外してスコア順にソート
scores = [s for s in scores if s[0] != idx]
scores.sort(key=lambda x: x[1], reverse=True)
return [articles[i]["title"] for i, score in scores[:top_n]]
print(get_related_articles(1))
このようにして、指定した記事に対する関連記事候補をスコア順に取得できます。あとはこの結果を記事の末尾に自動挿入したり、編集者向けの管理画面に提案一覧として表示したりすることで、実際の運用に活用できます。
運用時の注意点と改善のポイント
スコアの閾値設定を忘れずに
類似度が低い記事同士まで無理にリンクしてしまうと、かえってユーザー体験を損ないます。一定のスコア(例えば0.2以上など)を下回る場合はリンク候補から除外する仕組みを入れましょう。
定期的な再計算が必要
新しい記事が追加されるたびに、関連度は変化します。バッチ処理などで定期的にTF-IDFの再計算と類似度マトリクスの更新を行う運用フローを組んでおくことが大切です。
人の目によるチェックも併用する
自動提案はあくまで「候補」です。特に重要な記事については、提案結果を編集者が最終確認したうえでリンクを設置する運用にすると、品質を担保しやすくなります。
まとめ
今回は「関連記事への内部リンクを自動提案するロジック」をテーマに、タグベース・TF-IDFベースの関連度判定の考え方から、Pythonを使った実装の流れまでを解説しました。
ポイントをおさらいすると以下の通りです。
- 内部リンクはSEOとユーザー体験の両面で重要
- 関連度の判定にはタグ比較とTF-IDF類似度の2つのアプローチがある
- scikit-learnを使えば比較的簡単に類似度計算を実装できる
- 閾値設定や定期的な再計算、人によるチェックも運用上欠かせない
次回・第4回では、今回作成した関連記事提案ロジックを実際のCMSやブログシステムに組み込み、記事更新時に自動でリンクを挿入する仕組みについて解説していく予定です。お楽しみに!
Photo by Shahadat Rahman on Unsplash

