最近、自作で九九の練習プリントをHTMLで作ってみたんです
これが思いのほかよくできて、印刷用にもバッチリ対応している
「あれ、く⭕️んいらんのちゃうか…?」と一瞬思ってしまうほど(笑)
仕組みはシンプル
ランダムに九九の問題を生成して、左右に分けて並べるだけ
ちゃんと空白スペースもあって、答えを書き込める
しかも「新しいプリント作成」ボタンを押すだけで、次々と新しい問題が出てくる
これは非常に便利で良い
色々と新作も作っている最中
調子に乗って、次は国語教材を…と思ったら、これがなかなか難しい。
算数のように「数字をランダムに変えるだけ」というわけにはいかない。
日本語の文章は、語順や意味のつながりがちょっと崩れるだけで、急に変になる
ChatGPTに「語彙をランダムに組み合わせて自然な文章にして」と頼んでも、まだまだ手作業の調整が必要
漢字の読み取りや、語彙の選択問題ならなんとかなるけど、「意味のある文をランダムで再生を繰り返す」っていうのは、やっぱり人の手と感覚がいるなと実感した
九九のような「型が決まった問題」はAIとの相性が良いです
でも、国語のような「意味や流れを重視する分野」は、まだまだ試行錯誤が必要
そんなことを考えながら、少しずつ教材作りに取り組んでいます

意味のある5行の文章を作るアプリの例
小学校低学年の漢字だけを使って、意味のある5行の文章を作るアプリを作ってみた。
ランダムな語彙をテンプレートにはめ込む仕組みで、擬音語も入れて楽しい雰囲気にしてみた
漢字と読解と擬音語の学習を目的とした
以下code
<!DOCTYPE html>
<html lang=”ja”>
<head>
<meta charset=”UTF-8″ />
<meta name=”viewport” content=”width=device-width, initial-scale=1.0″ />
<title>春の5行漢字文(小1漢字+擬音語)</title>
<style>
body {
font-family: serif;
padding: 20px;
writing-mode: vertical-rl;
line-height: 2;
background-color: #fff;
}
h1 {
writing-mode: horizontal-tb;
text-align: center;
font-size: 1.5rem;
margin-bottom: 20px;
}
.output {
white-space: pre-wrap;
margin-bottom: 30px;
font-size: 1.2rem;
}
button {
writing-mode: horizontal-tb;
padding: 10px 20px;
font-size: 1rem;
display: block;
margin: 0 auto;
}
</style>
</head>
<body>
<h1>🌸 春の5行文:小1漢字とやさしいことばで🌸</h1>
<div class=”output” id=”output”></div>
<button onclick=”generateSentence()”>つぎの文をつくる</button>
<script>
const subjects = [“わたし”, “ぼく”, “ともだち”, “いぬ”, “はは”, “ちち”, “せんせい”];
const locations = [“山”, “川”, “田”, “学校”, “空”, “林”, “春の山”, “花の道”];
const actions = [“行きました”, “見ました”, “歩きました”, “あそびました”, “話しました”, “書きました”];
const objects = [“花”, “虫”, “水”, “月”, “木”, “鳥”, “石”, “風”];
const feelings = [“たのしかったです”, “うれしかったです”, “おもしろかったです”, “きれいでした”, “すごかったです”];
const sounds = [“ぴかぴか”, “ごろごろ”, “ぽちゃん”, “さらさら”, “わんわん”, “ふわふわ”, “きらきら”, “にこにこ”];
function getRandom(arr) {
return arr[Math.floor(Math.random() * arr.length)];
}
function generateSentence() {
const s = getRandom(subjects);
const l = getRandom(locations);
const a1 = getRandom(actions);
const o = getRandom(objects);
const a2 = getRandom(actions);
const f = getRandom(feelings);
const g = getRandom(sounds);
const lines = [];
lines.push(`${s}は、${l}に${a1}。`);
lines.push(`${o}を${a2}。`);
lines.push(`${l}で${o}が見えました。`);
lines.push(`${s}と${o}であそびました。`);
lines.push(`まわりは「${g}」、${f}`);
document.getElementById(“output”).textContent = lines.join(“\n”);
}
generateSentence();
</script>
</body>
</html>
しかしランダム化する際に
まわりは「きらきら」、たのしかったです。
のような少し違和感のある文章になってしまうことがあった
一見すると自然に見えるが、日本語は文脈や意味のつながりがとても繊細
主語と動詞、目的語の組み合わせがちょっとでもズレると、「うーん…これは変やな」と感じてしまう文になる
国語の文章問題ランダム生成はまだまだ時間がかかりそうである
なぜ国語の問題作成は難しいと感じるのか?
国語の問題、とくに読解問題や漢字の用法問題などは、文章の「微妙なニュアンス」や「文脈の流れ」、「日本語ならではのあいまいさ」などを前提とすることが多いChatGPTは自然言語の処理に優れてはいますが、
- 文脈の深読み
- 設問の意図の明確さ
- 複数の正解が成立しうる問いの設定
といった点で、人間の作問者と比べてまだ課題があると感じられることがありますね
ChatGPTで作成しやすい例題
例題1:漢字の読み
次の言葉の読みがなをひらがなで書きなさい。
- 出発( )
- 教室( )
- 昨日( )
例題2:文の内容に合うものを選ぼう
つぎの文を読んで、後の問いに答えましょう。
まさとくんは、朝から雨がふっていたので、学校へ行くのがゆううつでした。ところが、学校に着くと友だちが「一緒に遊ぼう」と声をかけてくれたので、気分が明るくなりました。
問:まさとくんの気持ちの変化として正しいものをえらびましょう。
A. はじめはたのしくて、あとでかなしくなった
B. はじめはいやで、あとでうれしくなった
C. はじめからずっとうれしかった
D. ずっとつまらなかった
あらかじめ文を作るとかテストを作るのは簡単と思うが、ランダム切り替えで意味の通る文章を作るのはなかなか難しい
国語と算数の問題の構造上の違い
算数の方が数字を変えるだけでランダム生成に問題が作りやすい
文章題にしても。
算数(例:九九)は「構造が固定」=ランダムに強い
- 例:「◯×◯=?」の◯に数字を入れるだけ
- 文の意味や流れを考えなくてよい
- 出題ルールが完全に数式化できる
数字だけランダムに入れれば、いくらでも破綻なく作れる
📚 国語・語彙問題は「文脈に依存」=ランダムに弱い
語彙を使って文章を作ろうとすると、以下の課題が出ます:
- 単語の意味や使い方に適切な文脈が必要
→ たとえば「勇気」を含む文にするには、前後の状況設定が要る - 語順・助詞・主語など、複数要素が絡む
→ 「を・が・に・で」などの使い方まで正確にしないと不自然に - 語彙のレベル差(抽象語 vs 具体語)
→ 「うれしい」と「責任」では、文の難易度も文脈の複雑さも違う
もう少し限定的にやれば上手いことできそうですが・・・
まとめ
九九アプリのように型が明確な問題(数字を変えるだけ)であればランダム生成は簡単
計算問題とかはさらに発展できるので
自宅でも個別の能力に応じた教材は提供できる
一方で国語は、「語順」「意味」「文脈」が絡み合っていて、テンプレ式だけでは自然な文になりにくいという壁を感じた
テストを作るとかはできると思うが、繰り返す教材作りには向いていないか・・・
とはいえ、こうした“ちょっと失敗”も教材づくりの醍醐味に感じています
次は「主語・動詞・目的語の組み合わせに制限をかける」など、もう少し精度を上げた文生成に挑戦したいと思っています
以上参考になれば幸いです
コメント