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