提出された課題の明白な手抜きを見抜く機能

提出された課題の明白な手抜きを見抜く機能

- Tatsuya Shirai の投稿
返信数: 5

http://moodle.org/mod/forum/discuss.php?d=108978

 上記のディスカッショントピックから派生しました.

 課題の提出機能に,簡単な課題のチェック機能の追加を考えます.
 いわゆるコピペ問題を完全にチェックするのは大仕事ですが,

  • 単にコピーして提出されたもの

を見付ける機能であれば簡単に実装できます.moddata/assignment/id(数字)の下のファイルの情報を利用して,疑わしいものをリストアップするだけで良いでしょう.ただ,ある程度,先を見越して仕様を考えた方が発展性がありますので,少しだけ考えを整理しようと思います.

  • レベル1:内容が完全に一致する提出物が複数存在する
  • レベル2:内容が酷似した提出物が複数存在する
  • レベル3:内容の一部が類似した提出物が複数存在する
  • レベル4:内容が外部情報からのコピー&ペーストである可能性のある提出物が存在する

レベル4以外は同時に提出された学生の提出物を全てチェックして比較すれば良いでしょう.レベル4に関しては高度な技術を利用する必要がありそうです.

 提出された課題のファイルの種類は,

  • プログラム等のソースリスト
  • テキストファイルの自由記述文書
  • Word等のリッチな形式の自由記述文書
  • WordやExcelなどのバイナリデータ
  • 画像や音声などのマルチメディアデータ

これくらいでしょうか?


レベル1:内容が完全に一致する提出物が複数存在する

 タイムスタンプはサーバにアップロードされた時点のものであるとすればチェックに使えません.したがって,ファイルサイズでまず1次チェック,ついで候補についてMD5などのハッシュ値を調べる.

レベル2:内容が酷似した提出物が複数存在する
レベル3:内容の一部が類似した提出物が複数存在する

 少し難しい.対象となる提出物の種類(テキストか,バイナリか,ソースリストかなどなど)によって,類似性を見つけ出す/許容する点が異なります.拙作のKoreDareno.exeのように対象をソースリスト(C,C++,N88-BASIC)に限定して,コメントの違いは無視する,文字列の中身は無視する,などのようにアルゴリズムの違いまで踏み込むかどうかは教師次第でしょう.
 いっそのこと,diff等を使って「相違が何行以下だったら怪しい」としても良いのかも知れません.ただし,提出物の数が多い場合にはチェックを行なう組み合わせの数が膨大になりますので,サーバの負荷を無視できません.よく検討する必要があります.

レベル4:内容が外部情報からのコピー&ペーストである可能性のある提出物が存在する

 全くどうしたら良いのか見当がつきません. 


  研究レベルの成果を利用するのか,実用的な技術(市販品含む)を利用するのか.既に,類似性を発見するのに便利な道具が開発されているならば,それを利用するのが労力,信頼性の観点から好ましいでしょう.情報を求めます.

Tatsuya Shirai への返信

Re: 提出された課題の明白な手抜きを見抜く機能

- Tatsuya Shirai の投稿

 レベル1を実際に実装して見ました.

 今後,レベル2以上を実装する必要が生じた場合にフォームで条件等を設定できるように,新しくboneheadcheck.phpというソース(mod/assignment/submissions.phpを参考に)を作成し,評定の画面からリンクで新規ウィンドウを開きます. 

 現在はレベル1のみですので,添付した画像のように”疑わしい候補”を出力します.

  1. 課題のidを元にして,全ての提出物をリストアップ
  2. 提出物のリストをファイルサイズでグループ分け
  3. グループ分けされた提出物が一つしかない(ファイルサイズがユニーク)ものは候補から削除する(レベル1:完全一致なので).
  4. 同じファイルサイズの提出物についてSHA1ハッシュ値を調べてグループ分けする.
  5. 同じファイルサイズかつ同じSHA1ハッシュ値を持つ提出物が2個以上あるものは手抜きと判断し,検査結果として出力する.

可能性は低いですが,ファイルサイズが違うのにSHA1ハッシュ値が同じである可能性はゼロではないので,このように二段階のグループ分けを行ないました.

 添付した画像では(プライバシーの問題がありましたので)ユーザIDで表示していますが,最終的にはユーザ名(フルネーム)で出力します.ファイル名はリンクになっていて,file.php経由でダウンロード可能です.いまのところ,単一のファイルのアップロードでのみ動作を確認していますが,複数アップロードでも問題は無さそうでした.

 なお,今回,チェックに使用した課題は,穴埋め問題式のプログラミングの課題でしたので,本当はほぼ全員一致するはずです(笑).

 この”明白な手抜きをチェックする機能”は,fs_moodle3.05.00に組み込んで公開する予定です.

#boneheadcheck.phpは,ちょっと名前が悪いですかねぇ.もう少し学生に失礼ではないけれども,意図を明確に表す名前は無いものでしょうか.

添付 boneheadcheck.jpg
Tatsuya Shirai への返信

Re: 提出された課題の明白な手抜きを見抜く機能

- Tatsuya Shirai の投稿

 出力を表形式にし,さらにファイルを作成した日時と更新した日時も表示するように改良しました.いい感じです.

 さらに五月女さんも少し触れていていたように,仲良しグループと思われる集団の把握ができると便利だろうと思いましたので,推測されるグループのユーザidと氏名の情報のみを末尾に出力するようにしました.

 この明白な手抜きを見抜く機能は,fs_moodle以外でも利用可能ですので,もう少しソースリストを整理したらこちらにアップロードします.

Tatsuya Shirai への返信

公開します

- Tatsuya Shirai の投稿

 相対パスの問題がありますので,ここでは添付したboneheadcheck.phpをlib/fs_moodle(新規作成してください)にコピーしたとします.

 mod/assignment/lib.phpのfunction display_submissions()に,以下のようにリンクを追加してみて下さい.

         $course_context = get_context_instance(CONTEXT_COURSE, $course->id);
        if (has_capability('gradereport/grader:view', $course_context) && has_capability('moodle/grade:viewall', $course_context)) {
            echo '<div class="allcoursegrades"><a href="' . $CFG->wwwroot . '/grade/report/grader/index.php?id=' . $course->id . '">'
                . get_string('seeallcoursegrades', 'grades') . '</a></div>';
        }
// (ここから追加)
        $link = $CFG->wwwroot.'/lib/fs_moodle/boneheadcheck.php?id='.$this->cm->id;
        echo '<div class="allcoursegrades"><a href="'.$link.'" target="_blank">明白な手抜きをチェックする</a></div><br />';
// (ここまで追加)

これで評定画面の右上にリンクが表示されます.これをクリックするとチェックした結果が表示されます.
 サーバがWindowsかつ課題のファイル名に日本語文字を含む場合は正しく動作しません.fs_moodle3.05.00を待つか,日本語ファイル名を含まない課題で動作確認を行って下さい.

 

Tatsuya Shirai への返信

Re: 公開します

- Tatsuya Shirai の投稿

 リンクを追加した画面です.

(画像ではfs_moodleで追加した”テキストファイルは~”と”全ての課題を~”が追加されています)

添付 boneheadcheckIF.jpg