0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【第23回】今何が話題なのか?巨大辞書に頼らない超軽量キーワード抽出と「勢い連動型」トレンドタグクラウドの実装

0
Posted at

「Twitter(現X)のトレンドのように、今この瞬間ネットで語られている『単語』を一目で可視化したい」
令和に自作した2ちゃんねる風掲示板「つゔぁいちゃんねる(2ch.biz)」開発秘話の第23弾。今回は、サーバーリソースを食い潰す巨大な形態素解析辞書(MeCab等)を使わずに、正規表現と2ch特有の構文解析でバズワードを抽出し、スレッドの「勢い」と掛け合わせてスコアリングするトレンドタグクラウドの仕組みを解説します。


💡 はじめに:スレッド一覧だけでは「今何が話題か」が分からない

第21回で「勢いランキングTOP 10」を、第22回で「カテゴリ別新着ヘッドライン」を実装しました。
スレッドの一覧性は格段に向上しましたが、運営を続ける中で新たな欲求が生まれました。

「今、ネットで一番アツい『固有名詞』は何なんだ?」

スレッドタイトルは長い文章(例: 【速報】新型GPUの性能が凄すぎると話題に)になっていることが多く、タイトルを何個も目で追わなければ、本質的な話題が「GPU」なのか「ゲーム」なのか「セール」なのかが直感的に伝わりません。

Twitter(現X)の「トレンド欄」のように、 「今まさに人々が口にしている単語(キーワード)」 がポンポンとタグクラウドとして並んでいれば、利用者は一瞬で世の中の空気を察知し、ワンタップでその話題に飛び込むことができます。

開発初期(2026年8月21日深夜)、この要求を満たすため 「トレンドキーワード・タグクラウド機能」 を開発しました。


🛠️ なぜMeCabや重たい形態素解析エンジンを避けたのか?

自然言語からキーワードを抽出すると聞いて、真っ先に思い浮かぶのは「MeCab」や「Kuromoji」などの形態素解析エンジンです。

しかし、個人開発の軽量サーバー(PHP / Node.js)において、数百メガバイトの辞書ファイル(IPADICやUniDic)をメモリに展開し、リクエストのたびに形態素解析を走らせるのは リソース面で致命的な足枷 になります。VPSのメモリを圧迫し、レスポンス速度を低下させてしまうからです。

「巨大な辞書を使わず、CPU負荷ほぼゼロで、日本語のトレンドワードを高精度に抜き出す方法はないのか?」

そこで、2ちゃんねるのスレッドタイトルが持つ 「独特の構文ルール(タイトルの付け方の癖)」 に着目した、超軽量の正規表現抽出パイプラインを考案しました。


📐 4大パターン抽出アルゴリズムの設計

2ちゃんねるのスレタイを数百件分析すると、重要な固有名詞は必ず以下の 「4つのパターン」 のいずれかに現れることが判明しました。

graph TD
    A[スレッドタイトルのテキスト] --> B[抽出パターン1: 括弧・タグ記号 【】『』「」 #]
    A --> C[抽出パターン2: カタカナ語 2〜10文字]
    A --> D[抽出パターン3: 漢字熟語 2〜6文字]
    A --> E[抽出パターン4: 英数字略称・大文字語 3〜12文字]
    
    B --> F[ノイズ単語フィルター (ストップワード除外)]
    C --> F
    D --> F
    E --> F
    
    F --> G[スレッドの「勢い (IKIOI)」と出現頻度を掛け算してスコアリング]
    G --> H[TOP 20 キーワードをタグクラウドとして選出]

1. 括弧・タグ記号(最も重要度が高い)

2chのスレタイでは、最重要の固有名詞や速報タグは必ず括弧で囲まれます。

  • 【〇〇】, 『〇〇』, 「〇〇」, #〇〇
  • 例: 【大谷翔平】, 『ゼルダの伝説』, 【速報】

2. カタカナ語(2〜10文字)

IT用語、外来語、ゲーム名、製品名はほぼカタカナです。

  • 正規表現: /[ァ-ヴー]{2,10}/u
  • 例: スマホ, グラボ, ビットコイン, アニメ

3. 漢字熟語(2〜6文字)

社会ニュース、政治、経済、イベント名は漢字熟語になります。

  • 正規表現: /[一-龠]{2,6}/u
  • 例: 衆院解散, 円安, 新幹線, 内閣支持率

4. 英数字略称・大文字語(3〜12文字)

型番、企業名、Webサービス名は半角英数です。

  • 正規表現: /[A-Za-z0-9_\-]{3,12}/
  • 例: ChatGPT, NVIDIA, Steam, PS5, iPhone

🚫 ノイズを徹底排除する「ストップワード辞書」

正規表現で抽出しただけでは、「スレッド」「について」「質問」「速報」「総合」といった、 掲示板で頻出するが無意味な一般語 がランキング上位を独占してしまいます。

これを防ぐため、厳選した ストップワードブラックリスト を定義しました。

// 除外するストップワード(api.php)
$stopWords = [
    'スレッド', 'スレ', 'について', '質問', '総合', 'その', 'これ', 
    'なん', 'どう', '速報', '実況', '雑談', '議論', 'まとめ', 
    'ニュース', '本日の', 'Part', 'part', 'thread', 'Thread'
];

🔥 「出現頻度 × 勢い(IKIOI)」による複合スコアリング

ここが本システムの最もユニークな技術ポイントです。
単に「タイトルの出現回数」だけでカウントすると、過疎板で同じ単語を含んだスレが2つ3つ立っているだけでトレンド入りしてしまいます。

そこで、第21回で開発した 「スレッドの勢い(IKIOI)」を重みとして掛け算 します。

$$\text{キーワードのスコア} = \sum (\text{その単語を含むスレッドの勢い} \times \text{出現重み})$$

  • 勢い 10,000 のお祭りスレッドに含まれる単語 【大谷翔平】 → スコア: 10,000
  • 勢い 5 の過疎スレッド3つに含まれる単語 料理 → スコア: 15

この数式により、 「今まさに人々が猛スピードで議論しているスレッドの単語」が圧倒的な力でランキング上位を制覇 します。


🎨 TOPページを飾る「🏷️ 注目のトレンド:」タグクラウドUI

抽出された上位20件のキーワードは、トップページの最上部(ウェルカムバナー直下)に、洗練されたタグチップとして掲出されます。

<!-- index.html のタグクラウド領域 -->
<div class="trend-tags-container">
    <span class="trend-label">🏷️ 注目のトレンド:</span>
    <div id="trend-tags-list" class="trend-tags-list">
        <!-- app.js が動的にタグを生成 -->
    </div>
</div>
/* style.css */
.trend-tags-list {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
    align-items: center;
}

.trend-tag-chip {
    font-size: 12px;
    padding: 3px 8px;
    border-radius: 12px;
    background-color: var(--bg-card);
    border: 1px solid var(--border-color);
    color: var(--text-color);
    text-decoration: none;
    transition: all 0.2s ease;
    display: inline-flex;
    align-items: center;
}

/* 1位〜3位: 🔥 赤橙系HOTグラデーション */
.trend-rank-hot {
    background: linear-gradient(135deg, rgba(255, 69, 0, 0.15), rgba(255, 140, 0, 0.15));
    border-color: #ff4500;
    color: #ff4500;
    font-weight: bold;
}

/* 4位〜8位: ⚡ 青紫系人気グラデーション */
.trend-rank-popular {
    background: linear-gradient(135deg, rgba(138, 43, 226, 0.15), rgba(30, 144, 255, 0.15));
    border-color: #8a2be2;
    color: #8a2be2;
}

.trend-tag-chip:hover {
    transform: translateY(-1px);
    box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);
}

🚀 ワンクリックでスレッド検索へ直結する回遊導線

このタグチップは、単なる飾りではありません。
タグをクリックした瞬間、第9回で構築したVanilla JSルーターが起動し、 そのキーワードを含んだ全体スレッド検索(https://2ch.biz/?q=大谷翔平)が一瞬で実行 されます。

ユーザーは「お、今大谷翔平がトレンド1位か!」と気づいたら、タグを1タップするだけで、関連スレッド一覧をまとめて閲覧できます。
パンくずリスト(トップ > 検索結果: 大谷翔平)も自動生成されるため、いつでも迷わずトップへ戻れます。


🎯 まとめと次回予告

第23回となる今回は、巨大辞書を使わずにトレンドを炙り出す 「軽量キーワード抽出と勢い連動型タグクラウド」 について解説しました。

今回の学び・ポイント

  • 辞書がなくてもキーワードは抜ける :括弧記号やカタカナ・漢字のパターンを突くことで、CPU負荷ゼロの抽出を実現。
  • 「勢い」との掛け算が生むリアルタイム性 :出現回数だけでなく、スレッドの熱量を重み付けすることでノイズを完全排除。
  • タグから検索へのシームレスな体験 :気になる単語をタップした瞬間に該当スレが並ぶ、ストレスフリーな回遊導線。

アルゴリズムによる自動化(勢い・新着・トレンド)は完璧に揃いました。
しかし、自動化だけでは拾い切れない 「管理者がどうしてもみんなに読んでほしい名作スレッド」 や 「今週のイチオシ企画」 も存在します。

次回、 【第24回】管理者のキュレーション力!トップページに固定表示する「今日のおすすめピックアップ」 へと続きます!


🔗 関連リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?