

# 検索結果からYouTubeの字幕コーパスを作る

YouTubeの字幕コーパスを作るには、研究のルールを定め、検索クエリで重複のない動画IDを見つけ、選定したすべての動画を字幕の取得結果または失敗の記録と照合する必要があります。Actorは、ホスティング環境で動作するデータ収集プログラムです。Taskは、保存された入力設定です。コーパスは、最終的にまとめたソースの集合です。動画の探索と字幕の抽出は別の手順です。検索結果は字幕そのものではありません。また、字幕が取得できなくても、その動画が扱う主題まで存在しないことにはなりません。

## 収集の設定

[YouTube Search Actor](https://apify.com/chronometrica/youtube-search-scraper)で動画を探し、[YouTube Transcript Actor](https://apify.com/chronometrica/youtube-transcript-scraper)で字幕を取得します。公開Taskの[YouTube Video URLs for Transcript Workflows](https://apify.com/chronometrica/youtube-search-scraper/examples/youtube-video-urls-for-transcripts)には、汎用的な検索クエリ2件と、`maxResults: 100`、`resultsPerQuery: 50`、`maxPagesPerQuery: 1`、`searchDistribution: "balanced"`、`includeShorts: true`、`enableQueryExpansion: false`、`enrichWithVideoMetrics: false`、`enrichMissingChannelFields: true`、`maxChannelEnrichmentRequests: 100`を含む初期設定が保存されています。

予備確認では、入力を研究に関連する検索クエリ1件、`maxResults: 2`、`resultsPerQuery: 2`、`maxPagesPerQuery: 1`に変更し、任意のチャンネル情報補完（`enrichMissingChannelFields: false`）、クエリ拡張、指標の取得を無効にします。`maxResults`は実行全体で共有する上限で、`resultsPerQuery`は個々の検索の上限です。

検索の出力には、`rootQuery`、`query`、`querySource`、`postId`、`postUrl`、`postType`、`isShort`、`title`、`description`、`channelId`、`channelUrl`、`publishedAt`、`status`、`statusReason`、`observedAt`というフィールドが返されます。公開日が不明な場合は、不明のままにします。検索結果の掲載位置から日付を推測して作ってはいけません。候補を2件に限定して確認した対照用の実行は、`max_items_reached`に達したために停止します。トピック全体を網羅したためではありません。

字幕を収集するには、動画の直接URLをTranscript Actorの`startUrls`に渡します。`preferredLanguages`の方針を設定し、`outputFormats=["json"]`を選び、失敗の詳細が必要な場合は`includeFailedInputDetails=true`を設定します。出力には、`videoId`、`videoUrl`、`transcriptLanguageCode`、`isAutoGenerated`、`segments`、`status`、`scrapedAt`というキーと、OUTPUTの入力失敗情報が返されます。検出したURLをそのまま1件Transcript Actorに渡したところ、`videoId`と、英語の手動作成字幕の識別情報、言語、タイミングが一致しました。これは動画1本に範囲を限定した一連の処理の確認であり、そのトピック全体で字幕をどの程度取得できるかを測ったものではありません。字幕取得が扱うのは、公開されている字幕トラックを利用できるかどうかだけです。音声を生成したり、利用できない字幕トラックを翻訳したりはしません。動画1本の取得に成功すると、データセットに1行が作成されます。ただし、選定したすべての入力について、台帳に結果を記録する必要があります。

## 8つの手順

1. 研究のルールを定める：検索する前に、研究課題、言語の方針、日付と研究との関連性に関する方針、採用・除外のルールを書き出します。研究に役立つ動画には何の説明が必要かを明確にします。関連性の判断を再生回数で代用してはいけません。
2. 少数の関連クエリを実行する：研究課題の異なる部分を扱う、少数の関連クエリを作成します。最初はクエリ1件と候補2件から始めます。入力、観測時刻、上限、出力を保存します。クエリ拡張は、その必要性と動作を確認するまで無効にしておきます。
3. 実際のソースを選定する：選定する前に、タイトル、説明、閲覧できる動画本体を確認します。各動画を選定済み、除外、保留のいずれかに分類し、その理由も記録します。タイトルだけでは、その動画が研究課題を実際に扱っているとは証明できません。公開日が取得できない場合は、不明のままにします。検索順位だけを理由に新しい動画と判断してはいけません。
4. 動画の識別情報を統一する：動画の正確な識別情報に基づいてデータを整理し、検索クエリとソースの証拠を保持します。同じ動画が検索結果に繰り返し現れても、別々の動画として数えてはいけません。異なる編集版やアップロードは、根拠のある研究上のルールでまとめる場合を除き、別々のソースIDとして扱います。
5. 字幕を少数ずつまとめて収集する：選定した動画の直接URLを少数ずつTranscript Actorに渡します。選んだ言語の方針を維持し、出力の失敗情報を確認します。字幕取得が扱うのは、公開されている字幕トラックを利用できるかどうかです。音声を生成したり、利用できない字幕トラックを翻訳したりはしません。
6. 字幕取得台帳を作る：選定したすべての動画を台帳に記録します。選定したID、検出元、状態、字幕取得結果の識別情報、言語、字幕の時刻、失敗の分類、または保留理由を記録します。出力を使い、選定したIDを成功、失敗、未試行、未解決のいずれかと照合します。成功したデータセットの行数だけでは、行が作成されなかった入力を把握できません。
7. 品質と網羅範囲を確認する：研究に照らして字幕トラックとソースの品質を確認します。字幕とともに、自動生成か手動作成かの区別と言語を保持します。利用できない動画や照合できない動画を、研究課題を変えずに除外できるか判断します。説明なく動画を除くのではなく、その選定上の制約を報告します。
8. 最終成果物を提出する：動画選定表、字幕取得台帳、採用したソース集合の定義を提出します。その後で初めて、後続の分析手法を適用します。この範囲を限定した集合だけから、母集団を代表していること、トピックへの需要、チャンネル全体の網羅性を主張することはできません。

## 架空のコーパスを使った具体例

この例のID、テキスト、ソース、状態はすべて架空です。2組の検索クエリから、候補が延べ8件見つかり、重複を除くと動画IDは6件になります。クエリ1ではV1、V2、V3、V4が見つかります。クエリ2ではV2、V4、V5、V6が見つかります。この延べ8件を照合し、重複のない6件のIDに整理します。V2とV4については、両方の検索クエリで見つかったことを読者向けの注記として残します。

採用の検討では、研究課題を明確に扱っているV1、V2、V4、V5を選定します。V3は広告だけなので除外します。V6は内容と日付の背景が未確認なので、保留にします。選定した4本の動画を字幕収集に進めます。

字幕取得の結果、V1は英語の手動作成字幕トラックの取得に成功し、V2は英語の自動生成字幕トラックの取得に成功します。V4は対象言語が利用できないという種別の失敗になり、V5はソースへのアクセス失敗になります。字幕データセットには成功した2行が含まれますが、台帳は選定した4件すべてのIDを網羅します。選定した4本のうち、2本が成功し、2本が失敗しました。V6は選定を保留しており、選定も取得の試行もしていないため、字幕取得に失敗した入力には数えません。

最終的なソースコーパスにはV1とV2が含まれ、手動作成と自動生成の違いも保持します。このコーパスが答えられるのは、これらの動画に根拠がある部分だけです。V4とV5だけが扱っていた課題は未回答のままにするか、条件を満たす別のソースを探す必要があります。この結果を、単語の正確さ、その分野の全動画に対する字幕の網羅率、公開字幕の利用可能率として扱ってはいけません。これは、この架空の例で選定した入力のうち、取得に成功した件数にすぎません。

最初の表には、重複を除いた6本の動画の選定記録を示します。

| 動画ID | 検出元 | 採用状況 | 理由・注記 |
| --- | --- | --- | --- |
| V1 | クエリ1 | 選定済み | 中心となるトピックを明確に説明している |
| V2 | クエリ1、クエリ2 | 選定済み | 研究課題の2番目の部分を扱っている（どのクエリで見つかったかは読者向けの注記） |
| V3 | クエリ1 | 除外 | 広告だけである |
| V4 | クエリ1、クエリ2 | 選定済み | トピックの3番目の部分を扱っている |
| V5 | クエリ2 | 選定済み | トピックの4番目の部分を扱っている |
| V6 | クエリ2 | 保留 | 内容と日付の背景が未確認 |

2番目の表には、字幕取得を試みた4件の台帳記録を示します。

| 選定したID | 検出元 | 字幕取得状況 | 言語 | 失敗の分類または理由 |
| --- | --- | --- | --- | --- |
| V1 | クエリ1 | 成功 | 英語 | 手動作成の字幕トラックを取得 |
| V2 | クエリ1、クエリ2 | 成功 | 英語 | 自動生成の字幕トラックを取得 |
| V4 | クエリ1、クエリ2 | 失敗 | なし | 失敗種別：対象言語が利用不可 |
| V5 | クエリ2 | 失敗 | なし | ソースへのアクセス失敗 |

3番目の表には、採用した2件の字幕ソースを示します。

| 採用したID | 字幕取得状況 | 言語 | 利用範囲 |
| --- | --- | --- | --- |
| V1 | 成功 | 英語（手動作成） | トピックの中心となる部分に答える |
| V2 | 成功 | 英語（自動生成） | トピックの2番目の部分に答える |

## 次にすること

[YouTube Search Actor](https://apify.com/chronometrica/youtube-search-scraper)を開き、最初の検索を試します。続いて、保存済みの[YouTube Video URLs for Transcript Workflows Task](https://apify.com/chronometrica/youtube-search-scraper/examples/youtube-video-urls-for-transcripts)を確認し、選定した各動画を[インデックスに登録する前に](/ja/articles/youtube%E5%AD%97%E5%B9%95-rag%E7%94%A8%E3%83%81%E3%83%A3%E3%83%B3%E3%82%AF-%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%97/)、Transcript Actorで字幕取得結果と照合します。

## 出典と参考資料

- [YouTube Search Actor](https://apify.com/chronometrica/youtube-search-scraper)
- [YouTube Transcript Actor](https://apify.com/chronometrica/youtube-transcript-scraper)
- [字幕取得ガイド](https://chronometrica.com/ja/articles/youtube-%E6%96%87%E5%AD%97%E8%B5%B7%E3%81%93%E3%81%97%E3%81%AE%E5%8F%96%E5%BE%97-%E5%AD%97%E5%B9%95%E3%81%AE%E7%A2%BA%E8%AA%8D/)
- [RedditのRAGに関する議論](https://www.reddit.com/r/Rag/comments/1rm7cxi/experiment_turning_youtube_channels_into_ragready/)