おはようございます。まさきんです。
未就学の子どもがいると、ひらがなの練習プリントを買い足す機会が多いです。ただ、市販のドリルは「その子がすでに書けている字」も一律に出題してきます。
なので、間違えた字だけを繰り返し出題するプリントを、AIに自動生成させる仕組みを作りました。今回は出題プールの持ち方や採点データの構造まで、具体的に紹介します。
きっかけは「できる字まで毎回やらされる」こと
市販のドリルは、五十音を順番に練習する構成が多いです。すでに書ける字も、書けない字も同じ回数だけ出てきます。
子どもからすると、できる字の練習は退屈です。書けない字にもっと時間を割きたいのに、ドリルの構成がそれを許してくれません。
そこで、間違えた字だけを記録し、忘れた頃に出題し直す仕組みを作りました。
出題を複数のセクションに分けている
1枚のプリントに、性質の違う練習を組み合わせています。
- なぞり書き: うすい見本をなぞって、運筆そのものを練習するセクション
- 絵→ひらがな: 絵を見て、単語の最初の文字を書くセクション。音と文字の結びつきを鍛える
- にた字どっち: 「さ・ち」「ぬ・ね」のように、形が似ているひらがなを見分けるセクション
- ことばをかこう: 2〜3文字の単語を、うすい見本つきでなぞり書きしてから自分で書き写すセクション
各セクションの出題数は、環境変数のような形で調整できるようにしています。「なぞり書き4問・にた字2問・ことばをかこう4問」のように、セクションごとの問題数を設定ファイルの数値だけで変えられる作りです。出題数を0にしたセクションはプリントに描画されず、見出しの記号は表示されるセクションだけで詰めて振り直されます。
出題を止める・増やすの判断もプールの数字だけで済む
各セクションの出題候補は、コードの冒頭にまとめた「プール」という辞書に持たせています。新しい文字や単語を追加したいときは、この辞書に1行足すだけです。
# 出題プールの例(実際のキーや単語は簡略化しています)
POOL_TRACE = {
"a1": {"char": "あ", "word": "あひる"},
"a2": {"char": "い", "word": "いぬ"},
# ...
}
POOL_WORD = {
"w1": {"word": "くつ", "len": 2},
"w2": {"word": "さかな", "len": 3},
# ...
}
各idをユニークにしておけば、あとは復習対象リストと突き合わせるだけで出題が組み上がります。出題範囲を広げたいときも、コード全体をいじる必要はありません。
仕組みの土台は「忘却曲線」
やっていることの中心は、間違えた字を段階管理することです。正解するたびにステージが上がり、出題までの間隔が伸びていきます。
| ステージ | 次の出題までの間隔 |
|---|---|
| 0(初回間違い) | 翌日 |
| 1 | 3日後 |
| 2 | 1週間後 |
| 3 | 2週間後 |
| 4 | 「卒業」(以後出題しない) |
正解すればステージが1つ上がり、間違えれば0に戻ります。ステージ4まで到達した字は、練習プリントには出てこなくなります。
この状態は、次のようなシンプルなJSONで持たせています。
{
"あ": {"stage": 2, "due": "2026-09-20"},
"ぬ": {"stage": 0, "due": "2026-09-13"},
"ね": {"stage": 4, "due": null}
}
毎日プリントを生成するときは、このdue(次回出題日)が今日以前になっている字だけを「今日の復習対象」として抽出します。復習対象になる文字の母集合が増えても、実際に出題するのは「いま出すべき字」だけに絞られるので、プリントが際限なく長くなることはありません。
コマンドラインからは、次のような操作で状態を更新しています。
# 今日のドリルを生成する
python3 daily_hiragana_drill.py generate
# 正解した字のステージを上げる(出題間隔が伸びる)
python3 daily_hiragana_drill.py mark-correct あ い
# 間違えた字はステージ0にリセットする(翌日また出題される)
python3 daily_hiragana_drill.py mark-miss の は
# 今の復習対象・卒業状況を一覧で確認する
python3 daily_hiragana_drill.py srs-status
この仕組みのいいところは、「その日ちょうど復習すべき字」だけが自動的に選ばれることです。親が「そろそろこの字も復習させよう」と考える必要がありません。
家計の中にも、放っておくと見直し忘れがちなものがあります。携帯料金もその一つかもしれません。
採点の基準はやはり「チェックだけ」
プリントの採点も、基準を統一しています。各問の左にあるチェック欄が塗られているかどうかだけで、正解・不正解を判断します。
字の形が多少崩れていても、チェック欄が白ければ正解として扱います。未就学の子どもの字は、まだ形が安定していません。厳しく評価しすぎると、練習そのものが嫌になってしまうと感じています。
採点済みのプリントを撮影してAIに読み取らせるときは、チェック欄の列だけを切り出して拡大してから判定させています。全体を縮小したままだと、塗りつぶしがつぶれて見えないことがあるからです。
セクションが複数あると、同じ文字が別のセクションで「正解」と「不正解」の両方として読み取られることがあります。この場合は、不正解を優先して1回だけ反映するようにしています。「できたつもり」で見落とすより、慎重に扱うほうが安全だという判断です。
なお、正解・不正解の基準となる回答例は、子どもには見せていません。答えを見ながら書くのではなく、まず自分で書いてみることを優先しています。
子どもが苦手意識を持ったときの対処
運用していくなかで、ある発展的な出題パターンだけ、子どもが強く嫌がるようになったことがありました。無理にやらせても、練習全体への苦手意識につながりかねません。
そこで、その出題パターンだけを出題数0に設定し、一時的に停止しました。空いた分の出題枠は、他の練習しやすいセクションに振り分けています。プールとロジック自体は残してあるので、再開したいときは出題数の設定を元に戻すだけで済みます。
「決めたカリキュラムを崩さない」ことより、「練習自体を嫌いにさせない」ことを優先しました。仕組みは、子どもの様子を見ながら調整していいものだと思っています。
生成しているプリントの中身
AIに渡している指示を、一般化して紹介します。
未就学児向けのひらがな練習プリントを1枚作成してください。
- 出題する文字・単語は、渡された「復習対象リスト」からのみ選ぶこと
- セクションごとの出題数は指定された数値に従うこと
- なぞり書き用の薄い文字と、自分で書く欄の両方を用意すること
- 文字のバランスが取りやすいよう、罫線を大きめに設定すること
復習対象リストは、前述のステージ管理から自動的に作成しています。プリント自体は、印刷してそのまま使える形式で出力させ、採点用の答え票は別ファイルとして出力しています。答え票は子どもには渡さず、採点する側だけが使う想定です。
やってみて感じたこと
一番の変化は、練習の密度が上がったことです。できる字を何度も書かせる時間がなくなり、苦手な字にだけ集中できるようになりました。
一方で、机に向かう時間自体を無理に増やそうとは思っていません。短い時間で、狙った字だけ練習できればそれで十分だと考えています。
こういう人に向いている
- 市販のドリルが「その子に合っていない」と感じている人
- 忘却曲線のような考え方を、家庭学習に取り入れてみたい人
- 出題プールをコードで管理する程度の、軽い実装に抵抗がない人
まとめ
間違えた字だけを段階管理し、忘れた頃に復習させる仕組みを作りました。市販のドリルにはない「その子専用」の出題ができるのが、一番のメリットだと感じています。
うまくいかない部分があれば、無理に押し通さず出題内容を調整する。仕組み化といっても、子どもの様子を見ながら手を入れ続けることが大事なのではないでしょうか。
ドリルだけでなく、家の中の仕組みはこうして少しずつ見直しています。携帯料金のような毎月の固定費も、同じように放置しがちです。たまには仕組みごと見直してみてもいいかもしれません。
本記事にはアフィリエイト広告を含みます。当サイトのリンクを経由して商品・サービスへお申し込みいただいた場合、提携先企業から成果報酬を受け取ることがあります。 また、運営者は楽天グループに所属する社員であり、紹介プログラムを通じた報酬を受け取る場合があります。記事内容・評価は広告の有無にかかわらず、運営者の実体験と調査に基づき作成していますが、 上記の関係性をご理解のうえお読みください。詳しくは免責事項・アフィリエイト表記をご覧ください。