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); } }
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>'; }
/** * 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; }