「Preg問題タイプ」の版間の差分

提供:MoodleDocs
移動先:案内検索
177行目: 177行目:


説明が難しい場合は、見つからない正規表現を '''^(?!)''' や ''')''' で囲んでください。'--' 構文は試さないでください。これはJoseph Rezeauによって作成された[[Regular Expression Short-Answer question type]](REGEXP)に特有のものです!
説明が難しい場合は、見つからない正規表現を '''^(?!)''' や ''')''' で囲んでください。'--' 構文は試さないでください。これはJoseph Rezeauによって作成された[[Regular Expression Short-Answer question type]](REGEXP)に特有のものです!
また、次のような構文を使って、'''誤植された単語''' を大まかに検索することもできます(実際には、他のものが正しい場合にのみ機能します)。
  (?!<I\s+)\bam\b(?!\s+victor)
この表現は、"I am victor" という文章の中で、"am" の前に "I" がなく("(?!<I\s+) "の部分)、その後ろに "victor" がある("(?!<I\s+victor) "の部分)ことで、"am" の置き忘れを検出します。"\s+" は、単語の間にいくつでもスペースを入れることができます。最初 (最後) の単語 (句読点など) を検出したい場合は、関連するアサーションの中に単語ではなく、文字列の開始/終了を示す単純なアサーション ("^" または "$") を配置する必要があります。例えば、"I" の間違いを探すには、次のように書きます。
  (?!<^)\bI\b(?!\s+am)
これは、"I" が文字列の先頭になく、"am" が続いていないものを探します。

2021年4月6日 (火) 06:45時点における版


注意: このプラグインは、現在 (2020年2月) Moodleブランチ2.3から3.1のみで利用可能と記載されていますが、プラグイン統計タブでは、このプラグインがインストールされている30以上のサイトのうち、半分が3.2から3.8のMoodleブランチであることがわかります。公式にサポートされていないブランチでも、正規表現プラグインは動作しますが、'オーサリングツール' は利用できません。プラグイン開発者は、このプラグインをアップデートして、この問題を引き起こすJavaScriptの問題を修正するために作業しています。DEVELOPER レベルのデバッグを有効にした場合、サーバに危険を及ぼさない警告が表示されることがあります。これらは将来のリリースで修正されるはずです。

Pregは、正規表現 (regexes)を使用して、学生の回答をチェックする問題タイプです(ただし、ヒント機能のために、正規表現なしで使用することもできます)。正規表現は、問題を作成するときの教師と答えを書くときの学生の両方に、膨大な機能と柔軟性を与えます。最初のセクションでは、このドキュメントの使い方を説明していますが、慎重に使用してください。正規表現の構文についての詳細は http://www.nusphere.com/kb/phpmanual/reference.pcre.pattern.syntax.htm にあります。多くの優れた正規表現のマニュアルがありますが、ここでは繰り返しません。

Preg問題とこのドキュメントの利用方法

正規表現については何も知らない (知りたくない) けど、次の単語 (文字) をヒントにするのは便利そうだな

Preg問題タイプを記述と同じように使うことができますが、正規表現についての知識がなくても、高度なヒントを得ることができます。そのためには、選択する必要があります。

  • Notation => Moodle shortanswer
  • Engine => Finite state automata
  • Exact matching => Yes

その後は、あなたの記述問題から答えをコピーすればいいのです。ヒンティングの設定については、ヒンティングのセクションを読んで理解しておくとよいでしょう。いくつかの図解された、ステップバイステップの、K-12および大学レベルの使用例については、Preg問題タイプの例を参照してください。

正規表現の知識は漠然としているが、パターンマッチングを利用してみたい

正規表現を書くのは大変だけど、その強みをパターンとして利用したい場合、オーサリングツールが問題の作成に大いに役立つでしょう。ツールは正規表現の意味を様々な方法で示してくれます: 表現の内部構造(シンタックスツリー)、マッチングの視覚的なパス(説明グラフ)、そしてテキストの説明です。また、複数の文字列に対して正規表現をテストし、期待通りに動作するかどうかを確認することもできます。あなたの正規表現を実験し、遊び、オーサリングツールの対応する変更を見て、最終的にはあなたが望む正規表現を手に入れてください。

まずオーサリングツールのセクションを読み、その後(おそらく自分でツールを試した後)正規表現を理解するのセクションを読みます。(これは任意ですが、面白いし、大いに役立つでしょう) また、問題の仕組みのセクションも読んで、様々な設定とそれが問題にどのように影響するかを理解しておくと良いでしょう。

正規表現をしっかり学んで、正規表現が許すことなら何でもできるようになるための努力をしたい

さて、あなたは正規表現を知らないけれど、それを理解して複雑な表現を簡単に作りたいと思っています。闇雲に努力するのではなく、このセクションを読んで理解することに時間と労力を費やした方が良いでしょう。そして、オーサリングツールについて少し読み、それらを使って正規表現の作成を試してみましょう。これらのツールを使えば、本当によく理解できているか、期待通りの動作をするかを確認することができます。構文ツリーは、優先順位アリティ の意味を正しく理解しようとするときに特に役立つでしょう。正規表現の原理をよく理解したら、問題の仕組み正規表現のリファレンスのセクションを読んでください (可能性を知るためです。わざわざすべてを理解したり覚えたりする必要はありません。定期的に新しいことを学ぶためにそこを見ればいいのです)。これで、オーサリングツールをあまり使わずに正規表現を書けるようになったはずですが、式をテストするためのテストツールは別です。

私は正規表現をよく知っているので、詳しい説明がなくても自分で書けます

様々な設定とその下での問題の動作を理解するために、問題の仕組みを読むべきです。また、オーサリングツールのセクションの正規表現テストにも興味があるかもしれません。最後に、正規表現リファレンスも参考になるかもしれません。

==対応するMoodleブランチと翻訳==。 このプラグインは、現在 (2018年4月) Moodleブランチ2.3から3.1のみで利用可能と記載されていますが、stats page によると、このプラグインがインストールされている50以上のサイトのうち、半分は3.2から3.4のMoodleブランチです。公式にサポートされていないブランチでは、正規表現プラグインは動作しますが、オーサリングツールは利用できません。プラグイン開発者は、このプラグインをアップデートし、この問題の原因となっているJavaScriptの問題を修正するために作業を行っています。DEVELOPERレベルのデバッグを有効にした場合、サーバに危険を及ぼさない警告が表示されることがあります。これらは将来のリリースで修正される予定です。

Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP

すべてのMoodleプラグインと同様に、pregプラグインは、最初は英語で利用できます。現在、ロシア語およびメキシコのスペイン語の翻訳が利用可能ですが、AMOSで他の翻訳を行うことができます。

インストール方法

  • Moodle plugins databaseからダウンロード/インストールしてください。
  • すべてのプラグインの依存関係をインストールしてください。

preg missing dependencies.png

preg pathtodot.png

  • Windowsの場合、path to dotへのパスはC:\Program Files (x86)\Graphviz2.38\bin\dot.exeとなります。
  • Macでpath to docを見つけるには、ターミナルウィンドウを開き、次のように入力します。
which dot
    • そして、そのパス(例: /opt/local/bin/dot)を 'サイト管理 / ▶︎ サーバ / ▶︎システムパス' のPath to dotに入力します。

PREG問題の仕組み

基本的に、この問題タイプは記述問題タイプの拡張バージョンです。いくつかの異なる方法でその機能を拡張しています(ほとんどどのような組み合わせでも使用できます)。

  • パターン・マッチング - 正規表現を使用して、可能性のある学生の答えを記述する強力なパターンを作成できます。
  • ヒンティング - 学生が問題に行き詰まったとき、次の正しい単語(lexeme)や文字(ペナルティの可能性あり)を尋ねることを許可することができます。

問題の作業に影響する設定

答えとして指定したすべての正規表現の大文字・小文字の区別を設定します。なお、正規表現部分の大文字・小文字の区別を設定することもできます。 完全一致 は以下のように問題に影響します。

Yes
最初の文字から最後の文字まで、学生全体 の解答があなたの正規表現と一致する必要があります。
No
学生の解答には、あなたの正規表現に一致する 部分 を含めることができます。例えば、正解が "全体" の場合、"the whole enchilada"、"the whole shebag"、"the whole nine yards"、"the whole world"、"the whole truth" はすべて正しい学生の解答となります。

また、special regex syntaxを使用して、いくつかの正規表現を学生の解答全体にマッチするように設定することもできます。

Notations は、解の "言語" を指定するものです。

Regular Expression
正規表現のための通常の記法です。正確には、Perl互換の正規表現の方言です。読みやすくするために、複数の文字列で正規表現を書いても構いません。
正規表現(拡張)
本当に複雑な正規表現に便利です。これは、PHP の 'x' 修飾子に似ています。正規表現の中で、文字クラスの中にないエスケープされていない空白を無視します。- これにより、スペースを使って自由に正規表現をフォーマットすることができます。また、改行も無視しますが、便利な例外があります。'#' 文字以降、文字列の最後まではコメントとして扱われます(#はエスケープしてはいけませんし、文字クラスの中にあってはいけません)。
Moodle shortanswer
これを使えば、正規表現の構文を一切使わずに、記述問題の解答をそのままコピーすることができます。ワイルドカードの '*' に対応しています。FAエンジンを選択すると、ヒント機能を利用することができます。正規表現についての説明は省略できますが、問題のヒント動作を設定するために変更できる様々な設定を理解するために、ヒントセクションを必ず読んでください。有用なヒントと動作例については、Preg問題タイプの例を参照してください。

マッチングエンジンは、正規表現によるマッチングを行うプログラムモジュールを指定します。最適なマッチングエンジンというものはなく、使用する機能によって異なります。エンジンにはさまざまな安定性があり、使用できる機能も異なります。

PHP preg extension
は、ヒントが必要ない他のエンジンがあなたの表現を難しすぎると拒否する、またはバグに遭遇した場合に使用するべきです。これは、PHPのネイティブなpreg_関数をベースにしています。100% perl 互換の正規表現機能をサポートしており、非常に安定しており、徹底的にテストされています。しかし、部分一致をサポートしていないので、 (PHP開発者に部分一致のサポートを追加させない限り) no hinting はありません。しかし、サブパターンの取り込みには対応しています。他のエンジンがサポートしていない複雑な正規表現機能が必要な場合は、このエンジンを選択してください。
Finite state automata (FA)
学生のための ヒントの実行 に使うことができます。FA エンジンはカスタムPHPコードで、多くの (すべてではない) 正規表現機能をサポートし、徹底的にテストされています (AT&T testregex スイートのすべてのテストと、サポートしている機能に関する PCRE testinput1, testinput4 スイートのほとんどのテストに合格しており、これは非常に意味のあることです)。今のところサポートされていない機能は、ルックアラウンドアサーションといくつかのタイプの条件付きサブパターンです。

誤字脱字検出

3.2以降のFAエンジンでは、誤字脱字の検出がサポートされています。

先生方は、誤字脱字のある解答が完全に間違っていると評価されることを望まないことが多いです。このシステムは4種類のタイポを検出して修正します。

 character insertion: cot → coat
 character deletion: cooat → coat
 character substitution: coot → coat
 characters transposition: caot → coat

問題設定で誤字脱字検出を有効にして、誤字脱字制限(解答に許容される誤字脱字の数)と誤字脱字のペナルティ(ゼロにすることも可能)を指定する必要があります。 typo detection.png

ヒント

ヒントは、adaptive and interactive behavioursのFAエンジンでサポートされています。

部分一致

ヒントは 部分一致 から始まります。部分的に正しい解答とは、正しい文字で始まり(正規表現にマッチする)、ある文字でマッチが切れる文字列を意味します。例えば、"フランスとオランダの国旗に使われている色は何ですか?" という質問をして、正規表現を入力したとします。

 "are blue, white(,| and) red"

と学生が答えました。

 "they are blue, vhite and red"

このような場合、部分的に一致するのは

 "are blue, "

正規表現は固定されていないため ("完全一致" が "いいえ" に設定されている)、学生の解答の最初の文字でマッチしないことがあることに注意してください (上記の例のように "they" がスキップされます)。部分一致を使用している間、学生は正しい部分と間違った部分を見ることになります。

 they are blue, vhite and red

preg the colors of the french flag.png

一般的なヒントのルール

REGEXP Regular Expression Short-Answer question typeとは異なり、Preg問題タイプはヒント文字を学生の解答に追加せず、いくつかの理由から別々に表示します。

  1. 自分の解答にヒント文字を追加したいかどうかは学生の責任です (さらにいくつかの理由もあります)。
  2. 解答が修正されると、ヒント を繰り返し押すのが簡単になってしまうので、ヒントを考えるのがわずかに楽になりますが、これは通常望ましい行動ではありません。

ヒントは可能な限り、マッチを完了するための最短経路につながる文字を選択します。先ほどの正規表現に対する解答を考えてみましょう。

 are blue, white; red

ヒントとなる文字は2つあります。"," または " "( " および " のパスにつながる)です。問題では "," はマッチを完成させる最短のパスを導くので選択され、 " " は3文字長いパスを導くので選択されます。

すべての正規表現が100%の評価を得られるとは限りません。記憶力の悪い学生のための表現を追加したとします。

 are white(,| and) red

60%の評価と を忘れたことについてのフィードバック。あなたは、ヒントを使って学生を回答に導くことを望まないかもしれません。

  are white, red

もし彼が

  are white, oh I forgot the other colors.

Hint grade border はこれを制御します。評定がHint grade border以上の正規表現のみが部分一致とヒントに使用されます。Hint grade borderを1に設定すると、評定100%の正規表現のみがヒントに使用され、0,5に設定すると、評定50%~100%の正規表現がヒントに使用され、0%~49%の正規表現は使用されません。ヒントに使用されない正規表現は学生の解答と完全にマッチした場合のみ機能します。

次の文字のヒント

次の文字のヒントが利用可能な場合、学生は hint next character ボタンを押して、背景色でハイライトされた1つの次の正しい文字を受け取ることができます。

 they are blue, wvhite and red

通常、ヒント ペナルティ は通常の問題 ペナルティ よりも多く設定する必要があります。なぜなら、これらのペナルティは別々に適用されるからです。

次のレキシム (語彙) ヒント

語彙 とは、言語の原子部分を意味する。自然言語では、単語数字句読点 (または '?!' や '...' のようなマークの集まり)が語彙となる。プログラミング言語の場合は、キーワード変数名定数operator などになります。なお、スペースは特定の意味を持たないため、通常は字句ではなく字句間のセパレータと考えられています。

次の語彙ヒント は、現在の語彙を完成させるか(部分一致がその中で終わった場合)、次の語彙を表示します(学生が現在の語彙を完成させた場合)。例えば

  are blue

または

  are blue,

または

  are blue, white

Preg問題タイプでは、2.3リリース以降、formal languages block を使用して、次の字句のヒントを使用することができます。言語によって語彙の境界が異なるため、問題に対する解答を期待する言語を選択する必要があります。今のところ、以下の言語をサポートしています(今後も増える予定です)。

simple English
英語のスキャナは、単語、数字、句読点を認識します。
C/C++ language
プログラミング言語のC (またはC++) です。
printf language
プログラミング言語C (またはC++) で文字列をフォーマットするための特殊な言語ですが、おそらく無効になっているでしょう。

サイト管理者は、混乱を避けるために、教師が利用できる言語をコントロールすることができます。プラグインの設定メニューにあるブロック "Formal languages" の設定をご覧ください。

注意: simple Englishの言語オプションは、他の人間が書く言語にも使用できますが、学生が小テストを受ける前に、正規表現が期待通りに機能するかどうかをチェックするのが賢明でしょう。現在(2018年3月)。メキシコのスペイン語(小数点を使用)とロシア語(小数点のコンマを使用)でテストしました。

なお、"lexeme "は通常、ヒントボタンで学生に表示させたい単語ではありません。それぞれの言語で、独自の言葉が定義されています。デフォルトの単語が気に入らない場合は、問題の説明に別の単語を入力することができます。

画像ヒントの修正方法

誤字脱字検出が有効で、学生の解答が完全であるが誤字脱字が含まれている場合、学生はどのボタンを押しても hint next character ボタンが表示されます。 彼は、見つかったすべてのタイプミスを修正するために文字列にどのような変更を加える必要があるかを示す画像を受け取ります。 how to fix url.png

サブパターンのキャプチャとフィードバック

正規表現の中の任意の括弧のペアは サブパターン とみなされ、マッチングの際にエンジンはマッチ全体だけでなく、すべてのサブパターンに対応する部分も記憶(キャプチャ)します。サブパターンは入れ子にすることができます。サブパターンが繰り返されている場合(すなわち、量詞を持っている場合)、すべての繰り返しの中で最後にマッチしたものだけがキャプチャされます。キャプチャするサブパターンを定義せずに評価の順序を変更したい場合(処理が速くなる)は、単に ( ) ではなく (?: ) を使用してください。ルックアラウンドアサーションはサブパターンを作成しません。

サブパターンは括弧を開けて左から右へと数えられます。正確には、0 は正規表現全体、1 は最初のサブパターンなどです。答えのフィードバック には、簡単なプレースホルダを使ってそれらを挿入することができます。{$0} はマッチ全体に、{$1} は最初のサブパターンの値などに置き換えられます。これにより、フィードバックの質が向上します。プレースホルダは 一般的なフィードバック では機能しません。なぜなら、異なる回答は異なる数のサブパターンを持ちうるからです。

注意: 以下の文章は、サイトの言語で小数点記号としてポイント文字が使われていることを想定しています。

ここでは、任意の整数部を持つ10進数を定義する正規表現を見てみましょう。

 [+\-]?([0-9]+)?\.([0-9]+)

これには2つのサブパターンがあります。1つ目は積分部分、2つ目は数字の小数部分です。 フィードバックを書いた場合:

The number is: {$0} Integral part is {$1} and fractional part is {$2}

それから学生が入った

123.34

彼が見るのは

The number is: 123.34 Integral part is 123 and fractional part is 34

積分部分が与えられていない場合、{$1} は空の文字列に置き換えられます。このような状況で "整数部" を消去する方法は(今のところ)ありません。プレースホルダの構文が複雑になり、エラーが発生しやすくなる可能性があります。

なくなったもの、置き忘れたものを探す

Joseph Rezeauによって作成されたRegular Expression Short-Answer question type(REGEXP)には missing words 機能があり、答えの中に何かが欠落している場合に機能する答えを定義することができます(そして学生に適切なフィードバックを与えることができます)。

同様の効果は、否定的な主張とマッチング開始のアンカーを組み合わせることでも得られます。欠けている単語 necessary を探すための正規表現は

 ^(?!.*bnecessary\b.*)

となります。

  • (?!.*\bnecessary\b.*)負の先読み のアサーションで、文字列のどこかの時点で necessary という単語がない場合にのみマッチングを許可します。
  • ^ もアサーションで、マッチを解答の先頭に固定します(そうしないと、レスポンスの中で "necessary" という単語の後に、その単語があってもマッチが可能な場所ができてしまいます)。

説明が難しい場合は、見つからない正規表現を ^(?!)) で囲んでください。'--' 構文は試さないでください。これはJoseph Rezeauによって作成されたRegular Expression Short-Answer question type(REGEXP)に特有のものです!

また、次のような構文を使って、誤植された単語 を大まかに検索することもできます(実際には、他のものが正しい場合にのみ機能します)。

  (?!<I\s+)\bam\b(?!\s+victor)

この表現は、"I am victor" という文章の中で、"am" の前に "I" がなく("(?!<I\s+) "の部分)、その後ろに "victor" がある("(?!<I\s+victor) "の部分)ことで、"am" の置き忘れを検出します。"\s+" は、単語の間にいくつでもスペースを入れることができます。最初 (最後) の単語 (句読点など) を検出したい場合は、関連するアサーションの中に単語ではなく、文字列の開始/終了を示す単純なアサーション ("^" または "$") を配置する必要があります。例えば、"I" の間違いを探すには、次のように書きます。

  (?!<^)\bI\b(?!\s+am)

これは、"I" が文字列の先頭になく、"am" が続いていないものを探します。