Exemplo n.º 1
0
    function scope_consensus()
    {
        $title = __FUNCTION__;
        $this->_display_header($title);
        // ---------
        $social_function = array(0 => 0, 1 => 68.41493131999999, 2 => 82.31058928, 3 => 89.40518387, 4 => 91.31036774, 5 => 92.55095258999999, 7 => 94.7275144, 8 => 97.06468764, 9 => 1);
        /*$sentence_index = array(0,142,199,256,314,402,473,530,663,667,790,932,1035,1193,1255,1340,1419,1444,1463,1503,1564,1636,1664,1689,1716,1742,1871,1921,1989,2019,2108,2217,2295,2422,2557,2718,2791,2916,3032,3079,3146,3197,3213,3226,3239,3266,3313,3411,3604,3640,3854,3922,3980,4068,4082,4201,4285,4387,4497,4500,4526,4590,4653,4679,4727,4764,4796,4803,4812,4820,4829,4836,4845,4858,4893,4903,4913,4961,4969,5017,5044,5052,5120,5148,5156,5210,5279,5307,5316,5333,5384,5433,5529,5563,5595,5674,5718,5789,5854,5920,5955,5985,6027,6055,6090,6165,6238,6432,6520,6535,6553,6608,6639,6796,6836,7042,7046,7086,7104,7144,7246,7284,7292,7328,7361,7419,7427,7485,7564,7572,7607,7637,7724,7732,7821,7903,7969,7988,8065,8074,8166,8198,8233,8276,8368,8396,8549,8618,8648,8684,8743,8823,8857,8891,8920,8997,9025,9107,9118,9139,9153,9178,9187,9189,9199,9208,9211,9218,9247,9267,9275,9280,9283,9286,9290,9292,9299,9306,9313,9319,9334,9337,9350,9355,9358,9362,9370,9382,9385,9392,9401,9404,9408,9415,9421,9427,9439,9448,9451,9455,9462,9468,9495,9499,9505,9508,9511,9515,9529,9536,9557,9561,9568,9575,9582,9588,9598,9612,9615,9684,9736,9900,18,74,76,682,686,695,1266,1509,1748,2570,2805,3331,3422,3663,3737,3766,3774,4091,5226,5241,5324,5339,5443,5798,6180,6258,6289,6308,6319,6353,6654,6846,6893,6929,6970,6974,7158,7159,7166,7171,7207,7827,8280,9111,9617,9688,9711,9746,9762,9796,9816,9851,9873,9909);
          sort($sentence_index);
          echo '$sentence_index = array(';
          foreach ($sentence_index AS $s)
          {
              echo $s.',';
          }
          echo ');<br />';
           * 
           */
        $sentence_index = array(0, 18, 74, 76, 142, 199, 256, 314, 402, 473, 530, 663, 667, 682, 686, 695, 790, 932, 1035, 1193, 1255, 1266, 1340, 1419, 1444, 1463, 1503, 1509, 1564, 1636, 1664, 1689, 1716, 1742, 1748, 1871, 1921, 1989, 2019, 2108, 2217, 2295, 2422, 2557, 2570, 2718, 2791, 2805, 2916, 3032, 3079, 3146, 3197, 3213, 3226, 3239, 3266, 3313, 3331, 3411, 3422, 3604, 3640, 3663, 3737, 3766, 3774, 3854, 3922, 3980, 4068, 4082, 4091, 4201, 4285, 4387, 4497, 4500, 4526, 4590, 4653, 4679, 4727, 4764, 4796, 4803, 4812, 4820, 4829, 4836, 4845, 4858, 4893, 4903, 4913, 4961, 4969, 5017, 5044, 5052, 5120, 5148, 5156, 5210, 5226, 5241, 5279, 5307, 5316, 5324, 5333, 5339, 5384, 5433, 5443, 5529, 5563, 5595, 5674, 5718, 5789, 5798, 5854, 5920, 5955, 5985, 6027, 6055, 6090, 6165, 6180, 6238, 6258, 6289, 6308, 6319, 6353, 6432, 6520, 6535, 6553, 6608, 6639, 6654, 6796, 6836, 6846, 6893, 6929, 6970, 6974, 7042, 7046, 7086, 7104, 7144, 7158, 7159, 7166, 7171, 7207, 7246, 7284, 7292, 7328, 7361, 7419, 7427, 7485, 7564, 7572, 7607, 7637, 7724, 7732, 7821, 7827, 7903, 7969, 7988, 8065, 8074, 8166, 8198, 8233, 8276, 8280, 8368, 8396, 8549, 8618, 8648, 8684, 8743, 8823, 8857, 8891, 8920, 8997, 9025, 9107, 9111, 9118, 9139, 9153, 9178, 9187, 9189, 9199, 9208, 9211, 9218, 9247, 9267, 9275, 9280, 9283, 9286, 9290, 9292, 9299, 9306, 9313, 9319, 9334, 9337, 9350, 9355, 9358, 9362, 9370, 9382, 9385, 9392, 9401, 9404, 9408, 9415, 9421, 9427, 9439, 9448, 9451, 9455, 9462, 9468, 9495, 9499, 9505, 9508, 9511, 9515, 9529, 9536, 9557, 9561, 9568, 9575, 9582, 9588, 9598, 9612, 9615, 9617, 9684, 9688, 9711, 9736, 9746, 9762, 9796, 9816, 9851, 9873, 9900, 9909);
        $this->load->library('search/Search_annotation_user_collection');
        $this->load->library('search/Search_annotation_id_collection');
        $query = $this->db->select('"user".user_id, email, annotation.annotation_id, score')->from('annotation
, "user", webpage2annotation, score')->where('annotation.user_id = "user".user_id
AND webpage2annotation.annotation_id = annotation.annotation_id
AND webpage_id = ' . $this->obs_webpage_id . '
AND annotation.topic_id IS NULL
AND annotation.deleted IS FALSE
AND annotation.create_timestamp > \'' . $this->obs_date_from . '\'
AND annotation.create_timestamp < \'' . $this->obs_date_to . '\'
AND score.annotation_id = annotation.annotation_id
AND score.score_type_id = 1')->where('email ' . $this->in_email)->order_by('email')->get();
        $consensus_count = array();
        $annotation_count = array();
        $consensus_max = array();
        $consensus_min = array();
        $total_count = 0;
        $total_annotation_count = 0;
        $total_max = 0;
        $total_min = NULL;
        $freq_count = array();
        $freq_total = 0;
        $comp_count = array();
        $comp_total = 0;
        $thead = array('受試者', '閱讀理解分數', '閱讀理解分數高低分組_1低_2高', '標註編號', '標註範圍共識', '專家調查', '加權社群行為', '範圍位置', '以句為單位的共識次數');
        $tbody = array();
        foreach ($query->result_array() as $row) {
            $email = $row['email'];
            $annotation_id = intval($row['annotation_id']);
            $annotation = new Annotation($annotation_id);
            $count = $annotation->get_consensus_count();
            /**
             * 來計算以句子為單位的共識
             * @author Pudding Chen 20121228
             */
            //取得標註的位置
            $scopes = $annotation->get_scopes();
            foreach ($scopes as $scope) {
                $from_index = intval($scope->get_from_index());
                $to_index = intval($scope->get_to_index());
            }
            //擴張標註的位置
            $sentence_from_index = null;
            $sentence_to_index = null;
            $last_s_index = 0;
            //if ($from_index != 1)
            //    continue;
            foreach ($sentence_index as $s => $s_index) {
                //先判斷句子開頭
                if (is_null($sentence_from_index)) {
                    if ($from_index == 0) {
                        $sentence_from_index = 0;
                    } else {
                        if ($from_index < $s_index) {
                            $sentence_from_index = $last_s_index;
                        }
                    }
                }
                if ($to_index < $s_index) {
                    //echo $to_index.'-'.$s_index.'!<br />';
                    //{
                    //$set_next_s_index = true;
                    //$sentence_to_index = $last_s_index;
                    $sentence_to_index = $s_index;
                    break;
                    //}
                }
                //echo '['.$s.":".$from_index.'-'.$to_index.'-'.$s_index.'-'.$last_s_index.'|'.$sentence_from_index.'-'.$sentence_to_index.'?'.($sentence_from_index == null).'-'.($to_index < $s_index).']<br />';
                $last_s_index = $s_index;
            }
            //找完了,範圍是
            //$sentense_from_index
            //$sentense_to_index
            //建立搜尋範圍
            $s = new Annotation_scope();
            //$s->set_index($sentence_from_index, $sentence_to_index);
            $s->set_index($from_index, $to_index);
            $s->set_webpage($this->obs_webpage_id);
            $sentence_search_scope = new Annotation_scope_collection();
            $sentence_search_scope->add_scope($s);
            //echo $sentence_search_scope->length().'-'.$this->obs_webpage_id.'|';
            $sentence_consensus_count = '--';
            //if ($from_index == 1)
            //{
            $search = new Search_annotation_user_collection();
            //只算人頭
            $search->set_check_authorize(false);
            $search->set_limit(NULL);
            $search->set_overlap_scope($sentence_search_scope);
            $search->set_exclude_annotation($annotation_id);
            $search->set_exclude_user($annotation->get_user());
            $search->set_target_newer_create($this->obs_epoch_from);
            $search->set_target_older_create($this->obs_epoch_to);
            $search->set_target_topic(true);
            $sentence_consensus_count = $search->length();
            /*
                            $this->unit->run($search->length()
                            , 0
                            , '測試搜尋 '. $annotation_id . ': '. $sentence_from_index.'-'.$from_index.'-'.$to_index.'-'.$sentence_to_index);
            */
            /*
                        }
                        else
                        {
                            //continue;
                        }*/
            if (isset($consensus_count[$email]) == false) {
                $consensus_count[$email] = 0;
                $annotation_count[$email] = 0;
                $consensus_max[$email] = 0;
                $consensus_min[$email] = $count;
            }
            $annotation_count[$email]++;
            $consensus_count[$email] += $count;
            if ($count > $consensus_max[$email]) {
                $consensus_max[$email] = $count;
            }
            if ($count < $consensus_min[$email]) {
                $consensus_min[$email] = $count;
            }
            $total_annotation_count++;
            $total_count += $count;
            if ($count > $total_max) {
                $total_max = $count;
            }
            if ($total_min == NULL || $count < $total_min) {
                $total_min = $count;
            }
            //次數與加權次數
            if (isset($comp_count[$count]) == FALSE) {
                $freq_count[$count] = 0;
                $comp_count[$count] = 0;
            }
            $freq_count[$count]++;
            $comp_count[$count] += $this->obs_mix_score[$email];
            $freq_total++;
            $comp_total += $this->obs_mix_score[$email];
            $tbody[] = array($email . '(' . $row['user_id'] . ')', $this->obs_mix_score[$email], $this->obs_group[$email], $annotation_id, $count, $row['score'], $social_function[$count], $sentence_from_index . '-' . $from_index . '-' . $to_index . '-' . $sentence_to_index, $sentence_consensus_count);
        }
        //unit_test_report($this);
        $this->_display_body('標註與標註範圍共識列表', $thead, $tbody);
        // ----------------------------
        $thead = array('標註範圍共識人數', '次數', '次數百分比_除以' . $freq_total . '', '累加次數', '累加次數百分比_除以' . $freq_total . '', '加權次數', '加權次數百分比_除以' . $comp_total . '', '累加加權次數', '累加加權次數百分比_除以' . $comp_total . '');
        $freq_plus = 0;
        $comp_plus = 0;
        ksort($freq_count);
        $tbody = array();
        foreach ($freq_count as $consensus => $freq) {
            $comp_freq = $comp_count[$consensus];
            $tbody[] = array($consensus, $freq, $freq / $freq_total * 100, $freq_plus, $freq_plus / $freq_total * 100, $comp_freq, $comp_freq / $comp_total * 100, $comp_plus, $comp_plus / $comp_total * 100);
            $freq_plus += $freq;
            $comp_plus += $comp_freq;
        }
        $this->_display_body('標註範圍共識次數分配表', $thead, $tbody);
        $this->_display_hr();
        return;
        // ----------------------------
        $thead = array('使用者', '標註次數', '共識次數累積質', '共識次數平均值', '共識次數最大值', '共識次數最小值');
        $tbody = array();
        foreach ($this->obs_email as $email) {
            $a_count = 0;
            if (isset($annotation_count[$email])) {
                $a_count = $annotation_count[$email];
            }
            $c_count = 0;
            if (isset($consensus_count[$email])) {
                $c_count = $consensus_count[$email];
            }
            $max = 0;
            if (isset($consensus_max[$email])) {
                $max = $consensus_max[$email];
            }
            $min = 0;
            if (isset($consensus_min[$email])) {
                $min = $consensus_min[$email];
            }
            $tbody[] = array($email, $a_count, $c_count, $c_count / $a_count, $max, $min);
        }
        $tbody[] = array('整體', $total_annotation_count, $total_count, $total_count / $total_annotation_count, $total_max, $total_min);
        $this->_display_body('標註範圍共識統計(以受試者為單位)', $thead, $tbody);
        // ------------------------------------------------------
        //select from_index, to_index
        //from annotation join annotation2scope using (annotation_id)
        //, scope
        //, webpage2annotation
        //where webpage2annotation.webpage_id = 1142
        //and scope.scope_id = annotation2scope.scope_id
        //and webpage2annotation.annotation_id = annotation.annotation_id
        //order by from_index
        $query = $this->db->select('from_index, to_index')->from('annotation join annotation2scope using (annotation_id)
, scope
, webpage2annotation
, "user"')->where('webpage2annotation.webpage_id = ' . $this->obs_webpage_id . '
and scope.scope_id = annotation2scope.scope_id
and webpage2annotation.annotation_id = annotation.annotation_id
AND annotation.topic_id IS NULL
AND annotation.deleted IS FALSE
and "user".user_id = annotation.user_id
AND annotation.create_timestamp > \'' . $this->obs_date_from . '\'
AND annotation.create_timestamp < \'' . $this->obs_date_to . '\'')->where('email ' . $this->in_email)->get();
        $scope_count = array();
        $paragraph_count = array();
        $annotation_count = 0;
        foreach ($query->result_array() as $row) {
            $annotation_count++;
            $from_index = intval($row['from_index']);
            $to_index = intval($row['to_index']);
            for ($i = $from_index; $i < $to_index + 1; $i++) {
                if (isset($scope_count[$i]) == false) {
                    $scope_count[$i] = 0;
                }
                $scope_count[$i]++;
            }
            foreach ($this->paragraph_scope as $para_id => $para_scope) {
                if ($this->in_scope($para_scope, $from_index, $to_index)) {
                    if (isset($paragraph_count[$para_id]) == FALSE) {
                        $paragraph_count[$para_id] = 0;
                    }
                    $paragraph_count[$para_id]++;
                    break;
                } else {
                    if ($this->from_in_scope($para_scope, $from_index, $to_index) || $this->at_scope($para_scope, $from_index, $to_index)) {
                        if (isset($paragraph_count[$para_id]) == FALSE) {
                            $paragraph_count[$para_id] = 0;
                        }
                        $paragraph_count[$para_id]++;
                    } else {
                        if ($this->to_in_scope($para_scope, $from_index, $to_index)) {
                            if (isset($paragraph_count[$para_id]) == FALSE) {
                                $paragraph_count[$para_id] = 0;
                            }
                            $paragraph_count[$para_id]++;
                            break;
                        }
                    }
                }
            }
        }
        $consensus_count = array();
        foreach ($scope_count as $index => $count) {
            if (isset($consensus_count[$count]) == false) {
                $consensus_count[$count] = 0;
            }
            $consensus_count[$count]++;
        }
        //幫排序
        krsort($consensus_count);
        $title1 = '標註範圍共識次數分配表';
        $thead = array('共識次數', '文字長度', '累積文字長度', '佔文章比率', '累積佔文章比率');
        $tbody = array();
        $accumulate_length = 0;
        $accumulate_rate = 0;
        foreach ($consensus_count as $count => $length) {
            $accumulate_length = $accumulate_length + $length;
            $accumulate_rate = $accumulate_rate + $length / $this->text_length;
            $tbody[] = array($count, $length, $accumulate_length, $length / $this->text_length, $accumulate_rate);
        }
        $tbody[] = array(0, $this->text_length - $accumulate_length, $this->text_length, 1 - $accumulate_rate, 1);
        $this->_display_body($title1, $thead, $tbody);
        // -------------------------------------
        $title2 = '標註段落分配表';
        $thead = array('段落編號', '段落標題', '標註次數', '比率');
        $tbody = array();
        foreach ($this->paragraph_scope as $para_id => $para_scope) {
            $count = 0;
            if (isset($paragraph_count[$para_id])) {
                $count = $paragraph_count[$para_id];
            }
            $tbody[] = array($para_scope[2], $para_scope[3], $count, $count / $annotation_count);
        }
        $this->_display_body($title2, $thead, $tbody);
        $this->_display_footer();
    }
Exemplo n.º 2
0
 public function get_consensus_count()
 {
     $this->_CI_load('library', 'search/Search_annotation_user_collection', 'search_annoation_user_collection');
     $type = 'Search_annotation_user_collection';
     $key = $this->get_id() . '_annotation_get_consensus_count';
     $value = $this->get_id();
     $search = get_cache($type, $key, $value);
     if (is_null($search)) {
         //$search = new Search_annotation_id_collection();
         $search = new Search_annotation_user_collection();
         //只算人頭
         $search->set_check_authorize(false);
         $search->set_limit(NULL);
         $search->set_target_scope($this->scope_coll);
         $search->set_exclude_annotation($this->get_id());
         //排除自己的
         $search->set_exclude_user($this->get_user());
         //回應也算是在範圍共識裡面喔!
         set_cache($search, $key, $value);
     }
     return $search->length();
 }