コメント欄は「民意の地層」だ — ヤフコメ分析パイプラインと新フォーマットの設計

コメント欄は「民意の地層」だ

ニュース記事の下に積み上がるコメント欄を、メディア業界は長い間「雑音」として扱ってきた。コメント欄を閉鎖するメディアが増えたのも、その延長線上にある。

だが本当にそうか。

数百件のコメントを収集し、センチメントを分類し、スコア順に並べると、そこには「その記事に対する世論の空気感」が浮かび上がる。個々のコメントは雑音でも、集合としては信号になる。今日はそのパイプラインを一から設計した。


技術的な核心:JSレンダリングページの攻略

ヤフーニュースのコメント欄は JavaScript で動的に読み込まれる。requestsfeedparser では取れない。

ここで Playwright(ヘッドレスChromium)を使う。ページを実際にブラウザで開き、スクロールしてコメントをロードさせ、body のテキストを行単位でパースする。

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    page = browser.new_page(user_agent="...")
    page.goto(comments_url, wait_until="networkidle")
    for _ in range(20):
        page.evaluate("window.scrollBy(0, 600)")
        page.wait_for_timeout(400)
    body_text = page.inner_text("body")

CSSセレクタを使わないのがポイントだ。ヤフコメのDOM構造は変わりやすい。代わりに「参考になった」「返信」という固定文字列をアンカーとして、その前後のテキストを拾う。セレクタが壊れても、自然言語のパターンは壊れない。


センチメント分析:4分類のキーワードベース

LLMに投げれば精度は出るが、コストと速度の問題がある。今回はキーワードベースの4分類で十分と判断した。

ラベル特徴
肯定的「支持」「信頼」「期待」等
否定的「不満」「批判」「危険」等
皮肉・懐疑「どうせ」「茶番」「w」「草」等
中立上記に該当しない情報共有型

皮肉・懐疑を独立カテゴリにしたのは意図的だ。日本のネット言論において「笑い」「草」「どうせ」は否定とも肯定とも異なる第三の感情層を形成している。それを「否定的」に混ぜると、空気感が読めなくなる。


コンテンツとしての逆転

ここが今日の設計で一番面白いところだ。

通常、記事は「事実を伝える」ために存在する。コメントはその副産物だ。

だが今回作ったフォーマットでは、コメントのセンチメント分析結果そのものが記事の価値になる。ニュースの概要は3段落で済む。残りは「この記事に対して世の中がどう反応したか」の構造化された可視化だ。

センチメント分布(中立73% / 肯定18% / 皮肉9%)
→ 専門家コメント TOP スコア
→ 一般コメント 注目5件
→ 編集部の一言まとめ

「ニュースを伝える」から「ニュースへの反応を伝える」への転換。これは既存メディアが手を出せない領域だ。


サイト間の「距離設計」

今日もう一つやったのが、メディアネットワーク内のサイト間距離の明示的な設計だ。

NT Media グループは複数のサイトを運営しているが、すべてを繋げればいいわけではない。深掘り報道サイトとまとめ系サイトは、読者層も編集方針も違う。繋げることで両方の信頼性が希釈される可能性がある。

今回、新しいサイトのフィードを既存のネットワークラックから完全に除外した。ソース側(networkFeedSources.json)から削ることで、フィルターという「痕跡」すら残さない設計にした。

分離は冷たさではなく、それぞれが自分の文脈で育つための余白だ。


Amazon レコメンダーの設計

記事と関連する書籍を末尾に添える仕組みも整備した。scripts/amazon_recommender.py

ASIN直接指定モードと、キーワードからGoogle経由でASINを探すモードの2系統。Amazon直接スクレイピングはbot検知で詰まるため、商品ページ(/dp/{ASIN}/)への直接アクセスで情報を取る設計にした。

重要なのはスクリプトの最後の処理だ。

if "Amazonアソシエイトリンクを含みます" in current_content:
    print("[skip] すでにアソシエイトブロックが存在します")
    return False

冪等性。何度走らせても同じ結果になる設計は、自動化の基本だ。


今日の教訓

「雑音か信号かは、集め方で決まる。」

コメント欄を個別に読むと雑音だ。1000件を集めて構造化すると信号になる。メディアの仕事は情報を生産することだけでなく、散らばった情報を構造化することでもある。

パイプラインができた。あとは量を積むだけだ。


ZashStudio 技術監修 2026-04-08