はじめに
英文って5文型という構造があるなら、その構造に着目して診断することで、学習者に合わせたフィードバックができるシステムになるのではないかと考えました。
英語の文をただの単語列として扱うのではなく、
- 主語
S - 動詞
V - 目的語
O - 補語
C - 修飾語
M
のような「文の骨格」として扱い、学習者がどこで間違えたのかを少しずつ診断できるようにすることを目指しています。
今回は、React + TypeScript + Vite で作成したプロトタイプについてまとめています。
作ろうとしているもの
作っているのは、英単語カードを並べ替えて英文を作る学習アプリです。
たとえば、
彼は走る。
という問題に対して、学習者はカードを並べ替えて、
He runs.
を作ります。
ただし、単に正解文と完全一致するかだけを見るのではなく、以下のような観点で採点します。
- 語順、文型の理解
- 単語選択の過不足
- 主語と動詞の一致
- 三単現
- 冠詞、単複
- 例文との完全一致
つまり、
He run.
なら、文型の並びは S V なので骨格は近いけれど、動詞の形が違う。
He runs an apple.
なら、S V O になってしまい、SV 文としては不要な目的語が混ざっている。
このように、間違いを少し分解して見られるようにしたいと考えました。
技術構成
今回のプロトタイプは、以下の構成で作成しています。
React
TypeScript
Vite
今回は、5文型に着目したこのアプリが想定通り動くのか、学習アプリとして意味がありそうかを確認することが主目的です。そのため、バックエンドやユーザー登録機能用のDBなどは入れていません。
プロトタイプでできたこと
現在のプロトタイプでは、以下のところまでできています。
- 25問の問題データを読み込む
- 問題を1問ずつ表示する
- 英単語カードを選択してスロットに配置する
- 配置したカードをクリックして戻す
- 採点する
- 採点結果を表示する
- 文型チェックと単語チェックを分けて表示する
- 開発者用の採点デバッグ表示を出す
問題数は、いったん25問にしました
目的である、学習者の答えに対する診断とフィードバックは最低限ではあるものの、満たせていると思います
スロット数を7固定にしている理由
このアプリでは、カードを置くスロット数を常に7個にしています。
理由は、スロット数を問題ごとに変えてしまうと、文型が枠数から分かってしまうからです。
たとえば、
2枠 → SV
3枠 → SVO または SVC
4枠 → SVOO または SVOC
のように、スロット数がヒントになってしまいます。
今回は、あくまで「解いて学ぶ形式」にしたいため、スロット数だけで文型が分からないようにしました。
ダミーカードを混ぜる方針
カードには、正解に必要な単語だけでなく、ダミーカードも混ぜる方針にしています。
たとえば、
He runs.
の問題でも、
He
runs
run
an apple
happy
のようなカードを混ぜます。
これにより、学習者がどのように間違えたかを診断しやすくなります。
たとえば、
He run.
なら、主語と動詞の一致のミス。
He runs an apple.
なら、不要な目的語の混入。
He happy.
なら、動詞が足りない、または補語を動詞のように扱っている可能性があります。
単なる丸バツではなく、どの文法的な観点でつまずいているかを見たいという狙いです。
採点で見ている内容
現在の採点では、大きく以下を確認しています。
1. 語順、文型
配置されたカードの役割を見て、期待される文型と一致するかを確認します。
たとえば、SV 文なら、
S V
になっているかを見ます。
2. 不要な役割の混入
SV 文に O や C が混ざっていないかを確認します。
たとえば、
He runs an apple.
は、
S V O
になるため、SV 文としては不要な O が混ざっています。
3. 主語と動詞の一致
現在形の範囲で、主語と動詞の対応を確認します。
たとえば、
He runs.
に対して、
He run.
とした場合、文型は S V ですが、三単現の形が違います。
4. 冠詞・単複
名詞句について、a、an、the、単数形・複数形の確認を行います。
たとえば、
I eat an apple.
で an が抜けた場合、名詞句の形として不正解になります。
5. 完全一致
最後に、期待される英文とユーザーが作った英文が完全一致しているかを確認します。
修飾語 M の扱い
今回、大事だったのが修飾語 M の扱いです。
たとえば、
He studies every day.
という文があります。
この文は、文全体としては、
S V M
のように見えます。
しかし、5文型の中心だけを見ると、
S V
です。
every day は文型の中心ではなく、修飾語です。
そのため、採点では以下のように分けることにしました。
文型骨格チェック:S V だけを見る
完全一致チェック:He studies every day まで見る
つまり、
He studies every day.
は、文型骨格としては SV 文。
ただし、正解文としては every day まで含めて完全一致を確認します。
開発者用の採点デバッグ表示
採点ロジックを確認するために、開発者用のデバッグ表示を追加しました。
採点後に、以下のような情報を表示できます。
- 正解文
- 期待トークン
- ユーザートークン
- 期待ロール
- ユーザーロール
- 文型骨格
- ユーザー文型骨格
- 修飾語
- checks の中身
たとえば、
He studies every day.
を正解した場合、内部的には次のような状態になります。
正解文: He studies every day
期待トークン: ["He","studies","every","day"]
ユーザートークン: ["He","studies","every","day"]
期待ロール: ["S","V","M"]
ユーザーロール: ["S","V","M"]
文型骨格: ["S","V"]
ユーザー文型骨格: ["S","V"]
修飾語: {"expected":["every day"],"user":["every day"]}
これにより、修飾語 M が文型骨格から正しく除外されているかを確認できます。
実際に確認したこと
25問を通して、採点結果とデバッグ表示を確認しました。
特に確認したのは以下です。
- 正解文を作ったとき、すべてのチェックが通るか
-
Mを含む文で、文型骨格からMが除外されているか - 不要な
OやCを入れたとき、文型チェックで落ちるか - 三単現のミスが、主語と動詞の一致として検出されるか
- 冠詞のミスが、名詞句のチェックとして検出されるか
たとえば、
He studies English every day.
のように、SV 文に不要な目的語 English を入れた場合は、
期待ロール: ["S","V","M"]
ユーザーロール: ["S","V","O","M"]
文型骨格: ["S","V"]
ユーザー文型骨格: ["S","V","O"]
となり、SV 文としては不要な O が入っていることを確認できました。
現時点での課題
プロトタイプ1としてはある程度動きましたが、まだ課題もあります。
アドバイス文の精度
不正解時に、どの学習アドバイスを出すかはまだ粗いです。
たとえば、不要な目的語を入れた場合でも、単語の意味のミスとしてアドバイスされることがあります。
これは、内部で単語の差分量を見ているため、単語が増えたことを「意味のズレ」として強く判定してしまう場合があるためです。
今後は、
不要な目的語・補語が混ざっています
のように、より原因に近いアドバイスを出せるようにしたいです。
問題数
現在は25問です。
次の段階では50問に増やし、文型や誤答パターンをもう少し広げたいと考えています。
UI
現時点では、UIよりも採点ロジックの確認を優先しています。
今後は、学習者向けにはデバッグ表示を隠し、見た目も少し整える予定です。
今後やりたいこと
今後は、以下の順番で進める予定です。
- 問題データを50問に増やす
- 50問で採点デバッグを確認する
- アドバイス文の判定を改善する
- UIを少し整える
- 過去形・疑問形・否定文へ拡張する
- ユーザーごとの解答ログや理解度診断につなげる
将来的には、学習者の誤答傾向に応じて、出題やフィードバックを変えられるようにしたいです。
たとえば、
- 三単現をよく間違える
- 冠詞をよく抜かす
-
OとCの区別が苦手 - 修飾語を文型の中心に入れてしまう
といった傾向を記録して、次の問題選択や復習に反映するイメージです。
おわりに
今回は、5文型に着目した英語カード並べ替え学習アプリのプロトタイプ1を作成しました。
まだ小さなプロトタイプですが、
- 文型骨格
- 単語選択
- 三単現
- 冠詞・単複
- 修飾語
- 完全一致
を分けて確認できるようになりました。
特に、He studies every day. のような文で、every day を文型の中心ではなく修飾語 M として扱えるようになったことで、文型チェックと完全一致チェックを分離できました。
英語の文を単なる文字列ではなく、構造として扱うことで、学習者がどこを理解できていないのかを少しずつ見えるようにしていきたいです。
次は、問題数を50問に増やして、もう少し診断できる範囲を広げていこうと思います。