解決する課題
ファクトチェッカーはテキスト系のプラットフォームなら検索できますが、動画はほぼブラックボックスです。主張は少しずつ表現を変えながら何十ものチャンネルで繰り返され、その拡散を記録するには何時間もの映像を見る必要があります。研究者には、検索可能な文字起こし、言い換えを捉えるセマンティックマッチング、そして各出現の検証可能な記録が必要です。
最初のバージョンに含めるべき機能
- 定義したチャンネル群のモニタリング
- 完全一致だけでなく、主張の言い換えも捉えるセマンティック検索
- 最初の出現と拡散を示すタイムライン
- 検証用のタイムスタンプ付きリンクを含む発言
- レポートや記事用にエクスポートできる証拠
開発手順(ステップごとに解説)
- 01
文字起こしを収集する
対象チャンネルを解決し、期間内の動画を一括処理します。研究が継続中なら新しいアップロードの監視も続けます。
- 02
セグメントを埋め込む
文字起こしの各段落の埋め込みを作成し、意味の似た発言を見つけられるようにします。
- 03
主張を検索する
主張を複数の表現で埋め込み、類似する箇所を検索して、実際にその主張をしているものをレビュアーまたはLLMが確認します。
- 04
タイムラインを作る
確認済みの一致を公開日順に並べ、チャンネル、発言、タイムスタンプ付きリンクとともにエクスポートします。
サンプルコード
このアイデアは「レシピ2:チャンネルを監視して新着動画を通知」パターンをベースにしています。チャンネル、プロンプト、保存先はご自身のものに置き換えてください。
import requests
API = "https://www.youtubetranscript.dev/api/v2"
HEADERS = {"Authorization": "Bearer yt_sk_live_YOUR_KEY"}
WATCHLIST = ["@somechannel", "@anotherchannel"]
KEYWORDS = ["your brand", "competitor"]
seen = set() # persist this in a database in production
for handle in WATCHLIST:
latest = requests.post(f"{API}/channels/resolve", headers=HEADERS,
json={"handle": handle, "limit": 10}).json()
for video in latest["items"]:
if video["video_id"] in seen:
continue
seen.add(video["video_id"])
t = requests.post(f"{API}/transcribe", headers=HEADERS,
json={"video": video["video_id"]}).json()
text = t.get("data", {}).get("transcript", {}).get("text", "").lower()
hits = [k for k in KEYWORDS if k in text]
if hits:
print(f"ALERT {video['title']}: {hits}")作る価値がある理由
ファクトチェック団体や研究グループは、スピードと検証可能な証拠を得られます。トラスト&セーフティチームやメディアモニタリング企業は、動画をカバーするツールに対価を払います。
避けるべき失敗
- 自動マッチングの結果を結論として扱うこと:公開前に必ず人が確認しましょう。
- 完全一致のフレーズだけを検索すること:主張は形を変えるため、複数の表現でセマンティック検索を使いましょう。
- 出所情報を失うこと:すべての発言について動画ID、タイムスタンプ、取得日を保存しましょう。
このアイデアに関する質問
ファクトチェッカーはどうやってYouTube動画を検索していますか?
動画を文字起こしし、そのテキストを検索します。セマンティック検索なら、キーワード検索では見逃す言い換えも見つけられます。
ある主張がYouTubeで最初にされた時期を証明できますか?
監視しているチャンネルの範囲内で、最も早い出現を公開日とタイムスタンプ付きで記録できます。その全体像がどこまで完全かは、カバー範囲によって決まります。
字幕のない動画はどうなりますか?
AI音声認識を有効にすれば、字幕のない動画も文字起こしされ、検索可能になります。