/**
  *  Funkce, která projde finalArr a pokud jsou uvedené hodnoty pro A i B, tak mezi nimi najde identické a ty přesune do mappedValues
  */
 private function mapValues($finalArr)
 {
     if (count($finalArr) > 0) {
         foreach ($finalArr as $key => $arr) {
             //projdeme cele finalArr
             if (isset($arr['valuesA']) && isset($arr['valuesB'])) {
                 if (!count($arr['valuesA'] > 0) && count($arr['valuesB'] > 0)) {
                     continue;
                 }
                 //máme definované hodnoty pro A i B => můžeme je porovnávat
                 $ngramsArrA = $this->generateNgrams($arr['valuesA']);
                 $sizesArrA = $this->generateSizes($ngramsArrA);
                 $ngramsArrB = $this->generateNgrams($arr['valuesB']);
                 $sizesArrB = $this->generateSizes($ngramsArrB);
                 /*samotné mapování ngramových vektorů*/
                 foreach ($ngramsArrA as $keyA => $ngramA) {
                     $maxSimilarityValue = -1;
                     $maxSimilarityKey = '';
                     foreach ($ngramsArrB as $keyB => $ngramB) {
                         $value = StringClass::getTrigramsSimilarity($ngramA, $sizesArrA[$keyA], $ngramB, $sizesArrB[$keyB]);
                         if ($value > $maxSimilarityValue) {
                             $maxSimilarityValue = $value;
                             $maxSimilarityKey = $keyB;
                         }
                     }
                     if ($maxSimilarityValue > 0) {
                         /*ulozeni naparovani dle podobnosti*/
                         $valueA = $arr["valuesA"][$keyA];
                         $valueB = $arr["valuesB"][$maxSimilarityKey];
                         if (!@in_array($valueA, $finalArr[$key]['mappedValues'][$valueA])) {
                             //budeme to resit jen v okamziku, kdy nemame dany par v uzivatelem namapovanych hodnotach
                             if (!isset($finalArr[$key]['autoMappedValues'])) {
                                 $finalArr[$key]['mappedValues'] = array();
                             }
                             $finalArr[$key]['autoMappedValues'][$valueA] = array($valueB);
                         }
                         /**/
                     }
                 }
                 /**/
             }
         }
     }
     return $finalArr;
 }
示例#2
0
 /**
  *  Funkce pro zjištení podobnosti výčtových sloupců na základě trigramů
  */
 private function matchTrigrams($column1, $column2, $coverage = false)
 {
     $colATrigramsArr = StringClass::getTrigramsArr($this->getValues($column1));
     $col2name = (string) $column2->name . (isset($column2->formatName) ? '###' . (string) $column2->formatName : '');
     if (!isset($this->xml2trigramsArr[$col2name])) {
         //zatím nemáme určené trigramy pro sloupec ze druhého souboru
         $this->xml2trigramsArr[$col2name] = StringClass::getTrigramsArr($this->getValues($column2));
         $this->xml2trigramsSizeArr[$col2name] = StringClass::getVectorSize($this->xml2trigramsArr[$col2name]);
     }
     if ($coverage) {
         return StringClass::getTrigramsCoverage($colATrigramsArr, StringClass::getVectorSize($colATrigramsArr), $this->xml2trigramsArr[$col2name], $this->xml2trigramsSizeArr[$col2name]);
     } else {
         return StringClass::getTrigramsSimilarity($colATrigramsArr, StringClass::getVectorSize($colATrigramsArr), $this->xml2trigramsArr[$col2name], $this->xml2trigramsSizeArr[$col2name]);
     }
 }