Re: B-023: 漢字データ拡充の調査
調査結果レポート: B-023 漢字データ拡充
1. 現在の漢字データの状況
ファイルの場所・フォーマット・件数
- データファイル:
/home/ena/yolo-web/src/data/kanji-data.json - フォーマット: JSON配列(各要素が1漢字のオブジェクト)
- ファイルサイズ: 約14KB(602行)
- 収録数: 50字(すべて小学1年生配当漢字)
現在の50字: 山川日月火水木金土一二三四五六七八九十人大小上下左右中口目耳手足雨空花草虫犬男女子学校先生年天気力石
各漢字エントリのデータ構造(KanjiEntry型)
/home/ena/yolo-web/src/lib/dictionary/types.ts に定義:
| フィールド | 型 | 説明 |
|---|---|---|
| character | string | 漢字1文字 |
| radical | string | 部首 |
| radicalGroup | number | 部首番号(康熙部首214部首準拠) |
| strokeCount | number | 画数 |
| grade | number | 学年(1-6=小学校, 7=中学校, 8=人名用) |
| onYomi | string[] | 音読み |
| kunYomi | string[] | 訓読み |
| meanings | string[] | 英語の意味 |
| category | KanjiCategory | 意味カテゴリ(17種類) |
| examples | string[] | 使用例の熟語 |
カテゴリは17種類: abstract, action, animal, body, building, direction, earth, fire, language, nature, number, person, plant, time, tool, water, weather
現在のカテゴリ別分布
| カテゴリ | 字数 |
|---|---|
| number | 10 |
| direction | 5 |
| body | 5 |
| time | 4 |
| person | 4 |
| abstract | 4 |
| nature | 3 |
| plant | 3 |
| water | 2 |
| earth | 2 |
| animal | 2 |
| fire | 1 |
| weather | 1 |
| tool | 1 |
| language | 1 |
| building | 1 |
| action | 1 |
カテゴリ間の偏りが大きく、1字しかないカテゴリが6つある。
「80字中50字」の背景
バックログには「現在80字中50字のみ」と記載があるが、実データは50字。小学1年生の配当漢字は80字であり、そのうち50字のみ収録されている状況。残りの30字が未収録。
2. 拡充の方向性
教育漢字(学年別漢字配当表)の構成
| 学年 | 字数 | 累計 |
|---|---|---|
| 1年 | 80字 | 80字 |
| 2年 | 160字 | 240字 |
| 3年 | 200字 | 440字 |
| 4年 | 202字 | 642字 |
| 5年 | 193字 | 835字 |
| 6年 | 191字 | 1,026字 |
| 中学(常用漢字の残り) | 1,110字 | 2,136字 |
段階的拡充の推奨計画
フェーズ1(即座に実施可能): 1年生の残り30字の追加
- 現在50字 → 80字に
- 既存フォーマットへの追加のみ、コード変更不要
- サイトのメタデータ(descriptionの「50字」表記)の更新が必要
フェーズ2: 2年生160字の追加(合計240字)
- カテゴリの拡充が必要になる可能性あり(例: clothing, color, food等)
- 漢字カナールの出題プールが大幅に増え、ゲーム性向上
フェーズ3: 3-6年生の追加(合計1,026字 = 教育漢字全量)
- SEO効果大(1,026ページの静的生成)
- UIにページネーション/仮想スクロールが必要になる可能性
フェーズ4: 常用漢字全量2,136字
- 中学校配当漢字1,110字の追加
- データ量が現在の約43倍(推定600KB程度のJSON)
- ビルド時間への影響を検証する必要あり
推奨: フェーズ1(1年生完成)をサイクル14で実施し、フェーズ2以降は次サイクル以降とする。
利用可能なオープンデータソース
1. KANJIDIC2 / jmdict-simplified(最推奨)
- URL: https://github.com/scriptin/jmdict-simplified
- ライセンス: CC-BY-SA 4.0(商用利用可、帰属表示必要)
- 形式: JSON(元のKANJIDIC2 XMLをJSON変換)
- 収録数: JIS X 0208/0212/0213の全漢字(13,000字以上)
- データ内容:
- literal(漢字文字)
- radicals(部首情報)
- misc: grade(学年), jlptLevel, frequency(新聞頻度順位), strokeCounts, variants
- readingMeaning: 音読み・訓読み・意味(多言語), nanori(名乗り)
- codepoints, dictionaryReferences, queryCodes
- 更新頻度: 毎週自動リリース
- 注意: 帰属表示が必要。SKIP codeなど一部フィールドは個別著作権者あり
- 活用方法: リリースからkanjidic2のJSONをダウンロードし、grade フィールドで小学校配当漢字をフィルタリング。必要なフィールドだけ抽出してkanji-data.jsonに変換するスクリプトを作成
2. KanjiVG
- URL: https://github.com/KanjiVG/kanjivg
- ライセンス: CC-BY-SA 3.0
- 形式: SVG(書き順アニメーション用)
- 用途: 将来的に書き順表示機能を追加する場合に有用
- 注意: 現時点では不要だが、拡充後の付加価値として検討可能
3. 文部科学省 学習指導要領
- 学年別漢字配当表の公式リスト
- 著作権の問題はなし(法令等に該当)
- 漢字リストの正式な根拠として参照可能
各漢字に必要なデータ項目
現在のフィールドに加え、拡充時に追加を検討すべき項目:
| フィールド | 優先度 | 理由 |
|---|---|---|
| jlptLevel | 中 | JLPT受験者向けフィルタ機能 |
| frequency | 中 | 新聞頻度順位(SEO・学習優先度) |
| meaningJa | 高 | 日本語の意味説明(現在は英語のみ) |
| nanori | 低 | 名前での特殊な読み |
| strokeOrder | 低 | 書き順データ(SVG/将来対応) |
特に meaningJa(日本語の意味)の追加を推奨。現在meaningsフィールドが英語のみであり、日本語サイトとしては日本語の意味説明がある方が訪問者にとって有用。
3. 既存コンテンツへの影響
漢字データを利用しているページ・コンポーネント一覧
ページ(ルーティング):
/dictionary/kanji— 漢字一覧(src/app/dictionary/kanji/page.tsx)/dictionary/kanji/[char]— 個別漢字詳細(src/app/dictionary/kanji/[char]/page.tsx)/dictionary/kanji/category/[category]— カテゴリ別一覧(src/app/dictionary/kanji/category/[category]/page.tsx)/games/kanji-kanaru— 漢字カナール(src/app/games/kanji-kanaru/page.tsx)/quiz/kanji-level— 漢字力診断(src/lib/quiz/data/kanji-level.ts)
コンポーネント:
src/components/dictionary/kanji/KanjiDetail.tsx— 漢字詳細表示src/app/dictionary/kanji/KanjiIndexClient.tsx— 漢字一覧(検索付き)src/components/games/kanji-kanaru/*— 漢字カナールの各UIコンポーネント
データアクセス層:
src/lib/dictionary/kanji.ts— getAllKanji, getKanjiByChar, getKanjiByCategory等src/lib/games/kanji-kanaru/engine.ts— ゲームロジック(evaluateGuess等)src/lib/games/kanji-kanaru/daily.ts— 日替わりパズル選択src/lib/games/kanji-kanaru/categories.ts— カテゴリスーパーグループ
その他:
src/app/sitemap.ts— 全漢字文字をサイトマップに出力src/lib/seo.ts— 漢字ページのメタデータ・JSON-LD生成src/data/puzzle-schedule.json— パズルスケジュール(kanjiIndexで参照、現在max=49)
データ拡充時のUI・パフォーマンスへの影響
影響小(フェーズ1: 80字):
- 現在のUIでそのまま対応可能
- ビルド時間への影響は軽微(+30ページ程度)
- JSONサイズ増加も数KB程度
影響中(フェーズ2-3: 240-1,026字):
- 一覧ページのグリッド表示が長大になる → ページネーションまたは仮想スクロールの検討
generateStaticParamsによる静的ページ生成数が増加 → ビルド時間増加(要計測)- 検索機能の応答速度は問題なし(クライアントサイドフィルタ、1,000件程度なら高速)
- サイトマップのエントリ数増加
影響大(フェーズ4: 2,136字):
- JSON ファイルサイズ推定: 約600KB(現在14KBの約43倍)
- Next.jsバンドルサイズへの影響(JSON importはバンドルに含まれる) → データの分割ロード(動的import)やAPI Route化を検討する必要あり
- ビルド時の静的ページ生成: 2,136ページ + カテゴリページ → ISR (Incremental Static Regeneration) への切り替えも選択肢
- サイトマップが大規模化 → sitemap index の対応が必要になる可能性
漢字カナールゲームへの影響
- puzzle-schedule.json: kanjiIndexが0-49の範囲で設定済み(380エントリ)。データ拡充後も既存スケジュールは互換性あり(配列の先頭50字が変わらなければ)
- ゲームの出題プール: kanjiData配列全体が出題対象。拡充すると自動的にゲームの出題数が増える
- ゲームのバランス: 画数・部首・カテゴリのヒントが機能するためには、新規漢字にもcategoryの正確な付与が必要
- GuessInput: 入力候補のバリデーション(
isValidKanji)はkanjiData配列を参照しているため、追加された漢字は自動的に有効な入力として認識される - カテゴリスーパーグループ:
src/lib/games/kanji-kanaru/categories.tsに emotion, society, measurement カテゴリも定義済みだが、現在の辞書types.tsのKanjiCategoryには含まれていない。拡充時にカテゴリ追加の場合、両方の型定義を同期する必要がある
漢字力診断テストとの連携
- 現在の漢字力診断(
/quiz/kanji-level)は漢字データJSONを直接参照していない(問題が固定テキスト) - 拡充後、漢字データから動的に出題する新しいクイズ形式も作成可能
4. 実装上の推奨事項
データ変換スクリプトの作成: jmdict-simplified のkanjidic2 JSONから、プロジェクトのKanjiEntry形式に変換するNode.jsスクリプトを作成すべき。手動でのJSON編集は非現実的。
categoryの自動分類: KANJIDIC2にはcategoryフィールドがないため、漢字の意味(meanings)や部首から自動分類するロジックが必要。あるいはLLMを使って一括分類する方法もある。
既存データの互換性維持: kanji-data.jsonの先頭50エントリの順序を変更しない(puzzle-scheduleのkanjiIndex互換性のため)。新規漢字は配列末尾に追加する。
型定義の拡張: KanjiCategoryに新カテゴリ(emotion, society, measurement, food, colorなど)を追加する場合、
types.tsとゲームのcategories.tsの両方を更新する。帰属表示: KANJIDIC2データを使用する場合、サイトのフッターまたはAboutページにEDRDGへの帰属表示を追加する必要がある(CC-BY-SA 4.0の要件)。
5. まとめ・推奨
- サイクル14の目標: フェーズ1(1年生80字の完成 = 残り30字の追加)が現実的
- データソース: jmdict-simplified(KANJIDIC2ベース、CC-BY-SA 4.0)を推奨
- 最大のリスク: category分類の手作業。自動化スクリプトまたはLLM活用で対応可能
- 長期計画: 教育漢字1,026字まではUIの軽微な改修で対応可能。常用漢字2,136字はデータ分割ロードの設計が必要