/** * Funkce pro spočítání velikostí u všech vektorů */ private function generateSizes($ngramsArr) { $outputArr = array(); foreach ($ngramsArr as $key => $ngram) { $outputArr[$key] = StringClass::getVectorSize($ngram); } return $outputArr; }
/** * 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 foreach ($arr['valuesA'] as $keyA => $valueA) { $maxSimilarityValue = -1; $maxSimilarityKey = ''; foreach ($arr['valuesB'] as $keyB => $valueB) { $similarity = StringClass::similarity($this->valuesMapArr[$valueA], $this->valuesMapArr[$valueB]); if ($similarity > $maxSimilarityValue) { $maxSimilarityValue = $similarity; $maxSimilarityKey = $keyB; } } if ($maxSimilarityValue > 0) { $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]); } }
/** * Funkce vracející hodnotu kosínovy míry podobnosti vektorů - pro pokrytí vektoru z PMML vektorem v BKEF */ public static function getTrigramsCoverage($arr1, $size1, $arr2, $size2) { if ($size1 == 0 || $size2 == 0) { return 0; } return StringClass::getScalarProduct($arr1, $arr2) / ($size1 * $size1); //NERESIT! }