예제 #1
0
 public function make()
 {
     $params = Input::all();
     $id = $params['item-id'];
     // 決定表作成時はmax_execution_timeの制限を外す
     set_time_limit(3000);
     // TODO: ファイル作成する部分。ファイル以外で実現したい
     //$file_name = 'drh.dat';
     $file_name = $id . '.dat';
     $fp = fopen('assets/dat/' . $file_name, 'w');
     // 酒のレビューを取得。現在はサンプルのレビューを使用。
     $reviews = Review::where('item_id', $id)->get();
     $last_result = array();
     /*-----------------------------------------
      * 形態素解析, 係受け構文解析
      *---------------------------------------*/
     foreach ($reviews as $review) {
         $params = array('type' => 'chunk', 'text' => $review->content);
         $yahoo_result = YahooApi::fetch($params);
         if ($yahoo_result === false) {
             continue;
         }
         $last_result = Chunk::getChunks($yahoo_result, $review->content, $review, $last_result, $review->is_bought);
     }
     /*-----------------------------------------
      * 類義語検索
      *---------------------------------------*/
     foreach ($last_result as $key => $value) {
         $s = explode(',', $value['info']);
         // 名詞が形容詞にかかっている場合
         if (preg_match('/.*?(名詞)/u', $s[2]) && preg_match('/.*?(形容|動詞)/u', $s[6])) {
             $adje = explode('-', $s[6]);
             // 品詞
             $pos = explode('-', $s[5]);
             // 単語
             $_adje = explode('-', $s[2]);
             // 品詞
             $_pos = explode('-', $s[1]);
             // 単語
             for ($i = 0; $i < count($_adje); $i++) {
                 $syno = null;
                 if (preg_match('/.*?(名詞)/u', $_adje[$i]) && count($_adje) > 1) {
                     if ($_adje[0] == '名詞' && $_adje[1] == '助動詞') {
                         $syno = Thesaurus::checkThesaurus($_pos[$i]);
                     }
                     $_ll_result = array();
                     if ($syno) {
                         $_ll_result['text'] = $syno['text'];
                         $_ll_result['rayer'] = $syno['rayer'];
                         $_ll_result['info'] = $value['info'];
                         $ll_result[trim($syno['text'])][] = $_ll_result;
                     }
                 }
             }
             for ($i = 0; $i < count($adje); $i++) {
                 $syno = null;
                 if (preg_match('/^(形容|動詞)/u', $adje[$i], $match)) {
                     // 形容詞が含まれていれば
                     if ($match[0] == '形容') {
                         $syno = Thesaurus::checkThesaurus($pos[$i]);
                         if ($syno && $syno->text == '無い') {
                             for ($j = 0; $j < count($_adje); $j++) {
                                 if ($_adje[$j] == '名詞') {
                                     $syno = Thesaurus::checkThesaurus($_pos[$i]);
                                 }
                             }
                         }
                     } else {
                         if ($match[0] == '動詞') {
                             $_syno = Thesaurus::checkThesaurus($pos[$i]);
                             if ($_syno && isset($pos[1])) {
                                 if (in_array($pos[0] . $pos[1], explode(',', $_syno->synonym))) {
                                     $syno = $_syno;
                                 }
                             }
                         }
                     }
                     if (!isset($syno)) {
                         break;
                     }
                     $_ll_result = array();
                     // もし同じような形容詞があれば1つにまとめていく
                     if ($syno) {
                         $_ll_result['text'] = $syno['text'];
                         $_ll_result['rayer'] = $syno['rayer'];
                         $_ll_result['info'] = $value['info'];
                         $ll_result[trim($syno['text'])][] = $_ll_result;
                     }
                 }
             }
             // for ($i = 0; $i < count($adje); $i++) {
             //     if (preg_match('/.*?(形容)/u', $adje[$i], $match)) { // 形容詞が含まれていれば
             //         $syno = Thesaurus::checkThesaurus($pos[$i]);
             //         $_ll_result = array();
             //         // もし同じような形容詞があれば1つにまとめていく
             //         if ($syno) {
             //             $_ll_result['text']  = $syno['text'];
             //             $_ll_result['rayer'] = $syno['rayer'];
             //             $_ll_result['info']  = $value['info'];
             //             $ll_result[trim($syno['text'])][] = $_ll_result;
             //         }
             //     }
             // }
         } else {
             if (preg_match('/.*?(副詞)/u', $s[2]) && preg_match('/.*?(名詞)/u', $s[6])) {
                 $adje = explode('-', $s[6]);
                 // 品詞
                 $pos = explode('-', $s[5]);
                 // 単語
                 $_adje = explode('-', $s[2]);
                 // 品詞
                 $_pos = explode('-', $s[1]);
                 // 単語
                 for ($i = 0; $i < count($adje); $i++) {
                     $syno = null;
                     if (preg_match('/.*?(名詞)/u', $adje[$i])) {
                         $syno = Thesaurus::checkThesaurus($pos[$i]);
                         $_ll_result = array();
                         if ($syno) {
                             $_ll_result['text'] = $syno['text'];
                             $_ll_result['rayer'] = $syno['rayer'];
                             $_ll_result['info'] = $value['info'];
                             $ll_result[trim($syno['text'])][] = $_ll_result;
                         }
                     }
                 }
             }
         }
     }
     // foreach ($last_result as $key => $value) {
     //     $s = explode(',', $value['info']);
     //     // 名詞が形容詞にかかっている場合
     //     if (preg_match('/.*?(名詞)/u', $s[2]) && preg_match('/.*?(形容)/u', $s[6])) {
     //         $adje = explode('-', $s[6]); // 品詞
     //         $pos = explode('-', $s[5]);  // 単語
     //         $_adje = explode('-', $s[2]); // 品詞
     //         $_pos = explode('-', $s[1]); // 単語
     //         for ($i = 0; $i < count($_adje); $i++) {
     //             if (preg_match('/.*?(名詞)/u', $_adje[$i])) {
     //                 $syno = Thesaurus::checkThesaurus($_pos[$i]);
     //                 $_ll_result = array();
     //                 if ($syno) {
     //                     $_ll_result['text'] = $syno['text'];
     //                     $_ll_result['rayer'] = $syno['rayer'];
     //                     $_ll_result['info'] = $value['info'];
     //                     $ll_result[trim($syno['text'])][] = $_ll_result;
     //                 }
     //             }
     //         }
     //         for ($i = 0; $i < count($adje); $i++) {
     //             if (preg_match('/.*?(形容)/u', $adje[$i])) { // 形容詞が含まれていれば
     //                 $syno = Thesaurus::checkThesaurus($pos[$i]);
     //                 $_ll_result = array();
     //                 // もし同じような形容詞があれば1つにまとめていく
     //                 if ($syno) {
     //                     $_ll_result['text']  = $syno['text'];
     //                     $_ll_result['rayer'] = $syno['rayer'];
     //                     $_ll_result['info']  = $value['info'];
     //                     $ll_result[trim($syno['text'])][] = $_ll_result;
     //                 }
     //             }
     //         }
     //     }
     // }
     /*-----------------------------------------
      * 感性ワードの出現率を検索する
      *---------------------------------------*/
     $all_review_count = $this->review_gestion->where('item_id', '=', $id)->count();
     // 全レビュー件数
     foreach ($ll_result as $key => $value) {
         $review_count = count($ll_result[$key]);
         $review_percents[$key] = $review_count / $all_review_count;
     }
     //        $all_review_count = 0; // 採用したレビュー件数
     //        foreach ($ll_result as $key => $value) {
     //            $review_counts[$key] = count($ll_result[$key]);
     //            $all_review_count += count($ll_result[$key]);
     //        }
     //        foreach ($review_counts as $key => $review_count) {
     //            $review_percents[$key] = $review_count/$all_review_count;
     //        }
     // 形を整える
     foreach ($review_percents as $key => $review_percent) {
         $review_percents[$key] = substr($review_percent * 100, 0, 4);
     }
     /*-----------------------------------------
      * 決定表を作成する
      *---------------------------------------*/
     $drh = Dr::getDRH($ll_result);
     /*-----------------------------------------
      * 属性値を出力する
      *---------------------------------------*/
     //属性値を出力する
     echo "#ATTRS" . PHP_EOL;
     fwrite($fp, "#ATTRS" . PHP_EOL);
     // TODO: ファイルへの書き込み
     foreach ($drh['attrs'] as $key => $val) {
         fwrite($fp, $key . " " . $val . PHP_EOL);
         // TODO: ファイルへ書き込み
         echo $key . " " . $val . PHP_EOL;
     }
     fwrite($fp, PHP_EOL);
     // TODO: ファイルへ書き込み
     echo PHP_EOL;
     /*-----------------------------------------
      * 付加情報の出力
      *---------------------------------------*/
     $si = 1;
     echo "#INFOATTRS" . PHP_EOL;
     fwrite($fp, "#INFOATTRS" . PHP_EOL);
     // TODO: ファイルへ書き込み
     foreach ($drh['drh'] as $key => $val) {
         echo $si . " " . $key;
         fwrite($fp, $si . " " . $key);
         // TODO: ファイルへ書き込み
         foreach ($val as $k => $v) {
             if ($k == 'drc') {
                 echo " " . $v;
                 fwrite($fp, " " . $v);
                 // TODO: ファイルへ書き込み
             } else {
                 if (isset($v['text'])) {
                     echo " " . $k . ":" . implode(',', $v['text']);
                     fwrite($fp, " " . $k . ":" . implode(',', $v['text']));
                     // TODO: ファイルへ書き込み
                 } else {
                     echo " " . "*";
                     fwrite($fp, " " . "*");
                     // TODO: ファイルへ書き込み
                 }
             }
         }
         echo PHP_EOL;
         fwrite($fp, PHP_EOL);
         // TODO: ファイルへ書き込み
         $si++;
     }
     echo PHP_EOL;
     /*-----------------------------------------
      * 決定表の出力
      *---------------------------------------*/
     echo "#DRH" . PHP_EOL;
     fwrite($fp, "#DRH" . PHP_EOL);
     // TODO: ファイルへ書き込み
     $si = 1;
     foreach ($drh['drh'] as $key => $val) {
         echo $si;
         fwrite($fp, $si);
         // TODO: ファイルへ書き込み
         $_sample = array();
         foreach ($val as $k => $v) {
             if ($k == 'drc') {
                 echo " " . $v;
                 fwrite($fp, " " . $v);
                 // TODO: ファイルへ書き込み
                 $dc[] = $v;
             } else {
                 echo " " . $k . $v['atr'];
                 fwrite($fp, " " . $k . $v['atr']);
                 // TODO: ファイルへ書き込み
                 $_sample[] = $k . $v['atr'];
             }
         }
         $sample[] = $_sample;
         echo PHP_EOL;
         fwrite($fp, PHP_EOL);
         // TODO: ファイルへ書き込み
         $si++;
     }
     echo PHP_EOL;
     fwrite($fp, PHP_EOL);
     // TODO: ファイルへ書き込み
     /*-----------------------------------------
      * 決定ルールの算出
      *---------------------------------------*/
     $MODE = "un_appro";
     //un_appro:下近似, up_appro:上近似
     Dr::setData($sample, $dc);
     /*(下/上)近似を求める//--------------------------------*/
     $appro = array();
     switch ($MODE) {
         case "un_appro":
             $appro = Dr::calUNAppro();
             break;
         case "up_appro":
             break;
     }
     /*//下近似を求める-------------------------------------*/
     /*-----------------------------------------
      * 決定行列の作成
      *---------------------------------------*/
     $d_matrix = Dr::getDecisionMatrix($appro, $sample, $dc);
     //決定行列からDR算出
     //注意:決定行列から算出したDRは矛盾を含む
     $drs = Dr::calDR($d_matrix);
     /*-----------------------------------------
      * CI値の算出の作成
      *---------------------------------------*/
     $ci = Dr::getCI($drs);
     /*-----------------------------------------
      * 結果の出力
      *---------------------------------------*/
     echo "#DR" . PHP_EOL;
     fwrite($fp, "#DR" . PHP_EOL);
     // TODO: ファイルへ書き込み
     foreach ($ci as $key => $val) {
         echo "DC:" . $key . PHP_EOL;
         fwrite($fp, "DC:" . $key . PHP_EOL);
         // TODO: ファイルへ書き込み
         foreach ($val as $k => $v) {
             echo $k . " CI=" . sprintf("%0.4f", $v['ci']) . " " . "[" . implode(',', $v['sample']) . "]" . PHP_EOL;
             fwrite($fp, $k . " CI=" . sprintf("%0.4f", $v['ci']) . " " . "[" . implode(',', $v['sample']) . "]" . PHP_EOL);
             // TODO: ファイルへ書き込み
         }
         echo PHP_EOL;
         fwrite($fp, PHP_EOL);
         // TODO: ファイルへ書き込み
     }
     /*-----------------------------------------
      * 共起頻度・強度算出
      *---------------------------------------*/
     $cmat = Match::calMatchCoef($drh['drh']);
     echo "#MATCHING" . PHP_EOL;
     fwrite($fp, "#MATCHING" . PHP_EOL);
     // TODO: ファイルへ書き込み
     foreach ($cmat as $key => $val) {
         echo "DC:" . $key . PHP_EOL;
         fwrite($fp, "DC:" . $key . PHP_EOL);
         // TODO: ファイルへ書き込み
         foreach ($val as $k => $v) {
             echo $k . " j:" . sprintf("%0.4f", $v["jaccard"]) . " d:" . sprintf("%0.4f", $v["daice"]) . " c:" . sprintf("%0.4f", $v["cosine"]) . " s:" . sprintf("%0.4f", $v["simpson"]) . " kl:" . sprintf("%0.4f", $v["kl"]) . PHP_EOL;
             fwrite($fp, $k . " j:" . sprintf("%0.4f", $v["jaccard"]) . " d:" . sprintf("%0.4f", $v["daice"]) . " c:" . sprintf("%0.4f", $v["cosine"]) . " s:" . sprintf("%0.4f", $v["simpson"]) . " kl:" . sprintf("%0.4f", $v["kl"]) . PHP_EOL);
         }
         echo PHP_EOL;
         fwrite($fp, PHP_EOL);
         // TODO: ファイルへ書き込み
     }
     /*-----------------------------------------
      * 感性ワードの出現率の出力(Relative Frequency)
      *---------------------------------------*/
     fwrite($fp, "#RF" . PHP_EOL);
     // TODO: ファイルへ書き込み
     foreach ($review_percents as $key => $review_percent) {
         fwrite($fp, $key . " " . $review_percent . PHP_EOL);
     }
 }
예제 #2
0
 public function getIndex()
 {
     // 酒のレビューを取得。現在はサンプルのレビューを使用。
     $reviews = Review::where('item_id', 41)->take(4)->get();
     $last_result = array();
     /*-----------------------------------------
      * 形態素解析, 係受け構文解析
      *---------------------------------------*/
     foreach ($reviews as $review) {
         $params = array('type' => 'chunk', 'text' => $review->content);
         $yahoo_result = YahooApi::fetch($params);
         if ($yahoo_result === false) {
             continue;
         }
         $last_result = Chunk::getChunks($yahoo_result, $review->content, $review, $last_result, $review->is_bought);
     }
     /*-----------------------------------------
      * 類義語検索
      *---------------------------------------*/
     foreach ($last_result as $key => $value) {
         $s = explode(',', $value['info']);
         // 名詞が形容詞にかかっている場合
         if (preg_match('/.*?(名詞)/u', $s[2]) && preg_match('/.*?(形容|動詞)/u', $s[6])) {
             $adje = explode('-', $s[6]);
             // 品詞
             $pos = explode('-', $s[5]);
             // 単語
             $_adje = explode('-', $s[2]);
             // 品詞
             $_pos = explode('-', $s[1]);
             // 単語
             // for ($i = 0; $i < count($_adje); $i++) {
             //     $syno = null;
             //     if (preg_match('/.*?(名詞)/u', $_adje[$i]) && count($_adje) > 1) {
             //         if ($_adje[0] == '名詞' && $_adje[1] == '助動詞') {
             //             $syno = Thesaurus::checkThesaurus($_pos[$i]);
             //             $_ll_result = array();
             //             if ($syno) {
             //                 $_ll_result['text'] = $syno['text'];
             //                 $_ll_result['rayer'] = $syno['rayer'];
             //                 $_ll_result['info'] = $value['info'];
             //                 $ll_result[trim($syno['text'])][] = $_ll_result;
             //             }
             //         }
             //     }
             // }
             for ($i = 0; $i < count($adje); $i++) {
                 $syno = null;
                 if (preg_match('/^(形容|動詞)/u', $adje[$i], $match)) {
                     // 形容詞が含まれていれば
                     if ($match[0] == '形容') {
                         $syno = Thesaurus::checkThesaurus($pos[$i]);
                         if ($syno && $syno->text == '無い') {
                             for ($j = 0; $j < count($_adje); $j++) {
                                 if ($_adje[$j] == '名詞') {
                                     $syno = Thesaurus::checkThesaurus($_pos[$i]);
                                 }
                             }
                         }
                     } else {
                         if ($match[0] == '動詞') {
                             $_syno = Thesaurus::checkThesaurus($pos[$i]);
                             if ($_syno && isset($pos[1])) {
                                 if (in_array($pos[0] . $pos[1], explode(',', $_syno->synonym))) {
                                     $syno = $_syno;
                                 }
                             }
                         }
                     }
                     if (!isset($syno)) {
                         break;
                     }
                     $_ll_result = array();
                     // もし同じような形容詞があれば1つにまとめていく
                     if ($syno) {
                         $_ll_result['text'] = $syno['text'];
                         $_ll_result['rayer'] = $syno['rayer'];
                         $_ll_result['info'] = $value['info'];
                         $ll_result[trim($syno['text'])][] = $_ll_result;
                     }
                 }
             }
         } else {
             if (preg_match('/.*?(副詞)/u', $s[2]) && preg_match('/.*?(名詞)/u', $s[6])) {
                 $adje = explode('-', $s[6]);
                 // 品詞
                 $pos = explode('-', $s[5]);
                 // 単語
                 $_adje = explode('-', $s[2]);
                 // 品詞
                 $_pos = explode('-', $s[1]);
                 // 単語
                 for ($i = 0; $i < count($adje); $i++) {
                     $syno = null;
                     if (preg_match('/.*?(名詞)/u', $adje[$i])) {
                         $syno = Thesaurus::checkThesaurus($pos[$i]);
                         $_ll_result = array();
                         if ($syno) {
                             $_ll_result['text'] = $syno['text'];
                             $_ll_result['rayer'] = $syno['rayer'];
                             $_ll_result['info'] = $value['info'];
                             $ll_result[trim($syno['text'])][] = $_ll_result;
                         }
                     }
                 }
             }
         }
     }
     echo '<pre>';
     var_dump($ll_result);
     echo '</pre>';
 }
예제 #3
0
 /**
  * If user selects Wordnet feature in page options then only
  * do WordNet processing. Also user has to specify the WordNet directory
  *
  * @param array $results document summaries
  * @param string $original_query the original query that we are computing
  *      results for
  * @param string $lang locale tag of query
  * @return array results document summaries sorted by wordnet score
  */
 function sortByThesaurusScore($results, $original_query, $lang)
 {
     $summaries = array();
     $pages = $results['PAGES'];
     foreach ($pages as $page) {
         $summaries[] = $page[self::DESCRIPTION];
     }
     $index_name = $this->index_name;
     $phrases = Thesaurus::getSimilarPhrases($original_query, $index_name, $lang);
     $results['THESAURUS_VARIANTS'] = $phrases;
     if (!empty($phrases)) {
         $thesaurus_scores = Thesaurus::scorePhrasesSummaries($phrases, $summaries);
         //Store the BM25 score for each page in result array
         $num_scores = count($thesaurus_scores);
         for ($i = 0; $i < $num_scores; $i++) {
             $pages[$i][self::THESAURUS_SCORE] = $thesaurus_scores[$i];
             orderCallback($pages[$i], $pages[$i], self::THESAURUS_SCORE);
         }
         if (array_sum($thesaurus_scores) != 0) {
             usort($pages, "orderCallback");
         }
         $results['PAGES'] = $pages;
     }
     return $results;
 }