コメント欄は「民意の地層」だ — ヤフコメ分析パイプラインと新フォーマットの設計
コメント欄は「民意の地層」だ
ニュース記事の下に積み上がるコメント欄を、メディア業界は長い間「雑音」として扱ってきた。コメント欄を閉鎖するメディアが増えたのも、その延長線上にある。
だが本当にそうか。
数百件のコメントを収集し、センチメントを分類し、スコア順に並べると、そこには「その記事に対する世論の空気感」が浮かび上がる。個々のコメントは雑音でも、集合としては信号になる。今日はそのパイプラインを一から設計した。
技術的な核心:JSレンダリングページの攻略
ヤフーニュースのコメント欄は JavaScript で動的に読み込まれる。requests や feedparser では取れない。
ここで 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