評価の高い投稿を検索するフォーラム検索のオプションが欲しい

評価の高い投稿を検索するフォーラム検索のオプションが欲しい

- Tatsuya Shirai の投稿
返信数: 9

 現在,星の数でフォーラムへの投稿を(設定すれば)評価できます.

 フォーラムの検索オプションにこの星の数(=,≠,≧,≦)を追加できないでしょうか.情報の価値の高い投稿(たとえば,まとめに相当する投稿)を探し出すといったことができるでしょう.

 あるいは星の数を何らかのカテゴリーのように運用すると内部で決めた場合は,特定の投稿のみをリストアップすることができます.

 もしかして現状で既に実装されている機能でしょうか?

#星の数は評価した人々の平均点,なのかも知れませんが,重要な情報を探し出す手掛かりになり得ます.

Tatsuya Shirai への返信

Re: 評価の高い投稿を検索するフォーラム検索のオプションが欲しい

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators
> もしかして現状で既に実装されている機能でしょうか?

まだ、実装されていないと思います。

ちなみに、Using Moodleでは「お役立ち度 (usefullne)」の評価によって、「Particularly helpful Moodlers」グループに入るかどうか自動的に判定されています。

Particularly helpful Moodlers

These people have written a lot of "useful" posts in the Using Moodle forums recently, as determined by the Moodle community when they rate posts.

The formula is currently:

  • Must have posted something in the past 90 days
  • Must have been rated 13 or more times on the 7-point usefulness scale, by more than 8 raters
  • Must have an average usefulness rating greater than 5 out of 7 stars.


Mitsuhiro Yoshida への返信

Re: 評価の高い投稿を検索するフォーラム検索のオプションが欲しい

- Tatsuya Shirai の投稿

 なるほど.Using Moodleではそういう用途があの星の評価にはあったのですね.
 でもせっかくの評価のシステムですから,使わない手は無いですね.時間ができたら考えて見ましょう.(査読の締切りが迫っているので,8月に入ってから?)


 fj.jokes のようなフォーラムをコースに一つ作ると学生がMoodleを活発に使ってくれるかな?などと不真面目なことも考えています満面の笑顔

#「ばかウケ間違いなし」なジョーク集が簡単に作れる...eラーフィング?

 どうもMoodleを典型的なeラーニングシステムとして使おう,という意気込みが私には欠けている.だから長続きしているのかな?

Tatsuya Shirai への返信

学生による教師の投稿(ジョーク)の評価

- Tatsuya Shirai の投稿

 明るく楽しい学校”表”サイトを目指し,コース上にジョーク専用フォーラムを作成しました.評定尺度に「面白さの度合い」を追加し,「不謹慎」から「バカウケ」まで5段階評価できるようにしました.そのままでは学生はフォーラムの投稿を評価できませんので,フォーラムのパーミッションのオーバーライドで,Studentも評価を可能にしました.

 ところが教師(正確には管理者)である私の投稿を学生は評価できません.こういう仕様なのでしょうか?

 もし仕様ならば「誰の投稿でも評価できる」といったパーミッションの追加をTrackerに要望します.当面は学生ロールの別アカウントでログインし直してフォーラムへ投稿するという面倒な手段しか思いつきません.

#さっそく投稿してくれた学生がいたのですが...私からの評価は「修行が足りない」.

Tatsuya Shirai への返信

試しに実装してみました

- Tatsuya Shirai の投稿

 フォーラムの高度な検索に「少なくとも評価の一つがこの値以上」という項目を追加してみました.

 なんとなく回りくどい表現には訳があります.最初は評価(mdl_forum_ratings)の平均値(function forum_get_ratings_mean()を使ってpost idから取得できる)がある値以上ならば,という実装を試みたのですが,SQLでどう表現したら良いのか分かりませんでした.get_record()で取得した後に平均値が指定した値よりも小さい場合は取り除く,という実装を行ったのですがあまり宜しくない.簡単に言うと,検索結果を1画面に表示する件数が決まっています.それを越えると次のページに,と.何ページ目の検索結果を取得するのか,はget_record()で検索する際に指定しなくてはなりませんので,検索後に条件を満たさない検索結果を取り除いていくと,真っ白いページができてしまいます(分かり難いですね...)

 フォーラムの検索では,mdl_forum_post, mdl_forum_discussion, mdl_userをFROMに指定しています.これにmdl_forum_ratingsを追加し,mdl_forum_postのidと一致するmdl_forum_raginsのpostが存在し,かつその値が指定した値よりも大きければOKとしました.一つの投稿をある人は1と評価し,別の人が5と評価していたとします.閾値を3(5でも良いですが)とした場合に,たとえ1と評価した人がいても,別の人が5(3以上)と評価しているならば検索結果に含まれます.

 まだ試験中ですが,一応,まともに動いているようです(Moodle1.9.4+).

 この機能の目的は以前にも述べたように,「山のような投稿の中から価値のある情報を探し出し易くする」ことです.興味のある方は以降に提示する修正を行なって試して見て下さい.

#次に公開するfs_moodle(3.12.00?)には標準で組み込みます.

ちなみに「この固有IDの投稿にジャンプ」も新しく追加した機能です.以前に吉田さんが教えてくれた一つ一つの投稿に固有の番号(post id)を追加表示する,という改良をさらに有効活用するためのものです.固有の番号を入力するとその投稿に一気にジャンプ(リダイレクト)します.これもなかなか便利.

添付 forum_ratings.jpg
Tatsuya Shirai への返信

Re: 試しに実装してみました

- Tatsuya Shirai の投稿

 修正箇所はmod/forum/search.phpとmod/forum/lib.phpの二つのソース.まずは,mod/forum/search.phpです.

(a) パラメータの取得

    if ($timetorestrict) {
        $dateto = make_timestamp($toyear, $tomonth, $today, $tohour, $tominute);
    } else {
        $dateto = optional_param('dateto', 0, PARAM_INT);      // Ending date
    }
// (Shirai118): ここから追加
    if (($ratingmin = optional_param('ratingmin', 0, PARAM_INT)) <= 0) $ratingmin = '';  // 評価の最小値
// (Shirai118): ここまで追加

(b) サーチ文字列の追加

    if (empty($search)) {   // Check the other parameters instead
        if (!empty($words)) {
            $search .= ' '.$words;
        }

(中略)

        if (!empty($dateto)) {
            $search .= ' dateto:'.$dateto;
        }
// (Shirai118): ここから追加
        if (!empty($ratingmin)) {
            if (empty($search)) {
                $dateto = time()+3600;
                $search .= ' dateto:'.$dateto;       
            }
            $search .= ' ratingmin:'.$ratingmin;
        }
// (Shirai118): ここまで追加
        $individualparams = true;
    } else {
        $individualparams = false;
    }

(c) 検索(リダイレクト)

    $strforums = get_string("modulenameplural", "forum");
    $strsearch = get_string("search", "forum");
    $strsearchresults = get_string("searchresults", "forum");
    $strpage = get_string("page");

// (Shirai118): フォーラム投稿のサーチ機能を強化するいくつかの機能拡張 (2009/02/12)
// (Shirai118): ここから追加
    if (!empty($uniqueid)) {
        if (($mydiscussion = forum_get_discussion_post_id($uniqueid)) && count($mydiscussion) == 1) {
            $mydiscussionid = array_shift($mydiscussion);
            $mydiscussionid = $mydiscussionid->discussion;
            $redirecturl = $CFG->wwwroot.'/mod/forum/discuss.php?d='.$mydiscussionid.'#'.$uniqueid;
            redirect($redirecturl);
        }
    }
// (Shirai118): ここまで追加
    if (!$search || $showform) {

(d) リンクの追加

    echo '<div class="reportlink">';
    echo '<a href="search.php?id='.$course->id.
                             '&amp;user='.urlencode($user).
                             '&amp;userid='.$userid.
                             '&amp;forumid='.$forumid.
                             '&amp;subject='.urlencode($subject).
                             '&amp;phrase='.urlencode($phrase).
                             '&amp;words='.urlencode($words).
                             '&amp;fullwords='.urlencode($fullwords).
                             '&amp;notwords='.urlencode($notwords).
                             '&amp;dateto='.$dateto.
                             '&amp;datefrom='.$datefrom.
                             '&amp;showform=1'.
// (Shirai118): フォーラム投稿のサーチ機能を強化するいくつかの機能拡張 (2009/02/12)
// (Shirai118): ここから追加
                             '&amp;ratingmin='.$ratingmin.
// (Shirai118): ここまで追加
                             '">'.get_string('advancedsearch','forum').'...</a>';
    echo '</div>';

(e1) function forum_print_big_search_form()の頭

function forum_print_big_search_form($course) {
    global $CFG, $words, $subject, $phrase, $user, $userid, $fullwords, $notwords, $datefrom, $dateto;
// (Shirai118): フォーラム投稿のサーチ機能を強化するいくつかの機能拡張 (2009/02/12)
// (Shirai118): ここから追加
    global $uniqueid, $ratingmin;
// (Shirai118): ここまで追加

    print_simple_box(get_string('searchforumintro', 'forum'), 'center', '', '', 'searchbox', 'intro');

(e2) function forum_print_big_search_form()のフォームの追加

    echo '<tr>';
    echo '<td class="c0"><label for="user">'.get_string('searchuser', 'forum').'</label></td>';
    echo '<td class="c1"><input type="text" size="35" name="user" id="user" value="'.s($user, true).'" alt="" /></td>';
    echo '</tr>';
// (Shirai118): フォーラム投稿のサーチ機能を強化するいくつかの機能拡張 (2009/02/12)
// (Shirai118): ここから追加
    if (enable_forum_exsearch()) {
        echo '<tr>';
        echo '<td class="c0"><label for="ratingmin">'.get_string('searchratingmin', 'fs_moodle').'</label></td>';
        echo '<td class="c1"><input type="text" size="35" name="ratingmin" id="ratingmin" value="'.s($ratingmin, true).'" alt="" /></td>';
        echo '</tr>';
        echo '<tr><td><hr /></td><td><hr /></td></tr>';
        echo '<tr>';
        echo '<td class="c0"><label for="uniqueid">'.'少なくとも評価の一つがこの値以上'.'</label></td>';
        echo '<td class="c1"><input type="text" size="35" name="uniqueid" id="uniqueid" value="'.s($uniqueid, true).'" alt="" /></td>';
        echo '</tr>';
    }
// (Shirai118): ここまで追加


    echo '<tr>';
    echo '<td class="submit" colspan="2" align="center">';

Tatsuya Shirai への返信

Re: 試しに実装してみました

- Tatsuya Shirai の投稿

 これがmod/forum/lib.phpの修正箇所です.

(a1) function forum_search_posts()

    $messagesearch = '';
    $searchstring = '';

    // Need to concat these back together for parser to work.
    foreach($searchterms as $searchterm){
// (Shirai118): ここから追加
        if (strcasecmp($searchterm, 'ratingmin') > 0) {
            $ratingmin = substr($searchterm, 10);
            continue;
        }
// (Shirai118): ここまで追加

        if ($searchstring != '') {
            $searchstring .= ' ';
        }
        $searchstring .= $searchterm;
    }

(a2) function forum_search_posts()

// (Shirai118): ここからコメントアウト
//
  $fromsql = "{$CFG->prefix}forum_posts p,
//                {$CFG->prefix}forum_discussions d,
//                {$CFG->prefix}user u";
// (Shirai118): ここから追加
    if (empty($ratingmin)) {
        $fromsql = "{$CFG->prefix}forum_posts p,
                      {$CFG->prefix}forum_discussions d,
                      {$CFG->prefix}user u";
    } else {
        $fromsql = "{$CFG->prefix}forum_posts p,
                      {$CFG->prefix}forum_ratings r,
                      {$CFG->prefix}forum_discussions d,
                      {$CFG->prefix}user u";
        $extrasql .= "AND (p.id = r.post
               AND     r.rating >= $ratingmin)";
    }
// (Shirai118): ここまで追加

    $selectsql = " $messagesearch
               AND p.discussion = d.id
               AND p.userid = u.id
               AND $selectdiscussion
                   $extrasql";

Tatsuya Shirai への返信

Re: 試しに実装してみました

- Tatsuya Shirai の投稿

 評価の値以外に検索項目を入力しないとエラーになりますので,もし評価以外が入力されていない場合は「この日付よりも新しい」($dateto)を現時刻+1時間後に強制的に設定しています.1時間後に設定するのはオリジナルの真似です.

 ちなみに固有のIDの投稿にジャンプする機能は上記の差分には含めていません.ゴチャゴチャになってしまうので.

#MySQLの参考書を片手にSQLを調べながら書いたので,少し自信がありません^^;

Tatsuya Shirai への返信

mod/forum/lib.phpに間違いがありました

- Tatsuya Shirai の投稿

 すみません,チェック不足でした.

 mod/forum/lib.phpにミスがありました.

 これがmod/forum/lib.phpの修正箇所です.

(a1) function forum_search_posts()

    $messagesearch = '';
    $searchstring = '';

    // Need to concat these back together for parser to work.
    foreach($searchterms as $searchterm){
// (Shirai118): ここから追加
        if (strncasecmp($searchterm, 'ratingmin', 10) == 0) {
            $ratingmin = substr($searchterm, 10);
            continue;
        }
// (Shirai118): ここまで追加

        if ($searchstring != '') {
            $searchstring .= ' ';
        }
        $searchstring .= $searchterm;
    }

青で示した箇所です.こちらが正しいものです.

Tatsuya Shirai への返信

Re: 試しに実装してみました

- Tatsuya Shirai の投稿

#以前の書き込みで,mdl_forum_post, mdl_forum_discussionとあるのは,それぞれmdl_forum_posts, mdl_forum_discussionsの間違いでした.

 mdl_forum_postsとmdl_forum_ratingsが別々のテーブルなのは仕方が無いのですが,mdl_forum_postsにはtotalscoreという項目しかありません.しかも私のMoodleサイトのデータベースで調べた限りでは全て0ですし,ソースの方でも$post->totalscoreなり,totalscoreを扱っている箇所はinstallとbackupとrestoreにしか見当たりません.将来的に評価を元にして点数を入れる予定なのでしょうか?

 もしmdl_forum_postsに評価の平均値と最大値/最小値が記録されていると評価を用いたフォーラムの検索がもう少し便利になるのですけれども.評価を誰かがある投稿に対して行う度に,mdl_forum_ratingsを検索して平均値,最大値,最小値を再計算して値を更新するのは難しく無いと思うのですけれどもねぇ.(さすがにデータベースの構造に手を加える自信はありませんので,本家での対応に期待したい)

 もう少しこの機能を使ってみて便利そうだなと思ったらTrackerに提案してみます.もしかしたらMoodle2.0では有効活用されている可能性もありますので,その調査の後になるでしょうか.(3月中にMoodle2.0の調査を行ないます)