|
| 1 | +# ETLの柔軟性向上 |
| 2 | + |
| 3 | +## 現状の整理 |
| 4 | + |
| 5 | +### ETLで取れるもの |
| 6 | + |
| 7 | +- Community Noteそのもののデータをそのまま一時保存(SQLiteをつかっているが、Postgresqlにいれる方針) |
| 8 | +- Community Noteに紐づくPostのデータをX APIをつかって保存(Postgresqlに保存) |
| 9 | +- Community Noteのデータを素材に、LLMで言語の推論 |
| 10 | +- Community Noteのデータを素材に、LLMでトピックの推論 |
| 11 | +- BirdXplorer API が必要とするデータモデルに変換する |
| 12 | + |
| 13 | +### ETLの手順 |
| 14 | + |
| 15 | +現在実装されているETLの手順は以下の通りです: |
| 16 | + |
| 17 | +#### 1. Community Notesデータの取得 |
| 18 | +- Twitter公式のBirdwatch公開データから日次でCommunity Notesデータを取得 |
| 19 | +- データソース: `https://ton.twimg.com/birdwatch-public-data/{日付}/notes/notes-00000.tsv` |
| 20 | +- 設定可能な日数分遡ってデータを取得([`COMMUNITY_NOTE_DAYS_AGO`](etl/src/birdxplorer_etl/settings.py:18)で制御) |
| 21 | +- 重複チェックを行い、新しいノートのみをSQLiteに保存 |
| 22 | +- 同時にNote Status Historyデータも取得・保存 |
| 23 | + |
| 24 | +#### 2. 関連Postデータの取得 |
| 25 | +- Community Noteに紐づくTwitter投稿をX APIで取得 |
| 26 | +- 対象期間は設定で制御([`TARGET_TWITTER_POST_START_UNIX_MILLISECOND`](etl/src/birdxplorer_etl/settings.py:12-15)) |
| 27 | +- 投稿データ、ユーザーデータ、メディアデータ、埋め込みURLデータをPostgreSQLに保存 |
| 28 | +- 重複チェックにより既存データの再取得を回避 |
| 29 | + |
| 30 | +#### 3. データ変換とCSV生成 |
| 31 | +- **Note変換**: SQLiteからNoteデータを取得し、AIサービスで言語検出を実行してCSV出力 |
| 32 | +- **Post変換**: PostgreSQLからPostデータを取得してCSV形式に変換 |
| 33 | +- **User変換**: PostgreSQLからUserデータを取得してCSV形式に変換 |
| 34 | +- **Media変換**: メディアデータとPost-Media関連付けデータをCSV出力 |
| 35 | +- **Link変換**: 埋め込みURLデータとPost-Link関連付けデータをCSV出力 |
| 36 | + |
| 37 | +#### 4. AIによる高度な変換 |
| 38 | +- **言語検出**: [`ai_service.detect_language()`](etl/src/birdxplorer_etl/transform.py:75)でNoteの言語を推論 |
| 39 | +- **トピック推論**: [`ai_service.detect_topic()`](etl/src/birdxplorer_etl/transform.py:310)でNoteのトピックを分類 |
| 40 | +- トピックマスターデータは[`topic_seed.csv`](etl/seed/topic_seed.csv)から生成 |
| 41 | + |
| 42 | +**出力CSVファイル:** |
| 43 | +- `note.csv` - ノートデータ(言語情報付き) |
| 44 | +- `post.csv` - 投稿データ |
| 45 | +- `user.csv` - ユーザーデータ |
| 46 | +- `media.csv` - メディアデータ |
| 47 | +- `post_media_association.csv` - 投稿-メディア関連付け |
| 48 | +- `post_link.csv` - リンクデータ |
| 49 | +- `post_link_association.csv` - 投稿-リンク関連付け |
| 50 | +- `topic.csv` - トピックマスターデータ |
| 51 | +- `note_topic_association.csv` - ノート-トピック関連付け |
| 52 | + |
| 53 | +#### 4. Load(読み込み)フェーズ ([`load.py`](etl/src/birdxplorer_etl/load.py:9)) |
| 54 | + |
| 55 | +**S3への出力:** |
| 56 | +- 変換されたCSVファイルをAWS S3バケットにアップロード |
| 57 | +- タイムスタンプ付きのプレフィックスで整理 |
| 58 | +- アップロード対象は全9種類のCSVファイル |
| 59 | + |
| 60 | +## 新しくいれるべきもの |
| 61 | + |
| 62 | +### Post取得の効率化 |
| 63 | + |
| 64 | +XのPostデータを取得することはコストがかかるので必要なものを優先的に取得するなどが望まれる。例えば、CommunityNoteのデータをもとにAIや条件で先に前処理をしてメタデータをつけて、特定のCommunityNoteのみを対象にしてPostデータを取るなど。 |
| 65 | + |
| 66 | +#### 可能性のあるパターン |
| 67 | + |
| 68 | +- CommunityNoteのデータから言語を先に推定し、日本語のみを対象にしてPostデータを取得 |
| 69 | +- CommunityNoteのデータからキーワードでフィルタし、該当するものを対象にしてPostデータを取得 |
| 70 | + - 派生パターンとしてはCommunityNoteの条件(HELPFULのみや、日時期間の指定など)によってフィルタし、該当するものを対象にする |
| 71 | +- CommunityNoteのデータから特定のトピックに関連するかをAIで推論し、該当するものを対象にしてPostデータを取得 |
| 72 | +- 以上のパターンを組み合わせてできるようにすることも重要 |
| 73 | + |
| 74 | +### Community Noteが紐づいている以外の条件でもPostを取得する |
| 75 | + |
| 76 | +CommunityNoteがついているかかかわらず、特定の条件を満たすPostデータを取得できるようにする。 |
| 77 | +- ProプランのサーチAPIでの条件検索 |
| 78 | +- 外部からのデータインポート(協力チームからの提供データをインポートすることを想定。データモデルはBirdXplorerに準拠させるためにコンバーターは別途必要) |
| 79 | + |
| 80 | +### 元データの充実 |
| 81 | + |
| 82 | +現状BirdXplorer APIのためにETLがあるという位置づけで機能開発されているものを、それ以外の需要にも対応するために、取れるデータはアーカイブとしてすべて取る。 |
| 83 | + |
| 84 | +- 取れるものはすべて取る方針 |
| 85 | +- X APIのフルアーカイブをつくる(関連するもののみ) |
0 commit comments