Example #1
0
 public function combineCommonUnits($results, $units_set, $urls_count)
 {
     $lemmatizator = new Lemmatizator();
     $combined_result = [];
     $entries_sums = [];
     //is neccessary for bodies counting
     $zones = $this->allZones();
     $queries = array_keys($results);
     $counter = new Counter();
     foreach ($zones as $zone) {
         foreach ($units_set as $unit) {
             foreach ($queries as $query) {
                 if (isset($results[$query][$zone][$unit])) {
                     $combined_result[$zone][$unit]['entries'][] = $results[$query][$zone][$unit];
                     //count sums for bodies counting
                     if ($zone != 'title') {
                         //titles are not included in bodies counting
                         foreach ($results[$query][$zone][$unit] as $url_num => $entry_count) {
                             $entries_sums[$unit][$query][$url_num] = isset($entries_sums[$unit][$query][$url_num]) ? $entries_sums[$unit][$query][$url_num] + $entry_count : $entry_count;
                         }
                     }
                     //get the averages array only for those sets which has been realy counted for entries
                     $combined_result[$zone][$unit]['average'][] = $counter->getAverage($results[$query][$zone][$unit]);
                 } else {
                     //make the false sets of entries for those which have not been realy counted for entries
                     $combined_result[$zone][$unit]['entries'][] = array_fill(0, $urls_count[$query], 0);
                 }
             }
         }
     }
     // correct the extra FORMs
     //========================
     //get the list of 'asis' units from units list
     //use the fact that we need those which have not no FORMs form right after the asis form
     $asis_to_correct_set = [];
     foreach ($units_set as $key => $unit) {
         if (strpos($unit, 'FORMS') === false && (!isset($units_set[$key + 1]) || strpos($units_set[$key + 1], 'FORMS') === false)) {
             $asis_to_correct_set[] = $unit;
         }
     }
     //get the list of FORMs units that should be corrected
     //to do this proceed each from asis list with makeUnitNormal function
     $forms_to_correct_set = [];
     foreach ($asis_to_correct_set as $asis) {
         $asis_normal = $lemmatizator->makeUnitNormal($asis);
         $asis_normal .= " - FORMS";
         $forms_to_correct_set[$asis_normal][] = $asis;
     }
     //make the array FORMs-unit => all it's asis units
     foreach (array_keys($forms_to_correct_set) as $asis_normal) {
         $more_key = array_search($asis_normal, $units_set);
         array_unshift($forms_to_correct_set[$asis_normal], $units_set[$more_key - 1]);
     }
     //prepare factors and divider data for each FORMs-unit (with zone)
     $correct_factors = [];
     foreach (array_keys($forms_to_correct_set) as $form) {
         foreach ($zones as $zone) {
             $correct_factors[$zone][$form]['divider'] = count($combined_result[$zone][$form]['average']);
             foreach ($forms_to_correct_set[$form] as $asis) {
                 $correct_factors[$zone][$form]['factors'][$asis] = $correct_factors[$zone][$form]['divider'] - count($combined_result[$zone][$asis]['average']);
             }
         }
     }
     //not the end of correctness procedure -> to be continued
     //=======================================================
     //start the combine averages procedure
     foreach ($zones as $zone) {
         foreach ($units_set as $unit) {
             $entries_flattened = [];
             foreach ($combined_result[$zone][$unit]['entries'] as $arr) {
                 $entries_flattened = array_merge($entries_flattened, $arr);
             }
             // file_put_contents(storage_path("tmp/results.txt"), print_r($combined_result['plain']['КОШКА - FORMS'], true),FILE_APPEND);//FOR TESTING !!!
             $combined_result[$zone][$unit]['average'] = $counter->getAverage($combined_result[$zone][$unit]['average']);
             $combined_result[$zone][$unit]['entries'] = $entries_flattened;
         }
     }
     //end of combine averages procedure
     //==================================
     //continue the correctness procedure
     //get the amendment for each zone-FORMSunit
     foreach (array_keys($forms_to_correct_set) as $form) {
         foreach ($zones as $zone) {
             $dividend = 0;
             foreach ($forms_to_correct_set[$form] as $asis) {
                 $summand = $correct_factors[$zone][$form]['factors'][$asis] * $combined_result[$zone][$asis]['average'];
                 $dividend += $summand;
             }
             $correct_factors[$zone][$form]['amendment'] = -1.0 * round($dividend / $correct_factors[$zone][$form]['divider'], 0, PHP_ROUND_HALF_UP);
         }
     }
     //correct the averages in combined result
     foreach ($correct_factors as $zone => $form_array) {
         foreach ($form_array as $form => $factors_array) {
             $combined_result[$zone][$form]['average'] += $factors_array['amendment'];
             if ($combined_result[$zone][$form]['average'] < 0) {
                 $combined_result[$zone][$form]['average'] = 0;
             }
         }
     }
     //start the bodies count procedure
     //================================
     $bodies = [];
     foreach ($entries_sums as $unit => $query_sums) {
         $bodies[$unit] = [];
         foreach ($query_sums as $query => $sums) {
             $bodies[$unit] = array_merge($bodies[$unit], $sums);
         }
         $bodies[$unit] = $counter->getAverage($bodies[$unit]);
         // $body_amendment = 0;
         foreach ($zones as $zone) {
             if ($zone != 'title') {
                 // $bodies[$unit] = $bodies[$unit];
                 $bodies[$unit] = $bodies[$unit] - $combined_result[$zone][$unit]['average'];
             }
         }
         //get the average amendment from all zones
         foreach ($correct_factors as $zone => $form_array) {
             if (isset($correct_factors[$zone][$unit]) && $zone != 'title') {
                 $body_amendment = isset($body_amendment) ? $body_amendment += $correct_factors[$zone][$unit]['amendment'] : $correct_factors[$zone][$unit]['amendment'];
             }
         }
         // $body_amendment = $body_amendment / 4.0;
         if (isset($body_amendment)) {
             $body_amendment = round($body_amendment, 0, PHP_ROUND_HALF_UP);
             //average for 4 zones w/o title
             $bodies[$unit] += $body_amendment;
             if ($bodies[$unit] < 0) {
                 $bodies[$unit] = 0;
             }
         }
         //correct the body amount with average amendment
     }
     return [$combined_result, $bodies];
 }
Example #2
0
 public function substract($rest, $unit)
 {
     $lemmatizator = new Lemmatizator();
     $norm_rest = str_replace(" - FORMS", "", $lemmatizator->makeUnitNormal($rest));
     $norm_unit = str_replace(" - FORMS", "", $lemmatizator->makeUnitNormal($unit));
     $rest_arr_normals = array_diff(explode(" ", $norm_rest), explode(" ", $norm_unit));
     $rest_arr = array_combine(explode(" ", $norm_rest), explode(" ", $rest));
     $new_rest = "";
     foreach ($rest_arr_normals as $norm) {
         $new_rest .= " " . $rest_arr[$norm];
     }
     return $new_rest;
 }